2013-10-06 81 views
0

我有我試圖用引入nokogiri分析XML文件:不能分析XML與引入nokogiri

<?xml version="1.0" encoding="ISO-8859-15"?> 
<ehd:ehd ehd_version="1.40" xmlns:ehd="urn:ehd/001" xmlns="urn:ehd/icd/001"> 
    <ehd:header> 
    <ehd:document_type_cd V="ICD" DN="ICD-Stammdatei" S="1.2.276.0.76.5.100"/> 
    <ehd:service_tmr V="2013-07-01..2013-12-31"/> 
    </ehd:header> 
    <ehd:body> 
    <icd_stammdaten> 
     <kapitel_liste> 
     <kapitel> 
      <nummer V="1"/> 
      ....... 

通常我做得到一個節點:

doc = Nokogiri::XML(params[:file]) 
puts doc.css('nummer') 

現在我想:

doc = Nokogiri::XML(params[:file]) 
puts doc.css('ehd:document_type_cd') 

爲了得到這個輸出:

<ehd:document_type_cd V="ICD" DN="ICD-Stammdatei" S="1.2.276.0.76.5.100"/> 

但不知何故,我得不到輸出!怎麼會這樣?

回答

1

使用XPATH處理XML

當將在XML中namesapce,那麼下面的技巧使用Nokogiri::XML::Document#remove_namespaces!會讓你的生活更輕鬆:

require 'nokogiri' 

doc = Nokogiri::XML::Document.parse <<-eot 
<?xml version="1.0" encoding="ISO-8859-15"?> 
<ehd:ehd ehd_version="1.40" xmlns:ehd="urn:ehd/001" xmlns="urn:ehd/icd/001"> 
    <ehd:header> 
    <ehd:document_type_cd V="ICD" DN="ICD-Stammdatei" S="1.2.276.0.76.5.100"/> 
    <ehd:service_tmr V="2013-07-01..2013-12-31"/> 
    </ehd:header> 
    eot 

doc.remove_namespaces! 
puts doc.at_xpath('//document_type_cd') 
# >> <document_type_cd V="ICD" DN="ICD-Stammdatei" S="1.2.276.0.76.5.100"/> 

或者,如果你足夠好與命名空間 XML ,然後做如下:

require 'nokogiri' 

doc = Nokogiri::XML::Document.parse <<-eot 
<?xml version="1.0" encoding="ISO-8859-15"?> 
<ehd:ehd ehd_version="1.40" xmlns:ehd="urn:ehd/001" xmlns="urn:ehd/icd/001"> 
    <ehd:header> 
    <ehd:document_type_cd V="ICD" DN="ICD-Stammdatei" S="1.2.276.0.76.5.100"/> 
    <ehd:service_tmr V="2013-07-01..2013-12-31"/> 
    </ehd:header> 
    eot 

puts doc.at_xpath('//ehd:document_type_cd','document_type_cd') 
# >> <ehd:document_type_cd V="ICD" DN="ICD-Stammdatei" S="1.2.276.0.76.5.100"/> 
1

Nokogiri tutorial says

不要必須使用XPath來獲得名稱空間的好處。 CSS選擇器也可以使用。 CSS只是使用管道符號來表示命名空間搜索。

所以在這種情況下,你可以這樣做:

puts doc.css('ehd|document_type_cd') 

,如果你喜歡使用CSS過的XPath。