`
a420144030
  • 浏览: 83657 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Ruby 对XML解析方法一览

阅读更多

RUBY中对XML的文档的解析可以使用这个库REXML库。

REXML库是ruby的一个XML工具包,是使用纯Ruby语言编写的,遵守XML1.0规范。
在Ruby1.8版本及其以后,RUBY标准库中将包含REXML。

REXML库的路径是: rexml/document

所有的方法和类都被封装到一个REXML模块内。

所以使用的时候要先导入rexml/document库,然后把REXML模块展开到当前脚本环境中,这样使用REXML模块内的类就不用使用REXML::模块来引用REXML中的类了

require 'rexml/document'
include REXML

REXML有两种方式访问一个XML文档,一种是树方式,一种是流方式。

树方式,与Javascript中的DOM方式类似,但是更加简化,使用起来更加简单快捷,以下就是树方式解析XML文档的介绍。

REXML模块里面常用的类有以下几个:
一 Document类

1 Document::new
Document类的构造方法,参数可以为一个xml文件的路径,或者一个IO对象,但必须保证该IO对象的流指针所指向的位置 到 流末尾 之间的内容,含有一篇合法的XML文档。

2 Document#root
返回一个element类型的对象,是该xml的根元素

3 Document#version
返回当前xml文档的版本信息 从xml的首行中解析
<?xml version="abcd"?>
那#version就返回'abcd',缺省值是'1.0'

4 Document#encoding
返回当前xml文档的编码方式 同#version从xml首行读取
如<?xml version="1.0" encode="GB2312"?>
需要注意的一个地方是,假如encode的内容是随便输入的,比如abc,那Documnet.new的时候,这篇xml文档没办法解析。


二 Element Class
1 Element::new(arg = UNDEFINED,parent=nil,context=nil)
Element对象的构造函数。
arg:缺省值是undefined,未定义,如果是一个字符串的话,这个字符串将做为这个元素的名称,如果同样也是一个element的话,会将该element复制过来,当然仅是浅层复制,也就是只复制该元素的名称,属性和命名空间。

parent:缺省nil,是该元素的父元素。

context:缺省nil。

2 Element#add_attribute( key, value = nil)
给该元素添加一个属性,假如已经存在同名的key,则覆盖这个key。
返回值是value。

假如第一个参数key不是字符串,而是一个Attribute类型的对象的话,第二个参数就可以省略了,会直接把该Attribute对象添加到该元素的Attribute列表中。
ele = Element.new 'Book'   #<Book />
ele.add_attribute 'name''rubys way' #<Book name="rubys way" />
att = Attribute.new 'price''$5'
ele.add_attribute att  
#<Book name="rubys way" price="$5" />

注意上面的代码,我先创建了att对象,然后再调用ele#add_attribute方法把att对象加到ele的attributes中去的。

3 Element#add_attributes( hash )
增加多个属性到该元素。
hash: 可以是一个Hash或者一个二维Array。
ele.add_attributes({"name" => "rubys way""type" => "book"})#Hash
ele.add_attributes([[
"name","rubys way"], ["type","book"]])#array of arrays

4 Element#add_element(element, attrs=nil)
添加一个子元素到该元素,可以在添加的时候设置子元素的属性。

element:如果是一个element,则该element被添加到该父element中,否则,将根据该参数构造一个element,比如该参数是一个string,就会构造一个新的名称为指定的string的element加入到该元素的子元素中。

attr:如果提供了该参数,必须是一个Hash,该Hash的name将会称为attribute的name,value就是attribute的value。

5 Element#add_namespace(prefix, uri=nil)

prefix:前缀,xmlns:prefix。

uri:内容。

如果只有一个参数的话,就没有前缀了,直接是xmns="uri"
比如
irb(main):242:0> ele = Element.new "filed"
=> <filed/>
irb(main):
243:0> ele
=> <filed/>
irb(main):
244:0> ele.add_namespace "pre", "uri"
=> <filed xmlns:pre='uri'/>
irb(main):
245:0> ele.add_namespace "uri"
=> <filed xmlns:pre='uri' xmlns='uri'/>
irb(main):
246:0> ele.add_namespace "uriuri"
=> <filed xmlns:pre='uri' xmlns='uriuri'/>

6 Element#add_text( string )
给一个Element添加text,比如:
irb(main):251:0> ele = Element.new "ele"
=> <ele/>
irb(main):
252:0> ele
=> <ele/>
irb(main):
253:0> ele.add_text "hallo"
=> <ele>  </>
irb(main):
254:0> ele.add_text " world"
=> nil
irb(main):
255:0> ele
=> <ele>  </>
irb(main):
256:0> ele.text
="hallo world"

7 Element#attribute( key )
访问一个key,取得该key的value。

8 Element#cdatas()
获取CData类型的数组。

9 Element#clone()
返回当前元素的浅表克隆,也就是仅仅是当前元素的克隆,不包括子元素。

10 Element#comments
获取该元素的所有comment,返回一个数组。

11 Element#delete_attribute(key)
删除指定名称的attribute。

12 Element#delete_element(element)
删除一个element。
参数element: 必须是element对象,或string,integer,如果是element对象,则该element对象被删除,如果是string,则按XPATH表达式,把符合项删除,如果是数字,则删除指定的第几个元素。

13 Element#delete_namespace(namespace="xmlns")
删除指定名称的命名空间,默认为xmlns

14 Element#document()
返回所属的Document对象,or nil if this element doesn't belong to a document.

15 Element#each_element(xpath = nil) {|element| ...}
根据xpath指定的搜索条件,遍历所有符合xpath的element。

16 Element#each_element_with_attribute( key, value=nil, max=0, name=nil) {|element| ... }
根据属性值遍历子元素。
key参数限定了属性的名称,所有拥有该属性的子元素被匹配出来
value参数限定了值。
max是匹配的个数。
name是子元素名称。

17 Element#each_element_with_text(text=nil, max=0, name=nil) {|element| ...}
text: 符合该text的
max: 最大符合次数,设置为0为不限制。
name: 符合的子元素名称。

18 Element#each_with_something(test, max=0, name=nil){|child if test.call(child) and num+=1 | ...}
这个方法变态不?
ruby的语言的魅力也就在这里,很方便的给迭代方法,传入一个作为条件的Proc。
test是一个Proc的实例,该Proc只有一个参数,就是每个element。
max是最大匹配数,为0时不限制。
name是名称。

有多少个element就会调用多少次test.call。

19 Element#get_elements( xpath )
根据xpath返回一个数组,一个array,每个元素都是符合xpath的子元素。

20 Element#get_text( path=nil)
返回第一个text节点。
比如:
xml = Document.new "<b>some text<c/>more text</b>" #此时xml有两个text node
xml.root.get_text.value #-> "some text"

21 Element#has_attributes?
是否有属性

22 Element#has_elements?
是否有子元素

23 Element#has_text?
是否有textnode

24 Element#namespace(prefix=nil)
取namespace的值,默认没有前缀,取"xmlns"

25 Element#namespaces()
取所有的命名空间,返回一个Hash

26 Element#next_element()
取下一个element

27 Element#node_type()
取节点类型,:element或:attribute或:namespace

28 Element#prifixes
返回是一个数组,包括所有的命名空间前缀

29 Element#previous_element
返回前面的一个元素,如果没有返回Nil。

30 Element#root
返回根元素。

31 Element#root_node
可以用这个来判断两个element是否是属于同一个root的,比如ele.root_node == ele[0].root_node

32 Element#text
返回text值

33 Element#text=
设置text值

34 Element#texts
返回所有的text。
这里有一点要说说,就是一个element可能会有多个text node,看下面的例子:
ele = Document.new "<a>some string<b/>more string</a>"

ele.root.text 
#-> "some string"
ele.root.texts #-> ["some string","more string"]

35 Element#xpath()
获取一个节点的xpath,这个很有用,如果你不知道该怎么匹配一个节点,就可以直接用这个方法查看下。

三 Elements Class
element的集合,可以用element.elements来访问子集。

1 elements::new(element)
构造函数。
element: 指示新创建的elements隶属于哪个element。

2 elements#<<
alias for #add

3 elements#[]
分享到:
评论

相关推荐

    ruby中xml文件解析

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

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

    Ruby-Ox是一个高效的XML解析器,它被设计用于在Ruby编程环境中快速、有效地处理XML文档。这个解析器的独特之处在于它的简洁性和速度,这得益于其底层的C语言实现,为Ruby提供了一个轻量级且高性能的接口来解析XML...

    ruby xml封装好的操作XML对象

    在`xml_parse.rb`文件中,可能包含的是对XML文档的解析过程。例如,下面的代码展示了如何遍历XML文档的每个节点: ```ruby doc.traverse do |node| # 处理每个节点 end ``` 解析XML时,我们还可以利用...

    使用ruby解析awdb离线库

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

    用ruby读excel文件生成xml文件

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

    ruby使用REXML解析处理xml.pdf

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

    ruby,xml

    4. **创建XML文档**:展示如何使用Ruby的Builder库或其他方法生成XML结构。 5. **错误处理**:讨论在处理XML时可能出现的问题,如格式不正确、缺失闭合标签等,以及如何进行错误检查和异常处理。 6. **实战示例**:...

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

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

    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

    这篇博客“ruby操作xml”可能探讨了如何在Ruby环境中解析、创建和修改XML文档。 在Ruby中,最常用的XML处理库是Nokogiri和REXML。Nokogiri是一个强大的解析器,支持XPath和CSS选择器,使得从XML文档中提取数据变得...

    Ruby-Crystal的一个Html解析器类似于Ruby的Nokogiri

    Nokogiri是Ruby社区广泛使用的库,用于解析HTML、XML文档,提供强大的搜索、操作和转换功能。现在,Crystal语言也有了类似的工具,使得开发者可以在保持高效性能的同时,享受与Nokogiri类似的解析体验。 描述中的...

Global site tag (gtag.js) - Google Analytics