【发布时间】: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 内容的字符串。”一点都不清楚。