2013-01-25 55 views
0

當我嘗試更新XML文檔中的值時,不是編輯現有值,而是繼續使用新值插入新節點。編輯XML屬性導致創建新節點

如果已經試過這兩種方法具有相同的結果...

var doc = XDocument.Parse(xmlString); 

XElement shippingElement = (from xml2 in doc 
    .Elements("extradata").Elements("SharedCustomAppData") 
    .Elements("clsNameValues").Elements("clsnamevalue") 
where xml2.Element("name").Attribute("Value").Value == "SHOP_FLOOR_INSTR" 
select xml2).FirstOrDefault(); 

shippingElement.Element("value").Attribute("Value").Value = "Changed!"; 

而且

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.LoadXml(oLine.ExtraData); 
XmlNodeList nodes = xmlDoc.SelectNodes(
    "extradata/SharedCustomAppData/clsNameValues/clsnamevalue"); 

foreach (XmlNode node in nodes) 
{ 
XmlNode nameNode = node.SelectSingleNode("name"); 

if (nameNode != null && nameNode.Attributes["Value"].Value == "SHOP_FLOOR_INSTR") 
{ 
    XmlNode valueNode = node.SelectSingleNode("value"); 

    if (valueNode != null) 
    { 
     valueNode.Attributes["Value"].Value = line.SHOP_FLOOR_INSTR; 
    } 
} 
} 

XML的部分我想更新如下所示:

<SharedCustomAppData> 
    <clsNameValues> 
    <clsnamevalue> 
     <name Value="SHOP_FLOOR_INSTR" /> 
     <value Value="Current value" /> 
    </clsnamevalue> 
    </clsNameValues> 
</SharedCustomAppData> 
+0

你的Linq到Xml代碼在這個xml上工作正常。你能用* extradata *元素顯示整個xml嗎? –

回答

0

元素名稱不應該在賦值語句中是「名稱」而不是「值」嗎?

試試這個:

var doc = XDocument.Parse(xmlString); 

XElement shippingElement = (from xml2 in doc 
    .Elements("extradata").Elements("SharedCustomAppData") 
    .Elements("clsNameValues").Elements("clsnamevalue") 
where xml2.Element("name").Attribute("Value").Value == "SHOP_FLOOR_INSTR" 
select xml2).FirstOrDefault(); 

shippingElement.Element("name").Attribute("Value").Value = "Changed!"; 
+0

這實際上是價值。 value是節點的名稱,Value是其中必須更改的值。不是我將如何設計它,但它不是我可以改變的。 – Kris

0

您可以使用System.Xml.XPath擴展對LINQ到XML(相信代碼看起來更短):

var expression = "//extradata/SharedCustomAppData/clsNameValues/clsnamevalue[name/@Value='SHOP_FLOOR_INSTR']/value"; 
XElement valueElement = xdoc.XPathSelectElement(expression); 
if (valueElement != null) 
    valueElement.SetAttributeValue("Value", "Changed!"); 

另外要小心使用命名空間(如果在父節點上聲明瞭某些名稱空間,則從示例xml中不清楚)。