根据属性值获取节点



我试图通过其属性值获得节点。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>节点的CDATA,具有相关的atlas_id值。

即使id = val2,我得到属于<destination atlas_id = "val1"><history>的内容。当我编写代码以按属性值查找节点时,我引用了"如何按属性值搜索"。

为什么我得到错误的历史节点的内容?IRB测试后

node = dest_file.xpath("//destination[@atlas_id = #{id}]").first

似乎返回了正确的节点,但下面一行得到了错误的内容。这个问题可能很小或很傻,但我不能发现它。

在第二个XPath表达式//history/history/history中,由于它以/开头,它将从搜索文档的根,并且由于使用//,您将获得与文档中任何位置匹配的所有节点。

您可能想要做的是只选择上下文节点下的那些节点,上下文节点是您已经选择的destination节点。您可以在表达式的开头使用.:

.//history/history/history

相关内容

  • 没有找到相关文章

最新更新