1

次のようなファイルがあるとします。

<outer>
  <inner>
    <nodex attr="value1">text</attr>
    <nodex attr="value2">text</attr>
  </inner>
</outer>

基本的に私がやりたいことは、C#(ここでは.net 2.0に制限されています)で、これ(疑似コード)です:

foreach node
    if(node eq 'nodex')
        update attr to newvalue

完了すると、xml ファイル (ディスク上) は次のようになります。

<outer>
  <inner>
    <nodex attr="newvalue1">text</attr>
    <nodex attr="newvalue2">text</attr>
  </inner>
</outer>

これらの 2 つはわずかに有望に見えます。

xml ファイルの値を上書きする

XML ドキュメントでの属性の設定

しかし、彼らが実際に私の質問に答えているかどうかは不明です。


その間、私はこのコードを書きました:

動作するより最小限のケースを次に示します。

    public static void UpdateXML()
    {
        XmlDocument doc = new XmlDocument();
        using (XmlReader reader = XmlReader.Create("XMLFile1.xml"))
        {
            doc.Load(reader);
            XmlNodeList list = doc.GetElementsByTagName("nodex");
            foreach (XmlNode node in list)
            {
                node.Attributes["attr"].Value = "newvalue";
            }
        }
        using (XmlWriter writer = XmlWriter.Create("XMLFile1.xml"))
        {
            doc.Save(writer);
        }
    }
4

3 に答える 3

2

最速の解決策は、XmlTextReader / XmlTextWriterでループを使用することです。そうすれば、xml 全体をメモリにロードする必要がなくなります。

擬似コード:

while (reader.read)
{
   if (reader.Node.Name == "nodex")
       ......

   writer.write ...
}

ここでアイデアを確認できます。

于 2011-06-20T22:35:52.040 に答える
1

LinqPadから実行できるサンプル スクリプトを次に示します。

var x = @"<outer>
  <inner>
    <nodex attr=""value1"">text</nodex>
    <nodex attr=""value2"">text</nodex>
  </inner>
</outer>";

XmlDocument doc = new XmlDocument();
doc.LoadXml(x);

foreach (XmlNode n in doc.SelectNodes("//nodex"))
{
    n.Attributes["attr"].Value = "new" + n.Attributes["attr"].Value.ToString();
}

doc.OuterXml.Dump();
于 2011-06-20T22:42:17.400 に答える
0

開始点として、試したことを示すことができます。XPATH を使用して、変更するノードを選択し、xpath の属性値で選択ノードを検索できます。

更新するノードが見つかったら、必要に応じて通常の割り当てで属性値を再割り当てできます。

于 2011-06-20T22:34:26.583 に答える