- 浏览: 81556 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
godson_2003:
附件和实例不符
甘特图 -
xf326521:
最近也要做甘特图 膜拜下
甘特图 -
xf326521:
300多下载 没人回复楼主
甘特图 -
yinchao1000:
但是我想问,这个东西现在收费的哟,还挺贵的,有没有破解的可以学 ...
MultiPowUpload 多文件上传及使用方法 -
yangzhihuan:
刚好有这个需求呢。
创建rails项目如何设定rails版本
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
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" />
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
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'/>
=> <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"
=> <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"
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"]
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#[]
发表评论
-
有获得过软考证书的,我公司负责为你缴纳北京的社保,包括个人部分
2015-06-25 14:05 552有获得过软考证书的,我公司负责为你缴纳北京的社保,包括个人 ... -
RMagick对图片操作
2010-11-11 15:58 1147声明:本人不亲日,仅参考代码 指定縦横サイズに収めるリサ ... -
Observer 的使用
2010-11-11 10:39 1312声明:此帖抄录别人的 原帖地址:http://www.ite ... -
抓取并制作网页缩略图
2010-11-10 17:11 3122在windows环境下,可以考虑这个工具软件来抓页面截图:IE ... -
Rails实用插件
2010-11-08 20:45 1049插件名称:active_mailer_tls 描述:该插 ... -
has_and_belongs_to_many 方法使用注意
2010-11-08 14:17 1608Primary key is not allowed in a ... -
Ruby 常用方法一览
2010-11-04 11:08 1208Ruby 常用方法一览 类方法: const_d ... -
创建rails项目如何设定rails版本
2010-09-30 09:06 1309我目前的rails是3.0的,我想用rails 2.3.5创建 ... -
Rails 的plugin_migrations支持多数据库迁移
2010-09-21 09:23 1013plugin_migrations plugin_mig ... -
Ruby 执行shell命令方法
2010-09-21 09:19 2427有时需要在程序中执行命令来完成操作,执行命令的方法如下: ... -
Rails 中session存储问题
2010-09-21 08:33 1843Rails Session Store se ... -
RMagick安装问题
2010-09-16 13:26 1041自从rails 升级到 3.0 ,ruby 升级到 1. ... -
MultiPowUpload 多文件上传及使用方法
2010-09-15 09:19 2695rails 中要使用多文件上传的方案很多,最近搜到一个非常好的 ... -
RedCloth 插件使用及安装错误的解决办法
2010-09-15 08:57 1249最近需求要做一个和fckeditor差不多的文本编辑器,但是不 ... -
Rails-3 Active Support 核心扩展
2010-08-31 15:28 494Active Support 核心扩展 怎样加载Rails ... -
dsdsfsadf
2010-06-30 17:23 14sadfsadfasdf http://www.php ... -
rails 3.0 技术
2010-06-23 08:51 13921.1 安装 写道 gem install rails - ... -
kenny
2010-05-25 15:52 851http://svn.joyent.com/opensourc ... -
关于rails 序列化Hash的问题
2010-04-20 09:09 1481Making Rails' Serialize Even Be ... -
在ubuntu 中如何配置rails + apache + mongrel 服务环境
2010-04-14 16:54 18131. 创建一个项目 cd ~/public_ht ...
相关推荐
ruby对xml文件的解析,不是很全,应该还是有一定帮助的
Ox - 一个快速的XML解析器
ruby使用REXML解析处理xml.pdf
使用ruby解析awdb离线库使用ruby解析awdb离线库使用ruby解析awdb离线库使用ruby解析awdb离线库使用ruby解析awdb离线库使用ruby解析awdb离线库使用ruby解析awdb离线库使用ruby解析awdb离线库使用ruby解析awdb离线库...
NULL 博文链接:https://huigou.iteye.com/blog/1154745
它不是 Ruby 的唯一 XML 库,但它是很受欢迎的一个,并且是用纯 Ruby 编写( NQXML 也是用 Ruby 编写的, 但 XMLParser 封装了用 C 编写的 Jade 库)。 在他的 REXML 概述中,Russell 评论道: 我有这样的问题:我不...
NULL 博文链接:https://liugaojian13135.iteye.com/blog/835630
Text Processing with Ruby ruby文档解析 完整版 完整版
要用ruby解析xml,使用socket通信
快速的XML解析器和Object marshaller作为Ruby gem。 安装 gem install ox 文献资料 说明文件: : 来源 GitHub存储库: : RubyGems仓库: : 支持 安全更新。 感兴趣的链接 用于在Ox,Nokogiri和LibXML之间进行...
publicsuffix-ruby, 在 public 后缀列表中,基于 ruby的域名解析器 用于 ruby的public 后缀PublicSuffix是一个基于 public 后缀列表的ruby 域 NAME 解析器。 要求ruby> = 2.1对于较老版本的ruby,使用以前的版本。...
builder安装方法: gem install builder require 'builder' x = Builder::XmlMarkup.new(:target => $stdout, :indent => 1) #:target =>$stdout参数:指示输出内 容将被写向标准输出控制台 #:indent =>1参数...
PSD.rb - 在Ruby中轻松解析Photoshop文件
这个 Ruby gem 向 Nokogiri XML 节点添加了一个to_hash方法,允许我们将任意 XML 节点转换为 Ruby 哈希,并且还可以将它们序列化为 JSON。 这个 gem 还可以获取属性、处理指令和文档类型声明。 由此产生的哈希是...
这个Ruby宝石向Nokogiri XML节点添加了to_hash和to_json方法,从而使我们可以将任意XML节点序列化为JSON。 该gem还可以获取属性,注释,处理说明和doctype声明。 结果是罗word的,但完整的。 另外,在可能的情况...
主要介绍了Ruby使用REXML库来解析xml格式数据的方法,文章最后提及了REXML库的使用相关安全问题可以注意一下,需要的朋友可以参考下
HappyMapper - 允许您快速轻松地解析XML数据并将其转换成ruby的数据结构
QR-code - 一个用于解析QR码的Ruby库
innodb_ruby, 在 ruby 中,一个解析器格式的解析器, 文件格式的解析器,在 ruby 中这个库和工具的目的是暴露一些隐藏的InnoDB内部。 这里代码不用于关键的生产使用。 它很有可能是危险的而且可能是危险的。 它的...