【发布时间】:2012-12-06 11:23:37
【问题描述】:
如何将“XML Base”属性/命名空间 (http://en.wikipedia.org/wiki/XML_Base) 插入 XElement 或 XDocument 的根目录?
<feed xml:base="someurl.com">...</feed>
并且,这样做不会弄乱整个 XElement(例如,通过它尝试在其他任何地方插入相同的内容或一些相关的疯狂副作用)。
【问题讨论】:
-
(从我的头顶)你试过
element.Root.SetAttribute(XNamespace.Xml + "base", "someurl.com")吗? -
先生……你太棒了!是的,这行得通。 (随着 XElement x - x.SetAttributeValue(XNamespace.Xml + "base", "someurl.com"); 的变化)(注意:'Value')。请张贴作为答案。但是,当您使用它时,...有没有办法对简单的 xmlns(未命名)做同样的事情,我只需要一个根默认 xmlns,如下所示:
。重要的是我不希望它在任何后代元素中填充该命名空间......这就是我讨厌 XElement 中的命名空间的原因。非常感谢。 -
我的问题是“不要将命名空间填充到后代元素”是什么意思。您是否希望后代元素位于此命名空间中但没有自己的 xmlns 属性,或者您只希望给定元素位于命名空间中但后代元素应位于空命名空间中?无论如何,没有一个简单的方法可以做到这一点。您可能注意到 XName 属性(包括 NamespaceName)是只读的。更改命名空间有效地更改了元素的名称(可能还有所有后代),因此如果不重新创建元素是不可能的
-
谢谢帕维尔。我认为不幸的是,由于 Linq to Xml 的一个重大缺点,它不允许使用默认命名空间,而不会让人经历不得不在任何地方添加它的荒谬喧嚣。现在,当您必须添加的不仅仅是默认命名空间时,它们对您来说非常有用。问题是,在大量文档中,您必须在顶部指定 1 个命名空间。突然之间,这意味着你不能像以前那样简单地构建东西。但是真正的 XML 确实允许默认命名空间(后代继承)!所以在这方面,他们并不忠实于 XML。
-
有两种设置命名空间的方法 - 您可以使用 xmlns 在这种情况下,所有后代元素(但不是属性)都将派生它并属于这个命名空间,直到它被重新定义(如果你想重置为空命名空间,您只需将 xmlns="" 添加到元素)或 - 如果您希望只有一个特定元素属于某个非空命名空间 - 您可以将命名空间 Uri 绑定到命名空间前缀(通过使用 xsmlns:ns1 ="{my-namespace-uri}" 在元素本身或文档元素上)并使用 ns1:{elementName} 表示法将单个元素放入此命名空间。
标签: xml linq-to-xml xelement