1

我正在尝试使用 Nokogiri 从 XML 文件中获取信息。我可以使用检索文件

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

什么是一个花哨的 noko:file。我的行标签定义为

<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:SI 试图直接从 bash 粘贴我的 cac 文件,但是格式发生了一些奇怪的事情,所以我将其从问题中删除。如果有人能解释如何做到这一点,我将不胜感激。

4

1 回答 1

0

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

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

s=cac.at_xpath("//*[name()='z:row']")
于 2014-01-11T18:21:10.747 回答