在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
RUBY中对XML的文档的解析可以使用这个库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#[] |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论