首页 > 解决方案 > linq to xml 查询需要正确的语法

问题描述

我正在尝试进行查询以首先找到具有“名称”属性“条目”的节点“字段”。从那里我想获取作为有效负载子节点的两个字段节点的值是否有更好的方法来进行此查询?似乎我错过了一些可以轻松获得两个字段节点的东西,因此我可以枚举它们并获取它们的值。

var query = from el in xDoc.Root.Descendants(vz + "field")
            where (string)el.Attribute("name") == "entries"
            select el.Descendants(vz + "field");    

我的示例 XML:

<?xml version="1.0" encoding="UTF-8"?>
<payload xmlns="http://www.vz.com/types" model="http://10.232.xx.xxx/model/template/61ac3a8b-8e0b-45a0-910b-5929ecc73814">
   <field name="id">
      <value>61ac3a8b-8e0b-45a0-910b-5929ecc73814</value>
   </field>
   <field name="name">
      <value>AddOn</value>
   </field>
   <field name="sort-id" />
   <field name="stage-id" />
   <field name="type-id" />
   <field name="modification-date" />
   <field name="modified-by" />
   <field name="comment" />
   <field name="version" />
   <field name="group-id" />
   <field name="export-rule" />
   <field name="entries">
      <list>
         <payload>
            <field label="FID" name="12abca0d-117f-4046-9f30-f38537a02576">
               <value>USGOV000356</value>
            </field>
            <field label="VosModifiedDate" name="19a282a6-d0f0-4096-b630-ed16aedd1a15">
               <value>11/15/2017 9:50:21 AM</value>
            </field>
         </payload>
      </list>
   </field>
</payload>

标签: xmllinq

解决方案


我相信你的问题是你没有清楚地检查你的类型。query是类型IEnumerable<IEnumerable<XElement>>,因为from...where提供所有匹配项,然后您提供所有子匹配项。

如果您重新from匹配子匹配,您将获得相当于 a 的SelectMany组合所有IEnumerable<XElement>子匹配。

var query = from el in xDoc.Root.Descendants(vz + "field")
            where el.Attribute("name").Value == "entries"
            from eld in el.Descendants(vz + "field")
            select eld;

或者,您可以选择顶级field元素的第一个匹配项,然后获取其field后代:

var query = (from el in xDoc.Root.Descendants(vz + "field")
             where el.Attribute("name").Value == "entries"
             select el)
            .First()
            .Descendants(vz + "field");

推荐阅读