ruby,libxml获取与xpath匹配的子节点
题
我需要使用XPath获取节点的子节点,因为我想“向下钻取”进入一个节点。这是我正在尝试的代码:
xml_ns = 'Document:http://www.google.com/books/'
xml_document = XML::Document.file('./test_pages/test.xml')
book_xpath = '//Document:View/Document:Books'
book_title_xpath = '//Document:Title'
xml_document.find(book_xpath, xml_ns).each() { | item |
puts item
item.find(book_title_xpath, xml_ns).each() { |item2|
puts '========================'
puts 'name: ' + item2.content().strip()
}
}
这是一个XML片段
<Document xmlns="http://www.google.com/books/">
<View>
<Books>
<Title>pragmatic programming</Title>
</Books>
<Comics>
<Title>x-men</Title>
</Comics>
</View>
</Document>
第一个查找工作查找并返回Books节点。然而,第二个find('// Document:Title')返回文档中的所有Title节点,即使我只搜索找到的节点。
为什么会这样?我已经厌倦了修改第二个XPath,但是我已经厌倦了。有什么建议吗?
解决方案
返回的 xml_document
节点永远不会从原始源中断开。你可以随时前后移动,唯一的区别是“指针”指向“指针”。是在当前找到的节点。
您需要做的是更改您的XPath,使其不进行“完整文档搜索”:特殊的 //
(即“后代 - 或 - self“)从根开始并遍历所有节点。相反,请使用以下内容:
book_title_xpath = 'Document:Title'
将返回名为“Title”的第一个孩子。如果需要从Book节点搜索所有子节点,可以执行以下操作:
book_title_xpath = './/Document:Title'
添加。
并表示“从当前节点开始并搜索当前节点和所有后代”。
其他提示
试
book_title_xpath ='Title'
不隶属于 StackOverflow