문제

노드로 "드릴 다운"하려면 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')는 발견 된 노드에서만 검색하고 있지만 문서의 모든 제목 노드를 반환합니다.

왜 이런 일이 일어날까요? 두 번째 XPath를 수정하는 데 피곤하지만 피곤한 것은 없습니다. 어떤 충고?

도움이 되었습니까?

해결책

반환 xml_document 노드는 원래 소스에서 결코 깨지지 않습니다. 항상 뒤로 이동할 수 있습니다. 유일한 차이점은 "포인터"가 현재 발견 된 노드에 있다는 것입니다.

당신이해야 할 일은 "전체 문서 검색"을 수행하지 않도록 xpath를 변경하는 것입니다. // (그게 "후손 또는 셀프")는 루트에서 시작하여 모든 노드를 가로 지른다. 대신 다음을 사용하십시오.

book_title_xpath = 'Document:Title'

"제목"이라는 이름의 첫 번째 자녀를 반환합니다. 책 노드에서 모든 서브 노드를 검색 해야하는 경우 다음을 수행 할 수 있습니다.

book_title_xpath = './/Document:Title'

추가합니다 . 그리고 수단 "현재 노드에서 시작하여 현재 노드와 모든 후손을 검색하십시오.".

다른 팁

노력하다

book_title_xpath = 'Title'

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top