3

ノードに「ドリルダウン」したいので、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ノードを検索して返します。ただし、2番目のfind('// Document:Title')は、見つかったノードのみを検索している場合でも、ドキュメント内のすべてのTitleノードを返します。

なぜこれが起こるのでしょうか?2番目のXPathを変更するのに疲れましたが、疲れたものは何も機能しません。何かアドバイス?

4

2 に答える 2

3

返さxml_documentれたノードが元のソースから壊れることはありません。いつでも前後に移動できます。唯一の違いは、「ポインタ」が現在見つかったノードにあることです。

あなたがする必要があるのは、「完全なドキュメント検索」を行わないように XPath を変更することです: 特別な//(これは"descendant-or-self"です) ルートから始まり、すべてのノードをトラバースします。代わりに、次を使用します。

book_title_xpath = 'Document:Title'

「タイトル」という名前の最初の子を返します。Book ノードからすべてのサブノードを検索する必要がある場合は、次の操作を実行できます。

book_title_xpath = './/Document:Title'

これは、 「現在のノードから開始し、現在のノードとすべての子孫を検索する」.という意味を追加します。

于 2009-10-25T20:52:52.767 に答える
0

試す

book_title_xpath = 'Title'

于 2009-10-25T20:56:42.383 に答える