我正试图用Nokogiri从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文件,但格式发生了一些更糟糕的事情,所以我把它从问题中删除了。如果有人能解释如何做到这一点,我将不胜感激。
您的XML元素名称包含冒号,但它不在命名空间中(否则前缀和uri将显示在节点的转储中)。使用带有冒号的元素名称而不使用名称空间是有效的,但可能会导致问题(如本例),因此通常应避免使用。如果可能的话,最好的解决方案是重命名xml中的元素以避免使用:
字符,或者在文档中正确使用名称空间。
如果不能做到这一点,则需要能够使用XPath选择这样的元素名称。XPath节点测试的元素名称部分中的冒号总是用来指示命名空间。这意味着您不能直接使用不在命名空间中的冒号指定名称。解决这个问题的方法是选择所有节点,并在谓词中使用XPath函数来将选择细化为只关注那些节点。您可以在name()
的参数中使用冒号,它不会被解释为命名空间分隔符:
s=cac.at_xpath("//*[name()='z:row']")