xml ファイルがあります。属性を検索し、その値を c# を使用して何らかの値に置き換える必要があります。さらに、この属性が何回来て、この xml が動的に生成されるときに要素がいくつあるかわかりません。これについて何か助けはありますか?
1 に答える
1 つの方法は、ドキュメントをインスタンスにロードし、XPath 式でインスタンスのメソッドをSystem.Xml.XmlDocument
使用してそれぞれの属性のすべてのオカレンスを検索し、それに応じて変更することです。SelectNodes
XmlDocument
次に例を示します。
次の Xml ドキュメントがあるとします。
<?xml version="1.0"?>
<test>
<a/>
<b myAttribute="someValue"/>
<c myAttribute="someOtherValue"/>
<d/>
<e>
<f myAttribute="yetAnotherValue" anotherAttribute="anIrrelevantValue"/>
</e>
</test>
XML ドキュメントを として保存しますtest.xml
。同じディレクトリで、次のプログラムをコンパイルします。呼び出されるすべての属性の値を変更しますmyAttribute
(XPath 式によって選択されます//@myAttribute
)。
using System;
using System.Xml;
class Program
{
public static void Main(string[] args)
{
XmlDocument doc = new XmlDocument();
doc.Load("test.xml");
Console.WriteLine("Before:");
Console.WriteLine(doc.OuterXml);
foreach (XmlNode node in doc.SelectNodes("//@myAttribute")) {
node.Value = "new value";
}
Console.WriteLine("After:");
Console.WriteLine(doc.OuterXml);
doc.Save("test.xml");
Console.ReadLine();
}
}
(便宜上、変更前後の Xml ドキュメントも出力します。)
名前空間あり
現在、この例は名前空間 (OP によって要求された XLink のもの) で拡張されています。
XML ファイル:
<?xml version="1.0"?>
<test xmlns:xlink="http://www.w3.org/1999/xlink">
<a/>
<b xlink:myAttribute="someValue"/>
<c myAttribute="someOtherValue"/>
<d/>
<e>
<f xlink:myAttribute="yetAnotherValue" anotherAttribute="anIrrelevantValue"/>
</e>
</test>
C# コード:
using System;
using System.Xml;
class Program
{
public static void Main(string[] args)
{
XmlDocument doc = new XmlDocument();
doc.Load("test.xml");
Console.WriteLine("Before:");
Console.WriteLine(doc.OuterXml);
XmlNamespaceManager nsMgr = new XmlNamespaceManager(doc.NameTable);
nsMgr.AddNamespace("xlink", "http://www.w3.org/1999/xlink");
foreach (XmlNode node in doc.SelectNodes("//@xlink:myAttribute", nsMgr)) {
node.Value = "new value";
}
Console.WriteLine("After:");
Console.WriteLine(doc.OuterXml);
doc.Save("test.xml");
Console.ReadLine();
}
}
注意 1: 呼び出された属性の 2 つのオカレンスのみmyAttribute
が現在変更されていることに注意してください。3 つ目 (<c>
要素内) は、XPath 式で示されている名前空間に属していません。
注意 2: Xml ファイルと C# コードで使用される名前空間プレフィックスはたまたま同じですxlink
が ( )、これは必須ではありません。たとえば、xl
代わりに C# コードで を使用して、同じ結果を得ることができます (変更された行のみを表示します)。
nsMgr.AddNamespace("xl", "http://www.w3.org/1999/xlink");
foreach (XmlNode node in doc.SelectNodes("//@xl:myAttribute", nsMgr)) {