如何摆脱子元素中的空命名空间“xmlns=”“”

本文关键字:命名空间 xmlns 何摆脱 元素 | 更新日期: 2023-09-27 18:31:32

我有这个

XNamespace ns = "http://something0.com";
XNamespace xsi = "http://something1.com";
XNamespace schemaLocation = "http://something3.com";
XDocument doc2 = new XDocument(
    new XElement(ns.GetName("Foo"),
        new XAttribute(XNamespace.Xmlns + "xsi", xsi),
        new XAttribute(xsi.GetName("schemaLocation"), schemaLocation),
        new XElement("ReportHeader", GetSection()),
        GetGroup() 
    )
);

它给

<?xml version="1.0" encoding="utf-8"?>
<Foo xmlns:xsi="http://something1.com"
xsi:schemaLocation="http://something3.com" 
xmlns="http://something0.com">
    <ReportHeader xmlns="">
        ...
    </ReportHeader>
    <Group xmlns="">
        ...
    </Group>
</Foo>

但是我不想这个结果,怎么能做到呢?(请注意缺少xmlns=""

<?xml version="1.0" encoding="utf-8"?>
<Foo xmlns:xsi="http://something1.com"
xsi:schemaLocation="http://something3.com" 
xmlns="http://something0.com">
    <ReportHeader>
        ...
    </ReportHeader>
    <Group>
        ...
    </Group>
</Foo>

如何摆脱子元素中的空命名空间“xmlns=”“”

您的问题是您将文档的默认命名空间设置为"http://something0.com",但随后附加了不在此命名空间中的元素 - 它们位于命名空间中。

您的文档声明它的默认命名空间为 xmlns="http://something0.com",但随后您附加了空命名空间中的元素(因为您在追加它们时没有提供它们的命名空间) - 因此它们都被显式标记为 xmlns='' 以表明它们不在文档的默认命名空间中。

这意味着有两种解决方案可以摆脱 xmlns=",但它们有不同的含义:

1)如果您的意思是您肯定希望在根元素处xmlns="http://something0.com"(为文档指定默认命名空间) - 那么要"消失"xmlns=",您需要在创建元素时提供此命名空间:

// create a ReportHeader element in the namespace http://something0.com
new XElement(ns + "ReportHeader", GetSection())

2) 如果这些元素不在命名空间中 "http://something0.com",则不得将其添加为默认值 文档顶部(xmlns="http://something0.com" 位 根元素)。

XDocument doc2 = new XDocument(
     new XElement("foo",  // note - just the element name, rather  s.GetName("Foo")
          new XAttribute(XNamespace.Xmlns + "xsi", xsi),

您期望的示例输出建议这两个选项中的前者。