linq 抓取节点的多个示例

to94eoyn  于 2023-05-20  发布在  其他
关注(0)|答案(1)|浏览(120)

这里有一个XML文件块。我想获取ToyId的所有示例并将其放入数组中。以及只抓取具有“Hastoys =“YES””属性的节点。

<Bookstore Hastoys="YES"> 
  <Authors>7</Authors>
  <Location>Austin TX</Location>
  <Employees>15</Employees>
  <ToyList>
    <ToyId>124</ToyId>
    <ToyId>1251</ToyId>
  </ToyList>
  <ToyList>
    <ToyId>255-2</ToyId>
    <ToyId>6623</ToyID>
  </ToyList>
</Bookstore>
var list =  from r in doc.Descendants("Bookstore")
            .Where(node => (string)node.Attribute("HasToys") == "YES")
            select new
            {
                ToyId = r.Element("ToyList")?.Element("ToyId")?.Value,
            };

我尝试使用上面的查询,但它只返回我玩具id的第一个示例,然后转到下一个块。因此输出将是:124,跳过其他的玩具。

9lowa7mx

9lowa7mx1#

XML中的一些问题/顾虑:
1.的结束标记无效

<ToyId>6623</ToyID>
  1. Bookstore元素中的属性为“Hastoys”
<Bookstore Hastoys="YES">

但你的代码指的是“HasToys”

(string)node.Attribute("HasToys") == "YES"

方法1

假设您修复了上述问题/关注点,使用.Descendants("ToyList").Elements("ToyId")获取ToyList元素下的每个ToyId元素。

string xml = @"<Bookstore HasToys=""YES""> 
    <Authors>7</Authors>
    <Location>Austin TX</Location>
    <Employees>15</Employees>
    <ToyList>
        <ToyId>124</ToyId>
        <ToyId>1251</ToyId>
    </ToyList>
    <ToyList>
        <ToyId>255-2</ToyId>
        <ToyId>6623</ToyId>
    </ToyList>
</Bookstore>";

XDocument doc = XDocument.Parse(xml);

var list = (from r in doc.Descendants("Bookstore")
              .Where(node => (string)node.Attribute("HasToys") == "YES")
                .Descendants("ToyList")
                .Elements("ToyId")
              select new
              {
                    ToyId = r.Value,
              });

方法2

您也可以使用XPath

XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);

XmlNode root = doc.DocumentElement;
var list = root.SelectNodes("//Bookstore[@HasToys='YES']/ToyList/ToyId").Cast<XmlNode>()    
    .Select(x => new
              {
                    ToyId = x.InnerText
              })
    .ToList();

相关问题