0

我有第二个 xml

<Environment
  Name="test"
  xmlns="http://schemas.dmtf.org/ovf/environment/1"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:oe="http://schemas.dmtf.org/ovf/environment/1"
  oe:id="123456789">
  <PropertySection>
      <Property oe:key="mykey" oe:value="test"/>
  </PropertySection>
</Environment>

我正在使用 ruby​​ 和 nokogiri 来解析文档。IE

file = File.open('/tmp/myxml.xml')
doc = Nokogiri::XML(file)

env = doc.at('Environment')
id = env['id']  
printf("ID [%s]\n", id)
properties = env.at('PropertySection')

这有效并成功地从 xml 打印了 id。我现在想使用键“mykey”访问 Property 属性。我尝试了以下方法:

value = properties.at('Property[@key="mykey"]')['value']
printf("Value %s\n", value)

不幸的是,properties.at 方法返回一个 nil 对象。我尝试修改 xml 本身以从属性“key”中删除“oe”命名空间。重新运行我的脚本就可以了。

调用 .at() 时如何让 nokogiri 识别命名空间?

4

1 回答 1

1

您应该使用 Nokogiri 命名空间语法:http ://nokogiri.org/tutorials/searching_a_xml_html_document.html#namespaces 。

首先,确保您有可以使用的命名空间:

ns = {
  'xmlns' => 'http://schemas.dmtf.org/ovf/environment/1',
  'oe' => 'http://schemas.dmtf.org/ovf/environment/1'
}

(即使在这个例子中它们是相同的,我也在定义两者)。您还可以考虑使用doc.collect_namespaces.

然后你可以这样做:

value = properties.at('./xmlns:Property[@oe:key="mykey"]/@oe:value', ns).content

请注意,我在./这里使用它是因为对于这个特定的搜索,Nokogiri 将 XPath 解释为没有它的 CSS。您不妨使用.//.

于 2013-08-06T18:20:11.943 回答