0

XML ドキュメントの値を更新しようとすると、既存の値を編集する代わりに、新しい値で新しいノードが挿入され続けます。

同じ結果でこの2つの方法を試した場合...

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

2 に答える 2

0

LinqからXmlへのSystem.Xml.XPath拡張機能を使用できます(コードは短く見えると思います)。

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からは明らかではありません)。

于 2013-01-25T00:39:07.010 に答える
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!";
于 2013-01-25T00:14:31.007 に答える