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

使用builder创建XML

builder安装方法:

gem install builder
require 'builder'  

x = Builder::XmlMarkup.new(:target =>
 $stdout, :indent => 1)
#":target =>$stdout"参数:指示输出内
容将被写向标准输出控制台
#":indent =>1"参数:XML输出形式将被缩
进一个空格字符x.instruct! :xml,
:version =>'1.1',:encoding => 'gb2312'
x.comment! "书本信息" 

x.library("shelf" => "Recent Acquisitions") {
x.section("name" => "ruby"){
x.book("isbn" => "0672310001"){
x.title "Programming Ruby"
x.author "Yukihiro "
x.description "Programming Ruby -
The Pragmatic Programmer's Guide"
}
}
}

p x #打印XML

Ruby创建XML输出结果:

< ?xml version="1.1" encoding="gb2312"?>
< !-- 书本信息 -->
< library shelf="Recent Acquisitions">
< section name="ruby">
< book isbn="0672310001">
< title>Programming Ruby< /title>
< author>Yukihiro < /author>
< description>Programming Ruby - The
Pragmatic Programmer's Guide
< /description>
< /book>
< /section>
< /library>
< inspect/>
#< IO:0x2a06ae8>

使用ReXML解析XML

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"]
(0)

相关推荐

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

    REXML 是一个完全用ruby写的processor ,他有多种api,其中两个经典的api是通过DOM-like 和SAX-like 来进行区分的.第一种是将整个文件读进内存,然后存储为一个分层的形式(也就是一棵树了).而第二种是"parse as you go",当你的文件很大,并且内存受到限制的时候,比较适合用这种. rexml具有如下特点: 100%用ruby编写 可以用来解析SAX和DOM 轻量,不足2000行代码 提供完整的API支持 ruby中内置 下面我们来看看如何使

  • Ruby中使用Nokogiri包来操作XML格式数据的教程

    安装 对于Ubuntu,需要安装好 libxml2, libxslt 这两个组件: $ apt-get install libxml2 libxslt 然后就可以: $ gem install nokogiri 可选项 nokogiri提供了一些解析文件时的可选项,常用的有: NOBLANKS : 删除空节点 NOENT : 替代实体 NOERROR : 隐藏错误报告 STRICT : 精确解析,当解析到文件异常时抛出错误 NONET : 在解析期间禁止任何网络连接. 可选项使用方式举例(通过块

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

    以树方式使用 REXML REXML 的目的是 正好够用.在最大程度上,它能很好地完成任务. 实际上, REXML 支持两种不同样式的 XML 处理 ― "树"和"流". 第一种样式是 DOM 所尝试要做的更简单的版本:第二种样式是 SAX 所尝试要做的更简单的版本. 让我们先研究树样式.假设我们要提取上一个示例中的同一个地址簿文档. 下面的示例来自我所创建的经修改的 eval.rb : 标准 eval.rb (链接到 Ruby 教程)可以根据对复杂对象的表达式求值

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

    REXML 是由 Sean Russell 编写的库.它不是 Ruby 的唯一 XML 库,但它是很受欢迎的一个,并且是用纯 Ruby 编写( NQXML 也是用 Ruby 编写的, 但 XMLParser 封装了用 C 编写的 Jade 库). 在他的 REXML 概述中,Russell 评论道: 我有这样的问题:我不喜欢令人困惑的 API.有几种用于 Java 实现的 XML 解析器 API.其中大多数都遵循 DOM 或 SAX,并且在基本原理上与不断出现的众多 Java API 非常相似.

  • Ruby的XML格式数据解析库Nokogiri的使用进阶

    一.基础语法 1.直接以字符串形式获取nokogiri对象: html_doc = Nokogiri::HTML("<html><body><h1>Mr. Belvedere Fan Club</h1></body></html>") xml_doc = Nokogiri::XML("<root><aliens><alien><name>Alf</na

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

    什么是 XML ? XML 指可扩展标记语言(eXtensible Markup Language). 可扩展标记语言,标准通用标记语言的子集,一种用于标记电子文件使其具有结构性的标记语言. 它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. 它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据. XML解析器结构和API XML的解析器主要有DOM和SAX两种. SAX解析器是基于事件处理的,需要从头到尾把XML文档扫描一遍,在扫描

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

    使用builder创建XML builder安装方法: gem install builder require 'builder' x = Builder::XmlMarkup.new(:target => $stdout, :indent => 1) #":target =>$stdout"参数:指示输出内 容将被写向标准输出控制台 #":indent =>1"参数:XML输出形式将被缩 进一个空格字符x.instruct! :xml, :

  • JAVA中4种解析XML文件的方法

    XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与交互带来了极大的方便.XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已. XML的解析方式分为四种: 1.DOM解析: 2.SAX解析: 3.JDOM解析: 4.DOM4J解析. 其中前两种属于基础方法,是官方提供的平台无关的解析方式:后两种属于扩展方法,它们是在基础的方法上扩展出来的,只适用于java平台. 针对以下XML文件,会对四种方式进行详细描述: <?xml version="

  • java中使用dom4j解析XML文件的方法教程

    前言 dom4j是一个java的XML api,性能优异.功能强大.易于使用.以前听说过来解析xml文件的几种标准方式:但是从来的没有应用过来,所以可以在google中搜索dmo4j解析xml文件的方式,学习一下dom4j解析xml的具体操作.下面话不多说了,来一起看看详细的介绍吧 官网下载Dom4j地址:https://dom4j.github.io/ 注意:使用Dom4j开发,需下载dom4j相应的jar文件 题目:后台利用dom4j解析student.xml文件,并返回List<Stude

  • Android中使用sax解析xml文件的方法

    SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备. SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML 语法中的某部分,如果符合就会触发事件.所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口.下面是一些ContentHandler接口常用的方法: startDocument():当遇到文档的开头的时候,调用

  • 使用PHP DOM-XML创建和解析XML文件

    使用PHP DOM-XML创建和解析XML文件 <?php    /**   * Topic:       Create and parse XML files using PHP DOM-XML   * Source:      http://www.php.net/domxml   * Reference:   http://www.zugeschaut-und-mitgebaut.de/php/extension.domxml.html   * Author:      urs@circl

  • jQuery加载及解析XML文件的方法实例分析

    本文实例讲述了jQuery加载及解析XML文件的方法.分享给大家供大家参考,具体如下: 1.简述 XML(eXtensible Markup Language)即可扩展标记语言,与HTML一样,都是属于SGML标准通用语言. 2. Content-Type 很多情况下XML文件不能正常解析都是由于Content-Type没有设置好.如果Content-Type本身就是一个XML文件则不需要设置:如果是由后台程序动态生成的,那么就需要设置Content-Type为"text/xml",否

  • Android开发之DOM解析xml文件的方法

    本文实例讲述了Android中DOM解析xml文件的方法.分享给大家供大家参考,具体如下: 一.在assets文件中写xml文件 <?xml version="1.0" encoding="UTF-8"?> <persons> <person id="23"> <name>李明</name> <age>30</age> </person> <pe

  • Android编程解析XML文件的方法详解【基于XmlPullParser】

    本文实例讲述了Android编程解析XML文件的方法.分享给大家供大家参考,具体如下: 前言 在学习Android的Framework层源码时,Android大量的使用XmlPullParser来解析xml文件的源码.因此,这里也顺道介绍一下XmlPullParser的使用. XML XML(eXtensible Markup Language)中文名为可扩展标记语言.标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等. 用途 XML设计用了传送及携带数据信息,

  • jQuery+ajax读取并解析XML文件的方法

    本文实例讲述了jQuery+ajax读取并解析XML文件的方法.分享给大家供大家参考,具体如下: ajax.xml: <?xml version="1.0" encoding="UTF-8"?> <stulist> <student email="1@1.com"> <name>zhangsan</name> <id>1</id> </student>

  • 用jdom创建中文的xml文件的方法

    实例如下: package test; import java.io.File; public class DOMTest { private String outFile = "c:\\abc\\people.xml"; public static void main(String[] args) { new DOMTest(); } public DOMTest() { try { File file = new File(outFile); if(!file.exists()){

随机推荐