我有第二个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来解析文档。即。
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识别命名空间?
答案 0 :(得分: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。您可能希望使用.//
。