我正在尝试解析下面具有命名空间的 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 文档中有 namespace 时,XPath 需要知道您想要处理的模式。在这种情况下,您可以使用 doc.xpath("//xmlns:Serial")
.
为了让它更容易一些,Nokogiri 有一个方法来删除所有的命名空间。仅当具有相同名称但来自不同命名空间的元素不会发生冲突时,才应使用此方法。
doc.remove_namespaces!
doc.xpath("//Serial")
关于ruby - 当 XML 具有命名空间时,如何使用 Xpath 和 Nokogiri 打印值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23578861/