2011-06-20 79 views
1

比方說,我有一個這樣的文件:覆蓋特定的XML屬性

<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> 

這兩個看起來稍微有前途:

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。

僞代碼:

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

    writer.write ... 
} 

你可以check here for ideas