我正在使用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"),
实现所需输出的正确方法是什么?
答案 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
,只要XmlWriter
和XElement.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。