抑制XML元素中的空白命名空间
我正在创建一个XML元素。我希望Xmlns信息出现在父元素中,但在任何子元素中都没有引用。为了实现这一点,我使用以下代码:抑制XML元素中的空白命名空间,xml,c#-4.0,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
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方法,但都没有效果
我正在创建一个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")
);
基本上,您需要知道子元素从父元素继承默认名称空间,除非它们指定不同的名称空间。请注意,属性不会发生这种情况。您需要将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"));
谢谢你,乔恩!这么简单。。。但是很难找到。谢谢你提供的属性信息!