我试图解析下面有名称空间的XML文件,但是doc.xpath()和doc.search()不打印任何内容。
如何处理命名空间的顺序,doc.xpath()和doc.search()的工作?
所以,下面的XML文件只有doc.css()可以工作。
<?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>
但是如果我从这个
中删除顶部的"xmlns:…http.."引用<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
提前感谢您的帮助
当xml文档中有名称空间时,XPath需要知道要使用哪种模式。在这种情况下,您可以使用doc.xpath("//xmlns:Serial")
。
为了使它更简单,Nokogiri有一个删除所有名称空间的方法。此方法只应在具有相同名称但来自不同名称空间的元素不可能发生冲突的情况下使用。
doc.remove_namespaces!
doc.xpath("//Serial")