2013-08-24 23 views
1

我試圖從Nokogiri的XML文件中獲取信息。我可以使用檢索文件使用Nokogiri和Rails從XML獲取數據的問題

f = File.open("/my/path/file.xml") 
cac=Nokogiri::XML(f) 

什麼是一個花哨的noko:文件。我行標籤定義如下

<z:row ...info..../> 

<Nokogiri::XML::Element:0x217e7b8 name="z:row" attributes=[#<Nokogiri::XML::Attr:0x217e754 name="ID_Poblacio" value="3"> 

,並使用任我不能檢索行:

s=cac.at_xpath("/*/z:row") or 
s=cac.at_xpath("//z:row") or 
s=cac.at_xpath("//row") or 
s=cac.at_xpath("z:row")... 

也許我真的傻瓜,但我無法找出哪些可以成爲問題。

有沒有人會遇到這個問題?

在此先感謝。

P:S我試圖直接從bash粘貼我的cac文件,但一些更奇怪的格式發生,所以我把它從問題中刪除。如果任何人可以解釋如何做到這一點,我將不勝感激。

+1

你可能需要註冊爲命名空間「Z」字頭。 你可以嘗試's = cac.at_xpath(「// xmlns:row」)'(Nokogori應該爲你註冊) 或's = cac.at_xpath(「// *:row」)'(如果你不關心名字空間)。 或者如果你是「懶惰的」,你可以調用'cac.remove_namespaces!',然後使用's = cac.at_xpath(「// row」)'。 但理想情況下,如果可以的話,您應該發佈您的XML文件, 或提取它的頭和名稱空間聲明)。 請參閱[本博客文章](http://biztech.sheprador.com/?p=74)和[Nokogiri doc](http://nokogiri.org/tutorials/searching_a_xml_html_document.html) –

+0

給我們示例xml以幫助你.. –

+1

我有同樣的問題,並與'.remove_namespaces!':) :)它沒有在我的情況有所不同 –

回答

0

您的XML元素名稱包含一個冒號,但它不在namespace中(否則前綴和URI將顯示在節點的轉儲中)。使用帶冒號的元素名稱而不使用名稱空間是有效的,但可能會導致問題(如本例),因此通常應避免。如果可能,最好的解決方案是重命名xml中的元素以避免:字符,或者在文檔中正確使用名稱空間。

如果你不能這樣做,那麼你需要能夠使用XPath選擇這樣的元素名稱。 XPath節點測試的元素名稱部分中的冒號始終用於指示名稱空間。這意味着你不能直接使用不在命名空間中的冒號來指定名稱。解決這個問題的方法是選擇所有節點,並在謂詞中使用XPath函數來將選擇優化爲僅限於您之後的節點。您可以在參數name()使用冒號,它不會被解釋爲命名空間分隔符:

s=cac.at_xpath("//*[name()='z:row']")