ruby - Nokogiri/Xpath 命名空间查询

标签 ruby xml xpath nokogiri

我正在尝试使用 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>

如您所见,上面的代码似乎工作正常。但是我似乎无法从该节点树中获取标题信息,以下所有操作均失败。

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 自动在根节点上注册命名空间。您必须自己注册不在根节点上的任何命名空间。这应该有效:

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

或者,您可以完全删除命名空间。仅当您确定不会有冲突的节点名称时才执行此操作。

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

关于ruby - Nokogiri/Xpath 命名空间查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4690737/

相关文章:

xml - Spring MVC Restful 406 Not Acceptable

ruby-on-rails - 如何按属性值搜索

python - 如何在selenium中获取当前选项卡的url?

ruby 加载文件中的所有类

javax.xml.transform.Transformer 转换后交换元素属性

javascript - Ruby on Rails,当用户不接受条款时使用 jQuery 显示警报

xml - Xml 中的 If Else 条件

python - 搜索特定 XML 元素属性值

ruby - RoR 非 ActiveRecord 模型 to_json :except not working

ruby - RVM 报告 Gemfile ruby​​ 未安装