`
simohayha
  • 浏览: 1399897 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

ruby way之使用REXML解析xml

    博客分类:
  • ruby
阅读更多
REXML 是一个完全用ruby写的processor ,他有多种api,其中两个经典的api是通过DOM-like 和SAX-like 来进行区分的。第一种是将整个文件读进内存,然后存储为一个分层的形式(也就是一棵树了).而第二种是"parse as you go",当你的文件很大,并且内存受到限制的时候,比较适合用这种。

看下面的book.xml:

引用
<library shelf="Recent Acquisitions">
    <section name="Ruby">
        <book isbn="0672328844">
        <title>The Ruby Way</title>
        <author>Hal Fulton</author>
        <description>
            Second edition. The book you are now reading.
            Ain't recursion grand?
        </description>
        </book>
    </section>
    <section name="Space">
        <book isbn="0684835509">
            <title>The Case for Mars</title>
            <author>Robert Zubrin</author>
            <description>Pushing toward a second home for the human
                race.
            </description>
        </book>
        <book isbn="074325631X">
            <title>First Man: The Life of Neil A. Armstrong</title>
            <author>James R. Hansen</author>
            <description>Definitive biography of the first man on
                the moon.
            </description>
        </book>
    </section>
</library>


1 Tree Parsing(也就是DOM-like)

我们需要require rexml/document 库,并且include REXML :

require 'rexml/document'
include REXML

input = File.new("books.xml")
doc = Document.new(input)

root = doc.root
puts root.attributes["shelf"]      # Recent Acquisitions

doc.elements.each("library/section") { |e| puts e.attributes["name"] }
# Output:
#   Ruby
#   Space

doc.elements.each("*/section/book") { |e| puts e.attributes["isbn"] }
# Output:
#   0672328844
#   0321445619
#   0684835509
#   074325631X

sec2 = root.elements[2]
author = sec2.elements[1].elements["author"].text       # Robert Zubrin


这里要注意的是xml中的属性和值被表示为一个hash,因此我们能够通过attributes[]来提取我们需要的值,元素的值还能通过类似于path的字符串或者整数来取得.其中用整数取的话,是1-based而不是0-based.

2  Stream Parsing(也就是SAX-like Parsing)

这边使用了一个小技巧,那就是定义了一个listener 类,它将会在parse的时候被回调:

require 'rexml/document'
require 'rexml/streamlistener'
include REXML

class MyListener
  include REXML::StreamListener
  def tag_start(*args)
    puts "tag_start: #{args.map {|x| x.inspect}.join(', ')}"
  end

  def text(data)
    return if data =~ /^\w*$/     # whitespace only
    abbrev = data[0..40] + (data.length > 40 ? "..." : "")
    puts "  text   :   #{abbrev.inspect}"
  end
end

list = MyListener.new
source = File.new "books.xml"
Document.parse_stream(source, list)


这里介绍一下StreamListener 模块,这个模块它提供了几个空的回调方法,因此你可以为了实现你自己的功能而覆盖它.当parser 进入一个tag时,就会调用tag_start方法.而text方法也是类似的,他只不过是当读取到数据时会被回调,它的输出是这样的:

tag_start: "library", {"shelf"=>"Recent Acquisitions"}
tag_start: "section", {"name"=>"Ruby"}
tag_start: "book", {"isbn"=>"0672328844"}
tag_start: "title", {}
  text   :   "The Ruby Way"
.........................................


3 XPath

REXML通过XPath 类来提供Xpath的支持. 它也同时支持DOM-like和SAX-like .还是前面的那个xml文件,我们使用Xpath可以这样做:

book1 = XPath.first(doc, "//book")    # Info for first book found
p book1

# Print out all titles
XPath.each(doc, "//title") { |e| puts e.text }

# Get an array of all of the "author" elements in the document.
names = XPath.match(doc, "//author").map {|x| x.text }
p names


输出是类似于下面的:

<book isbn='0672328844'> ... </>
The Ruby Way
The Case for Mars
First Man: The Life of Neil A. Armstrong
["Hal Fulton", "Robert Zubrin", "James R. Hansen"]











3
0
分享到:
评论

相关推荐

    ruby使用REXML解析处理xml.pdf

    Ruby 使用 REXML 解析处理 XML REXML 是一个 Ruby 库,用于解析和处理 XML 文档。下面是使用 REXML 解析处理 XML 的一些知识点: 1. 基本使用:使用 REXML 解析 XML 文档,需要首先将 XML 字符串转换为 Document ...

    实例解析Ruby程序中调用REXML来解析XML格式数据的用法

    在Ruby编程中,处理XML格式的数据是一项常见的任务,而REXML库提供了一个方便的接口来解析和操作XML文档。本篇文章将深入探讨如何在Ruby程序中利用REXML库解析XML格式的数据。 首先,我们要了解REXML的基本概念。...

    Ruby使用REXML库来解析xml格式数据的方法

    ### Ruby使用REXML库解析XML格式数据的方法及安全注意事项 #### 概述 本文主要介绍如何使用Ruby语言中的REXML库来解析XML格式的数据。REXML是一个完全由Ruby编写的库,提供了强大的XML处理能力。它支持两种主要的...

    ruby xml封装好的操作XML对象

    在处理XML数据时,Ruby提供了一些库来方便我们读取、解析和操作XML文档。本篇文章将详细探讨“Ruby XML封装好的操作XML对象”的知识点,通过分析`xml_parse.rb`这个文件,我们将了解到如何在Ruby中有效地处理XML。 ...

    使用ruby解析awdb离线库

    使用ruby解析awdb离线库使用ruby解析awdb离线库使用ruby解析awdb离线库使用ruby解析awdb离线库使用ruby解析awdb离线库使用ruby解析awdb离线库使用ruby解析awdb离线库使用ruby解析awdb离线库使用ruby解析awdb离线库...

    ruby中xml文件解析

    ruby对xml文件的解析,不是很全,应该还是有一定帮助的

    Ruby-Ox一个快速的XML解析器

    4. **解析XML**:最后,使用解析器的parse方法,传入XML字符串或文件句柄进行解析。 例如,以下是一个简单的SAX解析示例: ```ruby require 'ox' class SimpleHandler include Ox::Sax def start_element(name...

    在Ruby中处理XML和XSLT以及XPath的简单教程

    REXML是Ruby的XML工具包,完全使用Ruby语言编写,并且支持SAX和DOM解析器。它属于轻量级库,代码量少,易于理解和使用。REXML还支持完整的XPath查询功能,允许开发者通过路径表达式来查询XML文档。 本教程接下来将...

    Ruby程序中创建和解析XML文件的方法

    本文将深入探讨如何使用Ruby中的`Builder`库来创建XML文件,以及如何利用`ReXML`库进行XML解析。 首先,让我们详细了解`Builder`库。`Builder`提供了一种简洁的方式来构造XML文档,它允许开发者通过类似于Ruby的...

    用ruby读excel文件生成xml文件

    标题 "用ruby读excel文件生成xml文件" 描述的是一项技术任务,即使用Ruby编程语言来处理Excel文件,并将其内容转换成XML格式。这在数据迁移、格式转换或与不支持Excel格式的应用程序进行数据交换时非常有用。Ruby库...

    The Ruby Way--3rd Edition--2015-英文版

    The Ruby Way 第三版(英文版),全书22章,书中包含600多个按主题分类的示例。每个示例都回答了“如何使用Ruby来完成”的问题。 ——Ruby on Rails之父David Heinemeier Hansson倾力推荐!

    Ruby中XML格式数据处理库REXML的使用方法指南

    总结起来,REXML是Ruby中处理XML数据的强大工具,提供了灵活的树样式和流样式解析方法。通过XPath表达式,我们可以轻松地定位和操作XML文档中的数据。在实际应用中,理解并熟练运用REXML,将有助于提升XML数据处理的...

    The Ruby Way(第2版)

    The Ruby Way(第2版) &lt;br&gt;The Ruby Way assumes that the reader is already familiar with the subject matter. Using many code samples it focuses on "how-to use Ruby" for specific applications, either ...

    Ruby-HappyMapper允许您快速轻松地解析XML数据并将其转换成ruby的数据结构

    一旦定义好这个类,我们就可以使用`parse`方法解析XML字符串或文件,将数据转换成Ruby对象: ```ruby xml = '&lt;user&gt;&lt;id&gt;1&lt;/id&gt;&lt;name&gt;John Doe&lt;/name&gt;&lt;email&gt;johndoe@example.com&lt;/email&gt;&lt;/user&gt;' user = User.parse...

    ruby,xml

    1. Ruby解析XML的基本步骤:介绍如何使用Nokogiri或REXML库加载XML文档,遍历节点,提取数据。 2. XML与Ruby的交互:讲解如何在Ruby中创建XML文档,添加、删除或修改元素。 3. GUI Builder工具的使用:详细介绍gui...

Global site tag (gtag.js) - Google Analytics