我试图使用xpath提取dc:title元素.我可以使用以下代码提取元数据.

doc = <<END
<?xml version="1.0" encoding="UTF-8"?>
<package xmlns="http://www.idpf.org/2007/opf" version="2.0">
  <metadata xmlns:dc="URI">
    <dc:title>title text</dc:title>
  </metadata>
</package>
END

doc = Nokogiri::XML(doc)

# Awesome this works!
puts '//xmlns:metadata'
puts doc.xpath('//xmlns:metadata')
# => <metadata xmlns:dc="URI"><dc:title>title text</dc:title></metadata>

正如你所见,上面的方法似乎是正确的.然而,我似乎无法从这个 node 树中获取标题信息,以下所有操作都失败了.

puts doc.xpath('//xmlns:metadata/title')
# => nil

puts doc.xpath('//xmlns:metadata/dc:title')
# => ERROR: `evaluate': Undefined namespace prefix

puts doc.xpath('//xmlns:dc:title')
# => ERROR: 'evaluate': Invalid expression: //xmlns:dc:title

有人能解释一下,在上面的xml文档中xpath应该如何使用名称空间吗.

推荐答案

解析时需要注册所有名称空间.Nokogiri会自动在根 node 上注册名称空间.任何不在根 node 上的名称空间都必须自己注册.这应该是有效的:

puts doc.xpath('//dc:title', 'dc' => "URI")

或者,您可以完全删除名称空间.只有在确定没有冲突的 node 名称时,才能执行此操作.

doc.remove_namespaces!
puts doc.xpath('//title')

Ruby相关问答推荐

ruby:比较两个单词并从中提取不常见的字母

获取用于传递参数的变量名称

在 Ruby 中使用委托维护相同的类

从 ruby​​ 脚本运行另一个 ruby​​ 脚本

get.chomp() 与 STDIN.gets.chomp() 有什么区别?

如何替换 ruby​​ 中模式的每个实例?

如何使用 RSpec 忽略或跳过测试方法?

Ruby:拆分,然后删除前导/尾随空格?

在 YAML 变量中包含 jekyll / liquid 模板数据?

Rails 类 << self

在 ruby​​ 中访问嵌套哈希的元素

根据另一个数组的元素对数组进行排序

在文件中搜索字符串的最佳方法是什么?

在单个 node 上使用 XPath 返回所有 node 中的元素

`require': no such file to load in ruby

如何将 STDOUT 捕获到字符串?

将Elastic search限制设置为无限制

在本地覆盖 Vagrant 配置设置(每个开发人员)

rbenv install --list 不列出 2.1.2 版本

如何在 Ruby 中将时间四舍五入到最接近的 15 分钟?