Ruby, libxml xpath와 일치하는 어린이 노드를 얻습니다.
문제
노드로 "드릴 다운"하려면 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'
제휴하지 않습니다 StackOverflow