我试图通过其属性值获得节点。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_file
和id
,前面设置分别引用正确的文件和值。我在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