linq to xml查询需要正确的语法

时间:2018-10-03 03:22:12

标签: xml linq

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

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>

1 个答案:

答案 0 :(得分:0)

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

如果您重新from个子匹配项,您将获得一个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");