2011-06-20 10 views
1

のは、私はこのようなファイルがあるとしましょう属性:上書き特定のXMLが

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

基本的に私が何をしたいのか、この(擬似コード)、(ここでは2.0を.NETに制約)C#で、次のとおりです。

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

わずかに有望なこれらの2つのルック:を(ディスク上の)完全な、xmlファイルは次のようになります

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

Overwrite a xml file value

Setting attributes in an XML document

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


私はその間にこのコードを書いている:ここで

は作品より、最小限のケースです:出発点として

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); 
     } 
    } 
+2

から実行できるサンプルスクリプトは、あなたがこれまでに何をしようとしたのですか? –

+0

レビュー編集... – user787747

答えて

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(); 
+0

これは編集で書いたのと似ています。 – user787747

0

あなたがしようとしているものを私たちに示すことができ、あなたは可能性がありXPATHを使用して変更するノードを選択し、xpathの属性値で選択したノードを検索します。

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

+0

編集編集... – user787747

2

XmlTextReader/XmlTextWriterのループを使用するのが最速の解決策です。そうすれば、xml全体をメモリにロードする必要はありません。擬似コードで

あなたは check here for ideasでき
while (reader.read) 
{ 
    if (reader.Node.Name == "nodex") 
     ...... 

    writer.write ... 
} 

。ここで

関連する問題