如何为 XDocument 指定 xmlns?

Posted

技术标签:

【中文标题】如何为 XDocument 指定 xmlns?【英文标题】:How to specify an xmlns for XDocument? 【发布时间】:2013-02-12 19:59:50 【问题描述】:

我试过了:

textBox1.Text = new XDocument(new XDeclaration("1.0", "UTF-8", "yes"),
    new XElement("root1", new XAttribute( "xmlns", @"http://example.com"), new XElement("a", "b"))
).ToString();

但我明白了:

The prefix '' cannot be redefined from '' to 'http://example.com' within the same start element tag.

我也尝试过替换(根据我找到的答案):

XAttribute(XNamespace.Xmlns,...

但也出现了错误。

注意:我不想在文档中包含多个 xmlns。

【问题讨论】:

也许这对你有用:***.com/a/2874572/1373170 【参考方案1】:

XDocument API 使用命名空间范围名称的方式是 XName 实例。只要您接受 XML 名称不仅仅是一个字符串,而是一个作用域标识符,它们就很容易使用。这是我的做法:

var ns = XNamespace.Get("http://example.com");
var doc = new XDocument(new XDeclaration("1.0", "utf-8", null));
var root = new XElement(ns + "root1", new XElement(ns + "a", "b"));
doc.Add(root);

结果:

<root1 xmlns="http://example.com">
    <a>b</a>
</root1>

请注意,+ 运算符被重载以接受 XNamespaceString 以生成 XName 实例。

【讨论】:

谢谢。似乎很奇怪,不会有一种简单的方法来只添加一次命名空间。 嗯,我认为这相当简单,而且它确实让您明白您所做的是创建命名空间名称,而不仅仅是字符串。如果你想要更少的命名空间代码,System.Xml.XmlDocument 类使用命名空间管理器来跟踪根命名空间,一旦你设置正确,你可以假装它不存在。 查看我的下一个问题:***.com/questions/14841517/… - 我也在尝试XmlDocument,但没有帮助。 @Sam - 如果所有子元素都具有相同的命名空间,那么当您将 XML 文档转换为字符串时,输出机制可以选择省略子元素上的命名空间声明。因此,如果您在子元素上看到 xmlns,请检查您的输出方式。此外,元素上命名空间属性的存在不应影响 XML 文档的实际含义。 是的,经过一番折腾,我设法添加了命名空间,使输出机制按我想要的方式工作。

以上是关于如何为 XDocument 指定 xmlns?的主要内容,如果未能解决你的问题,请参考以下文章

为 XDocument 指定默认命名空间会给出空值

有没有办法将默认命名空间设置为从 XDocument 查询?

使用 C# 和 XDocument/XElement 解析 Soap 响应

如何为@Valid 指定验证组?

如何为 Jcrop 'setSelect' 选项指定自定义值?

如何为 spectrify python 包指定 s3 配置?