抓取一个节点的多个实例

问题描述 投票:0回答:1

我这里有一个 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,并跳过其他 toyids。

c# xml linq
1个回答
0
投票

您的 XML 中的一些问题/疑虑:

  1. 无效的结束标记
<ToyId>6623</ToyID>
  1. Bookstore
    元素中的属性是“Hastoys”
<Bookstore Hastoys="YES"> 

但是你的代码是指“HasToys”

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

方法 1

假设您解决了上述问题/疑虑,使用

.Descendants("ToyList").Elements("ToyId")
将每个
ToyId
元素置于
ToyList
元素下。

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();
© www.soinside.com 2019 - 2024. All rights reserved.