将别名/前缀添加到现有XML命名空间

时间:2018-05-22 13:06:34

标签: c# xml xml-namespaces

如何转换以下XML

<root xmlns:xyz="do/not/change" xmlns="add/alias">
   <name>Test</name>
   <xyz:id>100<xyz:id>
</root>

<abc:root xmlns:xyz="do/not/change" xmlns:abc="add/alias">
   <abc:name>Test</abc:name>
   <xyz:id>100<xyz:id>
</abc:root>

在C#中使用XDocument

实际上,我想在第二个命名空间中添加一个别名,并将前缀添加到所有没有前缀的元素中。

我能找到的所有信息都是如何删除或添加命名空间,但没有关于如何添加前缀/别名的信息。

1 个答案:

答案 0 :(得分:4)

应该是这样的:

var xml = @"<root xmlns:xyz='do/not/change' xmlns='add/alias'>
   <name>Test</name>
   <xyz:id>100</xyz:id>
</root>";

var xdoc = XDocument.Parse(xml);

var xn = xdoc.Root.GetDefaultNamespace();
xdoc.Root.SetAttributeValue(XNamespace.Xmlns + "abc", xn.NamespaceName);
xdoc.Root.Attribute("xmlns").Remove();

foreach (var el in xdoc.Root.DescendantsAndSelf())
{
    if (el.Name.Namespace == xn)
    {
        el.Name = xn + el.Name.LocalName;
    }
}

请注意,如果没有定义默认名称空间,此代码将中断。

您可以添加以下支票:

if (xn.NamespaceName == string.Empty) ...

注2:从技术上讲,甚至属性都可以有名称空间,例如xyz:myattr="Hello"。我们正在跳过这个。