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