将 alias/prefix 添加到现有的 XML 命名空间
Add alias/prefix to existing XML namespace
如何转换以下内容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
实际上,我想为第二个命名空间添加别名,并为所有还没有前缀的元素添加前缀。
我能找到的所有信息都是如何删除或添加命名空间,但没有关于如何添加 prefix/alias。
应该是这样的:
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"
。我们跳过这个。
如何转换以下内容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
实际上,我想为第二个命名空间添加别名,并为所有还没有前缀的元素添加前缀。
我能找到的所有信息都是如何删除或添加命名空间,但没有关于如何添加 prefix/alias。
应该是这样的:
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"
。我们跳过这个。