使用Nokogiri和Rails从XML获取数据的问题

问题描述:

我试图从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!':) :)它没有在我的情况有所不同 –

您的XML元素名称包含一个冒号,但它不在namespace中(否则前缀和URI将显示在节点的转储中)。使用带冒号的元素名称而不使用名称空间是有效的,但可能会导致问题(如本例),因此通常应避免。如果可能,最好的解决方案是重命名xml中的元素以避免:字符,或者在文档中正确使用名称空间。

如果你不能这样做,那么你需要能够使用XPath选择这样的元素名称。 XPath节点测试的元素名称部分中的冒号始终用于指示名称空间。这意味着你不能直接使用不在命名空间中的冒号来指定名称。解决这个问题的方法是选择所有节点,并在谓词中使用XPath函数来将选择优化为仅限于您之后的节点。您可以在参数name()使用冒号,它不会被解释为命名空间分隔符:

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