我正在尝试通过其属性值获取节点。 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>
包含属于具有相关atlas_id
值的id = val2
节点的CDATA。
即使<history>
,我的<destination atlas_id = "val1">
内容也属于node = dest_file.xpath("//destination[@atlas_id = #{id}]").first
。当我编写代码以按属性值查找节点时,我引用了“”。
为什么我要获取错误的历史节点的内容?在IRB中测试后
Error: Failed to construct 'AudioContext': The number of hardware contexts provided (6) is greater than or equal to the maximum bound (6).
似乎正在返回正确的节点,但以下行获取了错误的内容。问题可能很小或很愚蠢但我无法发现它。
答案 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,