【问题标题】:how to add/insert conditional node into XML using linq to XML如何使用 linq to XML 将条件节点添加/插入到 XML
【发布时间】:2010-08-23 05:15:14
【问题描述】:

我生成了一个这样的 xml 文件:

 XElement employees =
        new XElement("Work",
           new XElement("record",
              new XElement("Name", textBox1.Text),
              new XElement("Phone", "206-555-0144"),
              new XElement("Address",
                    new XElement("Street1", "123 Main St"),
                    new XElement("City", "Mercer Island"),
                    new XElement("State", "WA"),
                    new XElement("Postal", "68042")
             )),
             new XElement("record",
              new XElement("Name", "22222"),
              new XElement("Phone", "353245345"),
              new XElement("Address",
                    new XElement("Street1", "sdfain St"),
                    new XElement("City", "asdf Island"),
                    new XElement("State", "QLD"),
                    new XElement("Postal", "54322")
              )),
              new XElement("record",
              new XElement("Name", "Peter"),
              new XElement("Phone", "1234"),
              new XElement("Address",
                    new XElement("Street1", "sd St"),
                    new XElement("City", "cbr"),
                    new XElement("State", "act"),
                    new XElement("Postal", "2600")
              )
          )
      );

稍后我希望根据条件(其中 name="peter")在父节点“记录”下添加新的子节点,如下所示:

empFile.Elements().Where(r => (string)r.Element("Name") == "Peter")
                  .Add(new XElement("record",
                           new XElement("Mobile", "3253425"),
                           new XElement("Work", 999999)
                       ));

我怎样才能做到这一点?

【问题讨论】:

  • Nitpick:我建议不要使用(string)r.Element("Name"),而是使用r.Element("Name").Value 可能会更好。
  • @Timwi:我不会。强制转换为字符串的优点是它返回 null 而不是在从 null 强制转换时炸毁。因此,任何没有名为 Name 的子元素的元素都会被忽略,而不是导致程序失败。我几乎总是更喜欢使用 LINQ to XML 中的显式转换,除非找不到元素/属性应该被认为是糟糕到足以导致异常。
  • @Jon Skeet:公平点。我承认我没有想到 null,但即使我想到了,op_Explicit 接受它并且不抛出也不明显。例如,如果元素具有子元素,op_Explicit 的作用也不明显,而 Value 属性的文档对此更加明确(哈哈,具有讽刺意味)。
  • @Timwi:显式转换的文档对我来说很清楚:“如果 XElement 有子元素,则返回所有元素文本和后代文本的串联字符串值。”
  • @Jon Skeet:看起来确实很清楚,但我不知道你从哪里得到的。对我来说,它说:“总结:将此 XElement 的值转换为字符串。参数: element:要转换为字符串的 XElement。返回:包含此 XElement 内容的字符串。”一点都不清楚。

标签: c# xml linq


【解决方案1】:

除了 Tim 建议使用 Where 后跟 SingleFirst 之外,值得知道的是,那些已经采用谓词的方法的重载。例如:

empFile.Elements()
       .Single(r => (string) r.Element("Name") == "Peter")
       .Add(...);

【讨论】:

    【解决方案2】:

    您快到了,您的 Where 子句返回 IEnumerable<XElement> 而不是单个 XElement,因此您只需要修复它,即调用 .Single() 或 .First() 等

    例如:

    XElement xe = empFile.Elements().Where(r => (string)r.Element("Name") == "Peter").Single();
    
    xe.Add(new XElement("record", new XElement("Mobile", "3253425"), new XElement("Work", 999999)); 
    

    【讨论】:

    • 你已经分配了 Empfile。元素()。 blahblah 到 xe 和 xe.add 新元素,但我发现 empFile 也已更新,怎么会?
    猜你喜欢
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多