繁体   English   中英

LINQ2XML将所有名称空间声明移至根元素

[英]LINQ2XML Moving all namespace declarations to root element

这听起来像很多人的查询,但是经过数小时的搜索,我什至找不到解决该问题的问题。

我正在使用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&OE),其中所有名称空间声明都位于顶部,而不是位于每个元素上。

<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个字符,这样,我只需声明一次名称空间即可节省数千个字符。 此外,它看起来更好!

有人知道该怎么做吗?

将其他名称空间作为属性添加到根元素:

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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM