【问题标题】:XDocument.Descendants() filters too muchXDocument.Descendants() 过滤太多
【发布时间】:2017-10-23 20:54:40
【问题描述】:

我有一个试图从中选择元素的 XML 字符串,但我发现我对 XDocument.Decendents() 方法感到困惑。这是示例 XML。

 <response>
  <control>
    <status>success</status>
    <dtdversion>3.0</dtdversion>
  </control>
  <operation>
    <authentication>
      <status>success</status>
      <userid>jsmith</userid>
      <companyid>1621876182</companyid>
      <sessiontimestamp>2017-10-23T11:57:27-07:00</sessiontimestamp>
    </authentication>
    <result>
      <status>success</status>
      <function>GetFields</function>
      <controlid>723973</controlid>
      <data listtype="All" count="1">
        <type fieldname="ID">User Id</type>
        <type fieldname="FIRSTNAME">User First Name</type>
        <type fieldname="LASTNAME">User Last Name</type>
        <type fieldname="MIDDLEINITIAL">User Middle Initial</type>
        <type fieldname="ADDRESS1">User Address 1</type>
        <type fieldname="ADDRESS2">User Address 1</type>
        <type fieldname="CITY">City of User Residence</type>
        <type fieldname="STATE">State of User Residence</type>
        <type fieldname="PHONENUMBER">User Phone Number</type>
        <type fieldname="EMAIL">User Email Address</type>
      </data>
    </result>
  </operation>
</response>

我的目标是获取data 节点内的节点值列表。我发现以下工作并返回 10 个元素的列表。

List<string> nodeList = xml.Descendants().Attributes("fieldname").Select(x => x.Value).ToList<string>();

让我感到困惑的是,我试图将 data 节点指定为我应该在其下查找子节点的唯一节点。我刚刚将 "data" 作为XName 参数添加到Descendants() 方法中。

List<string> nodeList = xml.Descendants("data").Attributes("fieldname").Select(x => x.Value).ToList<string>();

在这种情况下,结果返回的 nodeList 计数为零。我只是想更具体地定义应该选择哪些节点,以便除了 &lt;data&gt; 节点的子元素之外,不会选择 XML 文档中属性名称为“fieldname”的其他节点。我不确定为什么我得到零结果,并希望有人能对此有所了解。

【问题讨论】:

  • 您预计有多少条目?
  • 我期待 10 个节点回来

标签: c# linq-to-xml


【解决方案1】:

我认为后代过滤了数据类型的后代,但没有具有属性的数据后代。 试试这个:

List<string> nodeList = xml.Descendants("data").Descendants().Attributes("fieldname").Select(x => x.Value).ToList<string>();

【讨论】:

  • 做到了!感谢您的解释。所以看起来Descendants("data") 必须只选择具有data 值的根节点的后代。必须需要第二个Descendants() 才能选择子节点。
猜你喜欢
  • 2021-05-06
  • 1970-01-01
  • 1970-01-01
  • 2016-01-16
  • 1970-01-01
  • 1970-01-01
  • 2017-10-15
  • 1970-01-01
  • 2017-10-07
相关资源
最近更新 更多