【发布时间】:2017-07-21 20:33:44
【问题描述】:
我一直在尝试用 C# 编写一个实用程序,它接受一个 XML 文件,从标签中删除 xmlns 属性,在根标签中设置这些属性的前缀,然后在标签中使用这些前缀。
源 XML 文件:
<?xml version="1.0" encoding="utf-8"?>
<Main version="1.0" xmlns="urn:root:v1">
<Report>
<Title>Some Value</Title>
</Report>
<Content>
<Address>
<CountryName xmlns="urn:location:v2">Australia</CountryName>
</Address>
</Content>
</Main>
目标 XML 文件:
<?xml version="1.0" encoding="utf-8"?>
<root:Main version="1.0" xmlns:root="urn:root:v1" xmlns:loc="urn:location:v2">
<root:Report>
<root:Title>Some Value</root:Title>
</root:Report>
<root:Content>
<root:Address>
<loc:CountryName>Australia</loc:CountryName>
</root:Address>
</root:Content>
</root:Main>
我已经设法通过以下代码实现了其中的一部分。我已经用根前缀替换了所有没有属性的标记,并将 xmlns 属性添加到根标记,但从 CountryName 标记中删除 xmlns 属性并改用前缀并没有成功。
XDocument doc = XDocument.Load(@"C:\Temp\Source.xml");
var content = XElement.Parse(doc.ToString());
content.Attributes("xmlns").Remove();
content.Add(new XAttribute(XNamespace.Xmlns + "root", "urn:root:v1"));
content.Add(new XAttribute(XNamespace.Xmlns + "loc", "urn:location:v2"));
foreach (var node in doc.Root.Descendants().Where(n => n.Name.NamespaceName == "urn:location:v2"))
{
node.Attribute("xmlns").Remove();
node.Add(new XAttribute(XNamespace.Xmlns + "loc", "urn:location:v2"));
}
content.Save(@"C:\Temp\Target.xml");
任何帮助将不胜感激 - 谢谢!
【问题讨论】:
-
您尝试从 doc 的后代节点中删除属性,但将内容保存到您未更改的文件中。所以你只需要把
doc.Root.Descendants()改成content.Descendants() -
@GeorgeAlexandria 谢谢 - 几乎完成了!我仍然想摆脱
xmlns:loc="urn:location:v2"。有任何想法吗?<loc:CountryName xmlns:loc="urn:location:v2">Australia</loc:CountryName> -
不要在循环中添加新属性。
-
@GeorgeAlexandria 搞定了!谢谢!
标签: c# xml xml-parsing xml-namespaces prefix