抑制XML元素中的空白名称空间

时间:2015-01-19 17:34:11

标签: xml c#-4.0

我正在创建一个XML元素。我希望Xmlns信息出现在父元素中,但在任何子元素中都没有引用。为了实现这一点,我使用以下代码:

XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance";
XNamespace xsd = "http://www.w3.org/2001/XMLSchema";
XNamespace xns = "http://tv2.microsoft.com/test/jobscheduler";
var xroot = new XElement(xns + "Constraints", new XAttribute(XNamespace.Xmlns + "xsd", xsd.NamespaceName), new XAttribute(XNamespace.Xmlns + "xsi", xsi.NamespaceName));
var keyElement = new XElement("Keys");
var kElement = new XElement("K");
kElement.Value = "HDD";
keyElement.Add(kElement);
xroot.Add(keyElement);
xroot.Add(new XElement("Properties"));
xroot.Add(new XElement("MustIncludeKeys"));

我得到的是:

<Constraints xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tv2.microsoft.com/test/jobscheduler">
  <Keys xmlns="">
    <K>HDD</K>
  </Keys>
  <Properties xmlns="" />
  <MustIncludeKeys xmlns="" />
</Constraints>

我想要的是:

<Constraints xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tv2.microsoft.com/test/jobscheduler">
  <Keys>
    <K>HDD</K>
  </Keys>
  <Properties />
  <MustIncludeKeys />
</Constraints>

如何摆脱无关(空白)名称空间“xmlns =”“”?我已经尝试过keyElement.ReplaceAttributes(“”),甚至尝试使用System.Xml命名空间来使用RemoveAttribute方法 - 无济于事。

2 个答案:

答案 0 :(得分:0)

  

我正在创建一个XML元素。我希望Xmlns信息出现在父元素中,但在任何子元素中都没有引用

这意味着你希望子元素与父元素设置的默认命名空间位于同一个命名空间中...所以你应该明确地这样做,否则它们将在“空”命名空间中(这将是在XML中出现xmlns=""

var keyElement = new XElement(xns + "Keys");
...

请注意,您可以在一个语句中轻松完成整个XML生成:

var xroot = new XElement(xns + "Constraints",
    new XAttribute(XNamespace.Xmlns + "xsd", xsd.NamespaceName),
    new XAttribute(XNamespace.Xmlns + "xsi", xsi.NamespaceName),
    new XElement(xns + "Keys",
        new XElement(xns + "K", "HDD")
    ),
    new XElement(xns + "Properties"),
    new XElement(xns + "MustIncludeKeys")
);

基本上,您需要知道子元素从其父元素继承默认命名空间,除非它们指定不同的命名空间。请注意,此不会与属性一起发生。

答案 1 :(得分:0)

您需要将xns名称空间添加到所有元素:

XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance";
XNamespace xsd = "http://www.w3.org/2001/XMLSchema";
XNamespace xns = "http://tv2.microsoft.com/test/jobscheduler";
var xroot = new XElement(xns + "Constraints", new XAttribute(XNamespace.Xmlns + "xsd", xsd.NamespaceName), new XAttribute(XNamespace.Xmlns + "xsi", xsi.NamespaceName));
var keyElement = new XElement( xns + "Keys");
var kElement = new XElement(xns + "K");
kElement.Value = "HDD";
keyElement.Add(kElement);
xroot.Add(keyElement);
xroot.Add(new XElement(xns + "Properties"));
xroot.Add(new XElement(xns + "MustIncludeKeys"));