ruby, libxml получение дочерних узлов, соответствующих xpath - PullRequest
3 голосов
/ 25 октября 2009

Мне нужно получить дочерние узлы узла, используя 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>  

Первый поиск находок находит и возвращает узел Книги. Однако второй поиск ('// Document: Title') возвращает все узлы Title в документе, хотя я ищу только в найденных узлах.

Почему это случилось? Я устал модифицировать второй XPath, но ничего усталого не работает. Любой совет?

Ответы [ 2 ]

3 голосов
/ 25 октября 2009

Возвращенные узлы xml_document никогда не нарушаются от исходного источника. Вы всегда можете двигаться вперед и назад, с той лишь разницей, что «указатель» находится на текущем найденном узле.

Что вам нужно сделать, так это изменить свой XPath так, чтобы он не выполнял «полный поиск документов»: специальный // (то есть «потомок или сам» ) начинается с корень и пересекает все узлы. Вместо этого используйте следующее:

book_title_xpath = 'Document:Title'

, который вернет первого ребенка с именем «Заголовок». Если вам нужно найти все подузлы в узле Book, вы можете сделать следующее:

book_title_xpath = './/Document:Title'

, который добавляет . и означает «начать с текущего узла и найти текущий узел и всех его потомков» .

0 голосов
/ 25 октября 2009

1001 * попробовать *

book_title_xpath = 'Title'

...