如何向现有的XML文档添加xmlns属性

3

I have existing xml document.

e.g

<Test>
  <A />
</Test>

我将这个xml加载到XDocument中。 我需要向此文档添加属性xmlns,并将其保存带有此属性的文件。

var xml = new XDocument.Load("c:\\filePath.xml");

当我尝试这样做时:

xml.Root.SetAttributeValue("xmlns", "http://namespaceuri");

我得到了异常:

System.Xml.XmlException: The prefix '' cannot be redefined from 'http://namespaceuri' to  within the same start element tag.

谢谢


1
你想要达到什么目的?你是想要改变 TestA 元素的命名空间吗? - John Saunders
不,我只想在根元素中添加xmlns属性。Jon的答案解决了我的问题。 - zosim
Jon的回答更改了元素的命名空间。 - John Saunders
是的,这是正确的。当我在 XML 中添加 xmlns 时,它是一个默认命名空间,因此文档中的所有元素都将使用此默认命名空间。 - zosim
是的,这就是我所问的。你想更改现有元素的命名空间。 - John Saunders
1个回答

7
您需要将名称设置为命名空间中的一部分:
XNamespace ns = "http://namespaceuri";
foreach (var element in xml.Descendants().ToList())
{
    element.Name = ns + element.Name.LocalName;
}
xml.Root.SetAttributeValue("xmlns", ns.ToString());

基本上,您正在尝试将所有元素移到该命名空间,并使其成为根元素以下的默认命名空间。您不能在将元素本身保留在不同但未经限定的命名空间的同时更改默认命名空间。
使用上面的代码和您的示例XML(以修复关闭A)得到:
<Test xmlns="http://namespaceuri">
  <A />
</Test>

请注意,此代码将更改所有元素的命名空间。如果您想更具选择性,应在xml.Descendants()调用后添加Where调用,例如:
foreach (var element in xml.Descendants()
                           .Where(x => x.Name.Namespace == XNamespace.None)
                           .ToList())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接