1

xml ファイルがあります。属性を検索し、その値を c# を使用して何らかの値に置き換える必要があります。さらに、この属性が何回来て、この xml が動的に生成されるときに要素がいくつあるかわかりません。これについて何か助けはありますか?

4

1 に答える 1

3

1 つの方法は、ドキュメントをインスタンスにロードし、XPath 式でインスタンスのメソッドをSystem.Xml.XmlDocument使用してそれぞれの属性のすべてのオカレンスを検索し、それに応じて変更することです。SelectNodesXmlDocument

次に例を示します。

次の 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)) {
于 2012-06-06T11:46:18.383 に答える