2009-10-25 21 views
3

我需要使用XPath节点的子节点,因为我想“钻”到一个节点的子节点。下面是我想要的代码:红宝石,libxml的获得匹配的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(“//文件:标题”)返回所有标题节点的文件即使我只是在找到的节点搜索。

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

回答

3

返回xml_document节点从来不从原始源打破。您始终可以前后移动,唯一的区别是“指针”位于当前找到的节点。

你需要做的是改变你的XPath,使得它不会做一个“完整的文档搜索”:特殊//(这是“后代或自身”)从根开始并穿过所有节点。相反,请使用以下内容:

book_title_xpath = 'Document:Title' 

这将返回名为“Title”的第一个孩子。如果您需要从图书搜索节点的所有子节点,你可以做到以下几点:

book_title_xpath = './/Document:Title' 

它增加了.和手段“开始在当前节点和搜索当前节点和所有后代”

+0

THX,以为我已经试过了,但我想我没有。 – 2009-10-26 13:13:55

0

尝试

book_title_xpath = 'Title'