C# 如何向现有xml文档添加xmlns属性

C# 如何向现有xml文档添加xmlns属性,c#,linq-to-xml,xml-namespaces,C#,Linq To Xml,Xml Namespaces,我有现有的xml文档 e、 g 当我尝试这个时: xml.Root.SetAttributeValue("xmlns", "http://namespaceuri"); 我有个例外: System.Xml.XmlException: The prefix '' cannot be redefined from 'http://namespaceuri' to within the same start element tag. 谢谢您还需要将名称设置在名称空间中: XNamespace n

我有现有的xml文档

e、 g

当我尝试这个时:

xml.Root.SetAttributeValue("xmlns", "http://namespaceuri");
我有个例外:

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

谢谢

您还需要将名称设置在名称空间中:

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>

你想完成什么?您正在尝试更改
Test
A
元素的名称空间吗?不,我只想向根元素添加xmlns属性。Jon的答案解决了我的问题。Jon的答案更改了元素的名称空间,这是正确的。当我将xmlns添加到xml时,它是一个默认名称空间,因此文档中的所有元素都将使用这个默认名称空间。是的,这就是我要问的。您想更改现有元素的名称空间。
XNamespace ns = "http://namespaceuri";
foreach (var element in xml.Descendants().ToList())
{
    element.Name = ns + element.Name.LocalName;
}
xml.Root.SetAttributeValue("xmlns", ns.ToString());
<Test xmlns="http://namespaceuri">
  <A />
</Test>
foreach (var element in xml.Descendants()
                           .Where(x => x.Name.Namespace == XNamespace.None)
                           .ToList())