2012-06-22 32 views
5

Tôi đang cố gắng phân tích các tệp XML bằng Nokogiri, Ruby và XPath. Tôi thường không gặp phải bất kỳ vấn đề nhưng với những điều sau đây tôi không thể thực hiện bất kỳ yêu cầu xpath:XPath trong Nokogiri trả về mảng trống [] trong khi tôi mong đợi có kết quả

doc = Nokogiri::HTML(open("myfile.xml")) 
doc.("//Meta").count 
# result ==> 0 

doc.xpath("//Meta") 
# result ==> [] 

doc.xpath(.).count 
# result => 1 

Dưới đây là một phiên bản đơn giản của file XML của tôi

<Answer xmlns="test:com.test.search" context="hf%3D10%26target%3Dst0" last="0" estimated="false" nmatches="1" nslices="0" nhits="1" start="0"> 
    <time> 
    ... 
    </time> 
    <promoted> 
    ... 
    </promoted> 
    <hits> 
    <Hit url="http://www.test.com/" source="test" collapsed="false" preferred="false" score="1254772" sort="0" mask="272" contentFp="4294967295" did="1287" slice="1"> 
     <groups> 
     ... 
     </groups> 
     <metas> 
     <Meta name="enligne"> 
      <MetaString name="value"> 
      </MetaString> 
     </Meta> 

     <Meta name="language"> 
      <MetaString name="value"> 
      fr 
      </MetaString> 
     </Meta> 
     <Meta name="text"> 
      <MetaText name="value"> 
      <TextSeg highlighted="false" highlightClass="0"> 
       La 
      </TextSeg> 
      </MetaText> 
     </Meta> 
     </metas> 
    </Hit> 
    </hits> 
    <keywords> 
    ... 
    </keywords> 
    <groups> 
    ... 
    </groups> 

thế nào có thể Tôi nhận được tất cả trẻ em của <Hit> từ XML này?

+1

Những gì người khác đã nói nhưng cũng Nokogiri :: HTML sẽ viết thường tên thẻ. Bạn muốn Nokogiri :: XML thay vì – pguardiario

Trả lời

16

Bao gồm các thông tin không gian tên khi gọi xpath:

doc.xpath("//x:Meta", "x" => "test:com.test.search") 
+9

, bạn có thể gọi 'doc.remove_namespaces!' –

1

Đây là một trong những câu hỏi thường gặp nhất về XPA - tìm kiếm "không gian tên mặc định XPath".

Nếu không có cách nào để đăng ký một tên miền không gian cho không gian tên mặc định và sử dụng tiền tố đã đăng ký (nói "x" trong //x:Meta) sau đó sử dụng:

//*[name() = 'Meta` and namespace-uri()='test:com.test.search'] 

Nếu nó được biết rằng Meta chỉ có thể thuộc về mặc định namespace, sau đó ở trên có thể được rút ngắn xuống còn:

//*[name() = 'Meta`] 
Các vấn đề liên quan