这听起来像许多人会有的查询,但经过几个小时的搜索,我甚至找不到解决这个问题的问题。
我正在使用LINQ2Xml类来生成XML文档。我正在使用许多名称空间,并且节点是动态创建的,因此无法使用漂亮的新XElement(“abc”,new XElement ...))格式声明。
以下是一个例子:
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());
上面的代码产生以下输出:
<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>
然而,我希望输出更类似于以下(E&amp; OE),其中所有namesapce声明都位于顶部,而不是位于每个元素上。
<el1 xmlns="scheme://ns1" xmlns:ns2="scheme://ns2" xmlns:ns3="scheme://ns3" xmlns:ns4="scheme://ns4">
<ns2:el2 >
<ns1:el5 />
</ns2:el2>
....
</el1>
我已经尝试过以下几点没有区别了:
IEnumerable<XAttribute> allNs = doc.Root.Descendants().Attributes().Where(a => a.IsNamespaceDeclaration);
int i = 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));
推理:我希望一个文件可能有多达几十个名称空间,每个文件夹有几百个元素。每个命名空间的uri大概可能是50个字符,因此我只会通过声明命名空间一次来保存数千个字符。此外,它看起来更好!
任何人都知道如何做到这一点?
答案 0 :(得分:1)
将其他名称空间作为属性添加到根元素:
XElement el1 = new XElement(ns1 + "el1",
new XAttribute(XNamespace.Xmlns + "ns2", ns2),
new XAttribute(XNamespace.Xmlns + "ns3", ns3),
new XAttribute(XNamespace.Xmlns + "ns4", ns4));
输出:
<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>