C#XAttribute不是命名空间

时间:2018-04-19 07:17:43

标签: c# xml

我正在使用C#中的XDocument类编写XML文档。

试图获得此输出:

<Details xmlns:p2="http://www.w3.org/2001/XMLSchema-instance" p2:type="SomeStuff"></Details>

这是我尝试过的,但由于&#34;:&#34;

,它会引发异常
XNamespace ns = "http://www.w3.org/2001/XMLSchema-instance";

...

new XElement("Details", new XAttribute(XNamespace.Xmlns + "p2", ns), new XAttribute("p2:type", "SomeStuff"),

实现所需输出的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

您必须将"type"添加到实际命名空间URI "http://www.w3.org/2001/XMLSchema-instance",而不是添加到命名空间前缀,如下所示:

XNamespace ns = "http://www.w3.org/2001/XMLSchema-instance";

var element = new XElement("Details", new XAttribute(ns + "type", "SomeStuff"));

此外,您可以完全跳过为名称空间URI /前缀映射添加XAttribute,只要XmlWriterXElement.Name.Namespace设置正确,XAttribute.Name.Namespace就会自动执行此操作在施工期间。

这是使LINQ to XML比XmlDocument更简单的事情之一 - 你可以完全忽略前缀,只能使用真正的命名空间URI,这既简单又更有可能产生正确的代码不依赖于命名空间前缀的选择。虽然如果您确实想要出于美观原因手动指定前缀,请参阅 How can I write xml with a namespace and prefix with XElement? ,其中指出了正确的方法:

var element = new XElement("Details", new XAttribute(XNamespace.Xmlns + "p2", ns), new XAttribute(ns + "type", "SomeStuff"));

导致:

<Details xmlns:p2="http://www.w3.org/2001/XMLSchema-instance" p2:type="SomeStuff" />

示例.Net小提琴here