`

ruby操作xml

    博客分类:
  • ruby
 
阅读更多
1、解析XML文件
require "rexml/document"
file = File.new( "mydoc.xml" )
doc = REXML::Document.new file

2、解析XML字符串
require "rexml/document"
include REXML  # so that we don't have to prefix everything with REXML::...
string = <<EOF
  <mydoc>
    <someelement attribute="nanoo">Text, text, text</someelement>
  </mydoc>
EOF
doc = Document.new string

有了Document之后,可以通过多种方式来访问其中的元素
○ Element 类有each_element_with_attributes方法,通常使用它来访问元素
○ Element.elements属性是一个Elements类的实例,可以通过Elements类的each和[]来访问其中的元素。这两个方法都支持使用XPath来进行过滤等操作,因此功能非常强大。
○ Element是Parent的子类,所以要访问元素的子节点,可以通过类似数组的方法,诸如Element[]、Element.each、Element.find、Element.delete等。这是访问一个确实是数组的子节点的最快方式,不支持XPath搜索,并且所有的子节点元素都在这个数组中,不只是Element的子节点。
★ 在REXML中的Element子节点的索引从1开始,而不是0。因为XPath就是从1开始进行计数的,REXML维持了这种关系。

3、使用XPath
# The invisibility cream is the first <item>
invisibility = XPath.first( doc, "//item" )
# Prints out all of the prices
XPath.each( doc, "//price") { |element| puts element.text }
# Gets an array of all of the "name" elements in the document.
names = XPath.match( doc, "//name" )

4、使用Element.elements.to_a()方法,也可以得到匹配解决的数组。
all_elements = doc.elements.to_a
all_children = doc.to_a
all_upc_strings = doc.elements.to_a( "//item/attribute::upc" )
all_name_elements = doc.elements.to_a( "//name" )

5、手动添加元素的方式创建XML文档

require "rexml/document"

doc = REXML::Document.new "<root/>"
root_node = doc.root
el = root_node.add_element "myel"
el2 = el.add_element "another", {"id"=>"10"}
# does the same, but also sets attribute "id" of el2 to "10"
el3 = REXML::Element.new "blah"
el.elements << el3
el3.attributes["myid"] = "sean"
puts doc.to_s

输出:
<root><myel><another id='10'/><blah myid='sean'/></myel></root>

6、为Element添加文本

el1 = Element.new "myelement"
el1.text = "Hello world!"
# -> <myelement>Hello world!</myelement>
el1.add_text "Hello dolly"
# -> <myelement>Hello world!Hello dolly</element>
el1.add Text.new("Goodbye")
# -> <myelement>Hello world!Hello dollyGoodbye</element>
el1 << Text.new(" cruel world")
# -> <myelement>Hello world!Hello dollyGoodbye cruel world</element>

注意,这些Text对象仍然分开储存的;el1.text返回"Hello world!", el1[2]返回内容为"Goodbye"的Text对象。

7、REXML所有文本节点中都是以UTF-8编码的,所有调用的代码都要注意这一点,在程序中,传递给REXML的字符串必须是经过UTF-8编码的。

REXML不可能总是正确猜测出你的文本的编码方式,所以它总是假定为UTF-8编码。同时,如果你试图添加其他编码方式的文本,REXML不会发出警告。添加者必须保证自己添加的是UTF-8的文本。如果添加标准的ASCII 7位编码,是没有关系的。如果使用ISO8859-1文本,必须在添加之前转换为UTF-8编码。可以使用text.unpack("C*").pack("U*")。变更编码进行输出,只有Document.write()和Document.to_s()支持。如果需要输出特定编码的节点,必须用Output把输出对象包装起来。

e = Element.new "<a/>"
e.text = "f/xfcr"   # ISO-8859-1 '??'
o = ''
e.write( Output.new( o, "ISO-8859-1" ) )

可以向Output传递任何支持的编码。

8、插入元素
两种方式:标准的Ruby数组表示法

doc = Document.new "<a><one/><three/></a>"
doc.root[1,0] = Element.new "two"
# -> <a><one/><two/><three/></a>

调用Parent.insert_before 或 Parent.insert_after
three = doc.elements["a/three"]
doc.root.insert_after three, Element.new "four"
# -> <a><one/><two/><three/><four/></a>
# A convenience method allows you to insert before/after an XPath:
doc.root.insert_after( "//one", Element.new("one-five") )
# -> <a><one/><one-five/><two/><three/><four/></a>
# Another convenience method allows you to insert after/before an element:
four = doc.elements["//four"]
four.previous_sibling = Element.new("three-five")
# -> <a><one/><one-five/><two/><three/><three-five/><four/></a>


9、元素的迭代
除使用Element.each方法迭代全部子节点之外,还有其他四种主要的遍历方式。Element.elements.each,只对子元素进行遍历;Element.next_element和Element.previous_element,用作取得下一个Element兄弟节点;Element.next_sibling和Element.previous_sibling,用作取得下一个和上一个兄弟节点,不管其类型是什么
分享到:
评论

相关推荐

    ruby xml封装好的操作XML对象

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

    用ruby读excel文件生成xml文件

    Ruby库如`roo`可以方便地读取Excel文件,而`Nokogiri`则可以用来创建和操作XML文档。 首先,我们需要了解`roo`库。`roo`是Ruby中用于读取不同类型的电子表格文件(如Excel、OpenOffice、Google Sheets)的库。安装`...

    ruby,xml

    虽然具体内容无法在此提供,但我们可以推测这篇文章可能讨论了如何在Ruby中处理XML数据,可能是解析XML文档、创建XML结构或者使用特定的Ruby库如Nokogiri来操作XML。 在标签中,“源码”意味着讨论的内容可能涉及到...

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

    1. **速度**:由于Ox是用C语言编写的,并且直接操作字节流,因此它的解析速度非常快,比许多纯Ruby的XML解析库更高效。 2. **简洁性**:Ox的设计目标是保持简单,因此它的API相对较小,易于理解和使用。开发者可以...

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

    SAX(Simple API for XML)解析器是基于事件的,它在解析XML文档时逐个读取XML文件的各个元素,并触发事件处理程序。而DOM(文档对象模型)解析器则将整个XML文档加载到内存中,并构建成一个树形结构,这样可以更...

    Ruby-ROXMLRuby对象与XML映射的库

    在Ruby中,你可以为你的类定义一个或多个`xml_accessor`,这些方法会自动处理XML的读写操作。例如,如果你有一个名为`Employee`的类,你可以这样定义一个属性: ```ruby class Employee include ROXML xml_...

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

    SAX则是一种事件驱动的解析方式,它逐行读取XML,触发相应的事件回调。REXML提供了类似DOM的解析方式,即Tree Parsing,这种方法适合处理较小的XML文档,因为它将整个XML结构加载到内存中。 以下是一个使用REXML...

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

    通过定义简单的类和模块,HappyMapper能够自动将XML元素映射到Ruby类的属性上,这样我们就可以像操作普通的Ruby对象一样操作解析后的XML数据。 在实际应用中,首先我们需要包含HappyMapper库,并创建一个继承自...

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

    本文详细介绍了如何使用Ruby语言中的REXML库来解析XML格式的数据,包括DOM和XPath两种方式的操作。同时,还提到了在使用REXML过程中需要注意的安全问题。对于需要处理XML文件的Ruby开发者来说,掌握这些技巧将是非常...

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

    流样式则类似于SAX解析,逐行读取XML文档,适合处理大型XML文件,以避免内存消耗。 对于树样式的使用,我们可以创建一个REXML::Document对象,将XML文件加载到内存中。例如: ```ruby require "rexml/document" ...

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

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

Global site tag (gtag.js) - Google Analytics