2012-07-17 122 views
1
<DataSet xmlns="http://www.atcomp.cz/webservices"> 
    <xs:schema xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="file_mame">...</xs:schema> 
    <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"> 
    <alldata xmlns=""> 
     <category diffgr:id="category1" msdata:rowOrder="0"> 
     <category_code>P.../category_code> 
     <category_name>...</category_name> 
     <subcategory diffgr:id="subcategory1" msdata:rowOrder="0"> 
      <category_code>...</category_code> 
      <subcategory_code>...</subcategory_code> 
      <subcategory_name>...</subcategory_name> 
     </subcategory> 
.... 

如何獲取所有categoriessubcategories的數據?用Nokogiri解析XML文件?

我想是這樣的:

reader.xpath('//DataSet/diffgr:diffgram/alldata').each do |node| 

但是這給了我:

undefined method `xpath' for #<Nokogiri::XML::Reader:0x000001021d1750> 

回答

4

引入nokogiri的Reader分析器不支持的XPath。請嘗試使用Nokogiri的內存中的Document解析器。

在另一方面,查詢xpath命名空間,您需要提供一個命名空間映射,像這樣:

doc = Nokogiri::XML(my_document_string_or_io) 

namespaces = { 
    'default' => 'http://www.atcomp.cz/webservices', 
    'diffgr' => 'urn:schemas-microsoft-com:xml-diffgram-v1' 
} 
doc.xpath('//default:DataSet/diffgr:diffgram/alldata', namespaces).each do |node| 
    # ... 
end 

或者你可以remove the namespaces

doc.remove_namespaces! 
doc.xpath('//DataSet/diffgram/alldata').each { |node| } 
+0

感謝你回答約翰,但不幸的是,腳本不進入循環=>所以解析不會開始 – user984621 2012-07-17 19:12:05

+0

此外,我只是試圖打印出'put doc',結果只是'<?xml version =「1.0」?>'' ,這很奇怪 – user984621 2012-07-17 19:22:13

+0

它聽起來像你的'my_ document_string_or_io'是空的 – 2012-07-17 21:34:21