如何在子元素中删除空命名空间“xmlns =”“”?

时间:2012-04-18 08:14:41

标签: c# xml namespaces xml-namespaces

我有这个

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>

1 个答案:

答案 0 :(得分:3)

您的问题是您将文档的默认命名空间设置为“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),

您期望的样本输出,表明这两种选择的前者。