C# 如何更新特定的 XElement?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/1174792/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-06 10:01:50  来源:igfitidea点击:

How can I update a specific XElement?

c#xml

提问by paradisontheitroad

What is the best way to update an XElement (update the value of itemNumber of element Pen) in this XML?

在此 XML 中更新 XElement(更新元素 Pen 的 itemNumber 的值)的最佳方法是什么?

<?xml version="1.0" encoding="utf-8"?>
<MyStore>
  <Category>
    <itemName>Pen</itemName>
    <itemNumber>12</itemNumber>
  </Category>
  <Category>
    <itemName>Paper</itemName>
    <itemNumber>23</itemNumber>
  </Category>
</MyStore>

采纳答案by Pavel Minaev

XDocument doc;
...
XElement penItemValue = doc
     .Elements("MyStore")
     .Elements("Category")
     .Elements("itemName")
     .Single(itemName => itemName.Value == "Pen")
     .Parent
     .Element("itemValue");
penItemValue.Value = "123";

回答by Andrew Cox

I would use Xpath to find the element you were looking for, then manipulate it directly.

我会使用 Xpath 来查找您要查找的元素,然后直接操作它。

For the XPath something like //Category[itemName='Pen']/itemNumberwould find the element for more on Xpath see

对于 XPath 类似的东西//Category[itemName='Pen']/itemNumber在 Xpath 上找到更多元素 ,请参阅

The following (very basic) snippet works for me in mono

以下(非常基本的)片段在单声道中对我有用

using System.Xml;

namespace test
{

  class myclass
  {

  public static void Main(string[] argv)
  {
    XmlTextReader reader = new XmlTextReader(argv[0]);
    XmlDocument doc = new XmlDocument(); 
    doc.Load(reader);
    reader.Close();          
    XmlNode myNode;
    XmlElement root = doc.DocumentElement;
    myNode = root.SelectSingleNode("//Category[itemName='Pen']/itemNumber");

    myNode.InnerText = "18";

    doc.Save(argv[1]);
  }
}
}

回答by womp

You could find it and update it using LinqToXml:

您可以使用 LinqToXml 找到并更新它:

XElement root = XElement.Load("myXml.xml");

var penCategory = from category in root.Descendants("Category")
                  where category.Element("itemName") != null 
                     && category.Element("itemName").Value == "Pen"
                  select category;

penCategory.Element("itemName").Value = updatedValue;

回答by steamer25

Using XPath (which will be familiar to most XML devs):

使用 XPath(大多数 XML 开发人员都熟悉):

var xml = @"<?xml version=""1.0"" encoding=""utf-8""?>
  <MyStore>
    <Category>
      <itemName>Pen</itemName>
      <itemNumber>12</itemNumber>
    </Category>
    <Category>
      <itemName>Paper</itemName>
      <itemNumber>23</itemNumber>
    </Category>
  </MyStore>";

  var doc = new XmlDocument();
  doc.LoadXml(xml);
  var nav = doc.CreateNavigator();
  var iter = nav.Select("/MyStore/Category[itemName='Pen']/itemNumber");
  iter.MoveNext();
  iter.Current.SetValue("42");