【问题标题】:ruby, libxml getting the child nodes that match an xpathruby,libxml 获取与 xpath 匹配的子节点
【发布时间】:2010-12-09 23:18:04
【问题描述】:

我需要使用 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>  

第一个 find 工作查找并返回 Books 节点。然而,第二个 find('//Document:Title') 返回文档中的所有标题节点,即使我只在找到的节点中搜索。

为什么会发生这种情况?我已经厌倦了修改第二个 XPath,但我厌倦了任何工作。有什么建议吗?

【问题讨论】:

    标签: ruby xpath libxml2


    【解决方案1】:

    试试

    book_title_xpath = 'Title'

    【讨论】:

      【解决方案2】:

      返回的xml_document 节点永远不会从原始源中断开。你总是可以前后移动,唯一的区别是“指针”在当前找到的节点上。

      您需要做的是更改您的 XPath,使其不执行“完整文档搜索”:特殊的 //(即 “descendant-or-self”)开始在根并遍历所有节点。相反,请使用以下内容:

      book_title_xpath = 'Document:Title'
      

      这将返回名称为“Title”的第一个孩子。如果您需要从 Book 节点搜索所有子节点,您可以执行以下操作:

      book_title_xpath = './/Document:Title'
      

      添加.,表示“从当前节点开始,搜索当前节点和所有后代”

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-23
        • 1970-01-01
        • 2013-03-27
        • 2015-03-30
        • 2012-09-17
        • 1970-01-01
        相关资源
        最近更新 更多