2011-07-04 51 views
2

直到現在我用這個:如何使用Nokogiri瀏覽XML文件?

f = File.open("./Public/files/file.xml") 
doc = Nokogiri::XML(f) 
puts doc.at('conversionRateDetail').text 
f.close 

我的XML樣本:

<?xml version="1.0" encoding="UTF-8"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Header> 
    </soap:Header> 
    <soap:Body> 
     <Fare_MasterPricerCalendarReply> 
      <replyStatus> 
       <status> 
        <advisoryTypeInfo>123</advisoryTypeInfo> 
       </status> 
      </replyStatus> 
      <conversionRate> 
       <conversionRateDetail> 
        <currency>USD</currency> 
       </conversionRateDetail> 
      </conversionRate> 
     </Fare_MasterPricerCalendarReply> 
    </soap:Body> 
</soap:Envelope> 

然而,doc.at('conversionRateDetail')總是返回 '零'。

+1

爲我工作。你使用什麼版本的ruby和nokogiri? –

+0

Nokogiri 1.4.6和JRuby 1.5.6 – content01

+1

這可能會也可能不會幫助您解決此問題,但由於您使用的是JRuby,因此您可能需要考慮升級到使用[純Java後端]的Nokogiri 1.5.0, (http://nokogiri.org/CHANGELOG_rdoc.html)。 – Jeremy

回答

2

您加載文件的代碼沒有做Ruby的方式:

File.open("./Public/files/file.xml") do |f| 
    doc = Nokogiri::XML(f) 
    puts doc.at('conversionRateDetail').text 
end 

但是這並沒有解決,爲什麼你不能夠訪問conversionRateDetail。使用nokogiri -v ...

 
# Nokogiri (1.5.0) 
    --- 
    warnings: [] 

    nokogiri: 1.5.0 
    ruby: 
     version: 1.9.2 
     platform: x86_64-darwin10.6.0 
     description: ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-darwin10.6.0] 
     engine: ruby 
    libxml: 
     binding: extension 
     compiled: 2.7.3 
     loaded: 2.7.3 

我能夠訪問conversionRateDetail

xml = <<EOT 
<?xml version="1.0" encoding="UTF-8"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Header> 
    </soap:Header> 
    <soap:Body> 
     <Fare_MasterPricerCalendarReply> 
      <replyStatus> 
       <status> 
        <advisoryTypeInfo>123</advisoryTypeInfo> 
       </status> 
      </replyStatus> 
      <conversionRate> 
       <conversionRateDetail> 
        <currency>USD</currency> 
       </conversionRateDetail> 
      </conversionRate> 
     </Fare_MasterPricerCalendarReply> 
    </soap:Body> 
</soap:Envelope> 
EOT 

require 'nokogiri' 
doc = Nokogiri::XML(xml) 
doc.at('conversionRateDetail').text # => "\n     USD\n    " 

我建議你用這個來代替,但:

doc.at('conversionRateDetail currency').text # => "USD" 
+0

我確實升級到nokogiri 1.5.0,我仍然從doc.at('conversionRateDetail currency')得到NIL – content01

+0

OK ...所以問題似乎是在「Fare_MasterPricerCalendarReply」中的命名空間(我沒有粘貼在我的例子中)。這使得nokogiri因爲某些原因崩潰了...... – content01

+0

請捕獲'nokogiri -v'的輸出並通過編輯將它追加到原始問題的末尾。 –

相關問題