根据兄弟节点的值选择XML元素

4
使用Linq to XML和下面的示例XML文档,如果"itemColor"为蓝色,如何获取"itemType"的值?
<?xml version="1.0" encoding="utf-8" ?>
<items>
    <item>
         <itemName>my item name</itemName>
         <itemType>spoon</itemType>
         <itemColor>red</itemColor>
    </item>
    <item>
         <itemName>your item name</itemName>
         <itemType>fork</itemType>
         <itemColor>blue</itemColor>
    </item>
 </items>
2个回答

2
var xdoc = XDocument.Load(path_to_xml);
var itemType = xdoc.Root.Elements("item")
                   .Where(i => (string)i.Element("itemColor") == "blue")
                   .Select(i => (string)i.Element("itemType"))
                   .FirstOrDefault();
// returns "fork"

另一个选择是使用XPath的单行代码:
var type = (string)xdoc.XPathSelectElement("//item[itemColor='blue']/itemType");

顺便提一下,如果要使用XDocument的XPath扩展,请使用System.Xml.XPath命名空间。


哦,使用第一个示例时,我遇到了一个错误:“system.Collections.Generic.IEnumerable<System.Xml.Ling.XElement”没有定义“Where”,也找不到接受类型为“System.Collections.Generic.IEnumerable<System.Xml.Linq.XElement>”的第一个参数的扩展方法“Where”。 - user2121236
@user2121236 确保你在文件顶部有 using System.Linq - Sergey Berezovskiy
1
就是这样。我有 using System.Xml.Linq; 但没有 using System.Linq; - user2121236

0
这应该可以解决问题:
XDocument doc = XDocument.Load("../../sample.xml");
var elements = from item in doc.Descendants("items").Descendants("item")
               where item.Element("itemColor").Value == "blue"
               select item.Element("itemType").Value;

顺便说一下:这不是LINQ to SQL(在这个例子中SQL从哪里来)而是LINQ to XML

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接