按属性值获取节点

时间:2015-09-22 16:09:52

标签: ruby xml nokogiri

我正在尝试通过其属性值获取节点。 XML是由其他人生成的,如下所示:

<destination atlas_id = "val">
  <history>
    <history>
      <history>
        <![CDATA[content]]>
      </history>
      <history>
        <![CDATA[content]]>
      </history>
      <history>
        <![CDATA[content]]>
      </history>
    </history>
  </history>
</destination>

<destination atlas_id = "val2">
  <history>
    <history>
      <history>
        <![CDATA[content]]>
      </history>
      <history>
        <![CDATA[content]]>
      </history>
      <history>
        <![CDATA[content]]>
      </history>
    </history>
  </history>
</destination>

<destination atlas_id = "val3">
  <history>
    <history>
      <history>
        <![CDATA[content]]>
      </history>
      <history>
        <![CDATA[content]]>
      </history>
      <history>
        <![CDATA[content]]>
      </history>
    </history>
  </history>
</destination>

我的代码具有变量dest_fileid,它们之前设置为分别引用正确的文件和值。我在IRB中对它们进行了测试,它们的值是正确的:

node = dest_file.xpath("//destination[@atlas_id = #{id}]").first
doc.text node.xpath("//history/history/history").text unless node.nil?

我想获取第三个嵌套<history>的内容/文本,该第三个嵌套<destination>包含属于具有相关atlas_id值的id = val2节点的CDATA。

即使<history>,我的<destination atlas_id = "val1">内容也属于node = dest_file.xpath("//destination[@atlas_id = #{id}]").first 。当我编写代码以按属性值查找节点时,我引用了“enter image description here”。

为什么我要获取错误的历史节点的内容?在IRB中测试后

Error: Failed to construct 'AudioContext': The number of hardware contexts provided (6) is greater than or equal to the maximum bound (6).

似乎正在返回正确的节点,但以下行获取了错误的内容。问题可能很小或很愚蠢但我无法发现它。

1 个答案:

答案 0 :(得分:2)

在您的第二个XPath表达式中/,因为它以//开头,它将从文档的根进行搜索,因为您使用destination您将从文档中的任何位置获得匹配的所有节点。

您可能想要做的是仅选择上下文节点下的节点,即您已选择的.节点。您可以在表达式的开头使用.//history/history/history

1,zzzz,xxxx,
1,xxxx,xyxy,
2,xxxx,xxxx,
3,yyyy,xxxx,
3,xxxx,yyyy,
3,xxxx,zzzz,
1,ffff,xxxx,
1,aaaa,xxxx,