首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LIBXML-RUBY > Xpath上下文

LIBXML-RUBY > Xpath上下文
EN

Stack Overflow用户
提问于 2013-06-12 22:39:48
回答 1查看 480关注 0票数 0

上下文:我正在使用libxml-ruby解析一个XML文件。我需要使用XPath find方法查询XML文档中的一组节点。然后,我需要单独处理每个节点,再次使用XPath find方法查询它们。

问题:当我试图单独查询返回的节点时,XPath find方法正在查询整个文档,而不仅仅是节点:

代码示例:

代码语言:javascript
复制
require 'xml'

string = %{<?xml version="1.0" encoding="iso-8859-1"?>
<bookstore>
  <book>
    <title lang="eng">Harry Potter</title>
    <price>29.99</price>
  </book>
  <book>
    <title lang="eng">Learning XML</title>
    <price>39.95</price>
  </book>
</bookstore>}

xml = XML::Parser.string(string, :encoding => XML::Encoding::ISO_8859_1).parse
books = xml.find("//book")
books.each do |book|
    price = book.find("//price").first.content
    puts price
end

此脚本将返回两次29.99。我认为这肯定与设置XPath上下文有关,但我还没有弄清楚如何实现这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-12 23:19:41

我看到的第一个问题是book.find("//price")

//price的意思是“从文档的顶部开始向下看,这肯定不是您想要做的事情,相反,我认为您想在book中查找第一个price。”

使用Nokogiri,我会使用CSS选择器,因为它们在眼睛上更容易,并且通常可以完成相同的任务:

代码语言:javascript
复制
require 'nokogiri'

string = %{<?xml version="1.0" encoding="iso-8859-1"?>
<bookstore>
  <book>
    <title lang="eng">Harry Potter</title>
    <price>29.99</price>
  </book>
  <book>
    <title lang="eng">Learning XML</title>
    <price>39.95</price>
  </book>
</bookstore>}

xml = Nokogiri::XML(string)
books = xml.search("book")
books.each do |book|
    price = book.at("price").content
    puts price
end

在跑完之后我得到了:

代码语言:javascript
复制
29.99
39.95
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17076572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档