不是命名空间的 C# XAttribute

Posted

技术标签:

【中文标题】不是命名空间的 C# XAttribute【英文标题】:C# XAttribute that is not a namespace 【发布时间】:2018-04-19 07:17:42 【问题描述】:

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

正在尝试获取此输出:

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

这是我尝试过的,但由于“:”而引发异常

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

...

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

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

【问题讨论】:

【参考方案1】:

您必须将"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,只要在构造过程中正确设置了 XElement.Name.NamespaceXAttribute.Name.NamespaceXmlWriter 就会自动执行此操作。

这是使 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 fiddle 示例here。

【讨论】:

这似乎产生了
w3.org/2001/XMLSchema-instance"></Details> 接收应用程序已经正确解释了数据。
@Quantum_Kernel - 在这种情况下,可能在更高级别的范围内有一个xmlns:p2="..."。当自动分配命名空间时,XmlWriter 将添加一个新前缀,而不是在范围内重新定义一个。 无论如何,接收应用程序已经正确解释了数据。 -- 很好,然后它被正确实现并根据它们的实际名称空间 URI 解析 XML 元素。来自XML namespace:应用程序应避免对前缀的选择附加任何意义

以上是关于不是命名空间的 C# XAttribute的主要内容,如果未能解决你的问题,请参考以下文章

命名空间“系统”中不存在类型或命名空间名称“事务”(您是不是缺少程序集引用?) - C# ASP.NET

C#提示未能找到类型或命名空间名称”Renderer“(是不是缺少 using 指令或程序集引用)怎么解决?

C# - 在共享命名空间中跨文件使用命名空间

C#中如何获得指定命名空间中所有自定义类的信息

C# 未能找到类型或命名空间名称“Form1”(是不是缺少 using 指令或程序集引用?)

C# 命名空间别名 - 有啥意义?