私は、XMLファイルを受け取り、タグからxmlns属性を削除し、ルートタグにこれらの属性の接頭辞を設定し、代わりにこれらの接頭辞を代わりに使用するC#でユーティリティを作成しようとしています。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> ' –
Acewave
ループに新しい属性を追加しないでください。 –