2013-06-12 8 views
0

컨텍스트 : libxml-ruby gem을 사용하여 XML 파일을 구문 분석하고 있습니다. XPath find 메서드를 사용하여 노드 집합에 대한 XML 문서를 쿼리해야합니다. 그런 다음 각 노드를 개별적으로 처리해야하며 XPath find 메서드를 사용하여 다시 한 번 쿼리합니다.LIBXML-RUBY> Xpath 컨텍스트

문제 :

코드 예 :

require 'xml' 

string = %{<?xml version="1.0" encoding="iso-8859-1"?> 
<bookstore> 
    <book> 
    <title lang="eng">Harry Potter</title> 
    <price>29.99</price> 
    </book> 
    <book> 
    <title lang="eng">Learning XML</title> 
    <price>39.95</price> 
    </book> 
</bookstore>} 

xml = XML::Parser.string(string, :encoding => XML::Encoding::ISO_8859_1).parse 
books = xml.find("//book") 
books.each do |book| 
    price = book.find("//price").first.content 
    puts price 
end 

이를 내가 개별적으로 반환 된 노드를 조회하려고하면이는 XPath find 방법은 바로 노드가 아닌 전체 문서를 조회한다 스크립트는 29.99을 두 번 반환합니다. XPath 컨텍스트를 설정하는 데는이 것이 있어야한다고 생각하지만 아직이를 수행하는 방법을 찾지 못했습니다.

+0

XML 구문 분석에 Nokogiri를 사용하는 것이 좋습니다. Ruby의 기본 표준입니다. –

+0

나는 실제로 Nokogiri를 사용하기 시작했고 똑같은 문제에 부딪쳤다. 나는 libxml-ruby로 바꿨지 만 그곳에 문제가 있기를 바라지 만 같은 문제가 계속된다. –

+0

음 ... 문제가 생기면 라이브러리에 없다는 것을 알게됩니다. :-) 거기에 있었고, 너무 많은 시간을 기억해야했습니다. Nokogiri와 지팡이; 그것은 흔들린다. –

답변

2

첫 번째 문제점은 book.find("//price")입니다.

//price는 노코 기리를 사용. 대신 내가 처음 price에 대한 book 내부보고 싶은 생각합니다. 즉, 당신이 원하는 무엇을 가장 확실하게 아니다. 문서의 상단에서 시작하여 아래로보고 "를 의미

I 내가 얻을 실행 한 후

require 'nokogiri' 

string = %{<?xml version="1.0" encoding="iso-8859-1"?> 
<bookstore> 
    <book> 
    <title lang="eng">Harry Potter</title> 
    <price>29.99</price> 
    </book> 
    <book> 
    <title lang="eng">Learning XML</title> 
    <price>39.95</price> 
    </book> 
</bookstore>} 

xml = Nokogiri::XML(string) 
books = xml.search("book") 
books.each do |book| 
    price = book.at("price").content 
    puts price 
end 

: 그들은 눈에 더 쉽습니다 보통 같은 일을 수행 할 수 있기 때문에 사용 CSS 선택기 거라고

29.99 
39.95 
+0

아, 네 말이 맞아. 나는 쿼리가 문서가 아닌 노드의 맨 위에서 시작되도록 잘못 가정했다. 이 문제는 단순히 가격 앞의 "//"을 제거하면 해결됩니다. 당신의 도움을 주셔서 감사합니다! –

+0

수정하십시오. 이것이 내가 CSS를 선호하는 이유 중 하나입니다. XPath의 슬래시가 내 뇌를 지치게 만듭니다. –