c# - LINQ2XML Moving all namespace declarations to root element -


this sounds query many have after hours of searching can't find question addressing problem.

i'm using linq2xml classes generate xml document. i'm using number of namespaces , nodes created dynamically can't declared using nice new xelement("abc",new xelement...)) format.

here's example:

xnamespace ns1 = "scheme://ns1"; xnamespace ns2 = "scheme://ns2"; xnamespace ns3 = "scheme://ns3"; xnamespace ns4 = "scheme://ns4";  xelement el1 = new xelement(ns1 + "el1"); xelement el2 = new xelement(ns2 + "el2"); xelement el3 = new xelement(ns3 + "el3"); xelement el4 = new xelement(ns4 + "el4");  xelement el5 = new xelement(ns1 + "el5"); xelement el6 = new xelement(ns1 + "el5"); xelement el7 = new xelement(ns1 + "el5");  el4.add(el7); el3.add(el6); el2.add(el5);  el1.add(el2); el1.add(el3); el1.add(el4);  xdocument doc = new xdocument(el1); debug.write(doc.tostring()); 

the above code produces following output:

<el1 xmlns="scheme://ns1">   <el2 xmlns="scheme://ns2">     <el5 xmlns="scheme://ns1" />   </el2>   <el3 xmlns="scheme://ns3">     <el5 xmlns="scheme://ns1" />   </el3>   <el4 xmlns="scheme://ns4">     <el5 xmlns="scheme://ns1" />   </el4> </el1> 

whereas, have output more akin following (e&oe) namesapce declarations sit @ top , not on every element.

<el1 xmlns="scheme://ns1" xmlns:ns2="scheme://ns2" xmlns:ns3="scheme://ns3" xmlns:ns4="scheme://ns4">     <ns2:el2 >         <ns1:el5 />     </ns2:el2>     .... </el1> 

i have tried following makes absolutely no difference:

ienumerable<xattribute> allns = doc.root.descendants().attributes().where(a => a.isnamespacedeclaration); int = 0; foreach (string uri in allns.select(a => a.value).distinct()) {     string prefix = "ns" + ++i;     doc.root.add(new xattribute(xnamespace.xmlns + prefix, uri)); } debug.write(doc.tostring(saveoptions.omitduplicatenamespaces)); 

reasoning: expect file have maybe few dozen namespaces , several hundred elements each. uri each namespace maybe 50 characters long such, saving thousands of characters declaring namespaces once. additionally, looks nicer!

anyone know how done?

add other namespaces attributes root element:

xelement el1 = new xelement(ns1 + "el1",      new xattribute(xnamespace.xmlns + "ns2", ns2),     new xattribute(xnamespace.xmlns + "ns3", ns3),     new xattribute(xnamespace.xmlns + "ns4", ns4)); 

output:

<el1 xmlns:ns2="scheme://ns2" xmlns:ns3="scheme://ns3" xmlns:ns4="scheme://ns4" xmlns="scheme://ns1">   <ns2:el2>     <el5 />   </ns2:el2>   <ns3:el3>     <el5 />   </ns3:el3>   <ns4:el4>     <el5 />   </ns4:el4> </el1> 

Comments