【问题标题】:How can I update a specific XElement?如何更新特定的 XElement?
【发布时间】:2009-07-24 06:53:19
【问题描述】:

在这个 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>

【问题讨论】:

    标签: c# xml


    【解决方案1】:
    XDocument doc;
    ...
    XElement penItemValue = doc
         .Elements("MyStore")
         .Elements("Category")
         .Elements("itemName")
         .Single(itemName => itemName.Value == "Pen")
         .Parent
         .Element("itemValue");
    penItemValue.Value = "123";
    

    【讨论】:

    • 我遇到了 Elements 和 Element 的问题。当它是 Elements 时,它给了我上面 xml 的 null 结果,但我已经按照你的方法得到了它。
    • 优秀的答案!我需要做的几件事是在我的项目中引用 System.Linq 和 System.LinqExpressions。此外,.Single(xxx) 语句的 VB.NET 等效项是:.Single(Function(itemName) itemName.Value = "Pen")
    【解决方案2】:

    您可以使用 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;
    

    【讨论】:

    • 你为什么这么积极地使用Descendants(),而Elements()会很好用?
    • XElement 和 XAttribute 上还有一个 SetValue() 方法。怀疑有什么区别。
    【解决方案3】:

    我会使用 Xpath 找到您要查找的元素,然后直接对其进行操作。

    对于 XPath,//Category[itemName='Pen']/itemNumber 之类的东西会找到元素 for more on Xpath see

    以下(非常基本的)sn-p 在单声道中对我有用

    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]);
      }
    }
    }
    

    【讨论】:

      【解决方案4】:

      使用 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");
      

      【讨论】:

      • 他专门为XElement询问了这样做的事情。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多