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

标签 ruby namespaces nokogiri

我正在尝试解析下面具有命名空间的 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/

相关文章:

ruby - 是否有用于 Golang 风格持续时间解析的 Ruby 库?

Ruby - 告诉用户一天中的哪个阶段和一年中的哪个季节(使用哈希)

c++ - XCode 中的未知类型名称 'using'

css - 如何使用 Rspec 检查是否缺少某些 CSS 类?

xml - 如何获取节点的水平深度?

ruby - 如何使用 Ruby 和 Mechanize 解析格式错误的 HTML

ruby-on-rails - Ubuntu 14.04、Ruby on Rails 和 GEOS

ruby-on-rails - Ruby on Rails 和安全

c++ - C++ 中对命名空间的 undefined reference

c++ - 为什么 "#define A"会干扰 "namespace A{}"?