当XML具有命名空间时,如何使用Xpath与Nokogiri打印值

时间:2014-05-10 08:33:32

标签: ruby namespaces nokogiri

我试图解析下面有名称空间的XML文件,但doc.xpath()和doc.search()不打印任何内容。

如何处理命名空间以便doc.xpath()和doc.search()工作?

因此,只有doc.css()才能使用以下XML文件。

<?xml version="1.0" encoding="UTF-8"?>
<ff-rep:MNEVENTS xmlns="http://www.example.com/MN-EVENTS" 
xmlns:ff-rep="http://www.example.com/MN-EVENTS" 
xmlns:sub-ff="http://www.example.com/sub-ff" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.com/MN-EVENTS ff-rep.xsd">
 <FFEVENT>
    <Ini>00:10</Ini>
    <Code>MKK</Code>
    <Ver>5.09</Ver>
  </FFEVENT>
  <KUI>
    <Serial>IU00-35556</Serial>
    <SubS>8879-22V</SubS>
  </KUI>
  <KUI>
    <Serial>5561-PO2221</Serial>
    <SubS>9980-1M</SubS>
  </KUI>
</ff-rep:MNEVENTS>

但如果我删除&#34; xmlns:... http ..&#34;本文顶部的参考文献

<ff-rep:MNEVENTS xmlns="http://www.example.com/MN-EVENTS" 
xmlns:ff-rep="http://www.example.com/MN-EVENTS" 
xmlns:sub-ff="http://www.example.com/sub-ff" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.com/MN-EVENTS ff-rep.xsd">

到这个

<ff-rep:MNEVENTS>

doc.xpath()doc.search()都按预期工作。

我一直在尝试的代码如下:

#!/usr/bin/env ruby
require 'nokogiri'

doc = Nokogiri::XML(File.open("input.xml"))

puts doc.search('//Serial') # It doesn't work with "xmlns:http.." references
puts doc.xpath('//Serial')  # It doesn't work with "xmlns:http.." references
puts doc.css("KUI Serial")  # It works with "xmlns:http.." references

提前感谢您提供任何帮助

1 个答案:

答案 0 :(得分:3)

当XML文档中存在名称空间时,XPath需要知道您要使用的模式。在这种情况下,您可以使用doc.xpath("//xmlns:Serial")

为了使它更容易Nokogiri有一个删除所有命名空间的方法。只有在不存在具有相同名称但来自不同名称空间的元素发生冲突的情况下,才应使用此方法。

doc.remove_namespaces!
doc.xpath("//Serial")