我一直在嘗試在C#中編寫一個實用程序,它需要一個XML文件,從標記中移除xmlns屬性,在根標記中設置這些屬性的前綴,然後在標記中使用這些前綴。如何用前綴替換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」'。有任何想法嗎? ' Australia loc:CountryName>' –
Acewave
不要在循環中添加新屬性。 –