如何将xmlns属性添加到现有的xml文档中

时间:2013-07-18 18:00:34

标签: c# linq-to-xml xml-namespaces

我有现有的xml文档。

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 个答案:

答案 0 :(得分: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>

请注意,此代码将更改所有元素的命名空间。如果您想要更具选择性,则应在Where来电后添​​加xml.Descendants()来电,例如

foreach (var element in xml.Descendants()
                           .Where(x => x.Name.Namespace == XNamespace.None)
                           .ToList())