`

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对象

    NULL 博文链接:https://liugaojian13135.iteye.com/blog/835630

    用ruby读excel文件生成xml文件

    NULL 博文链接:https://huigou.iteye.com/blog/1154745

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

    主要介绍了Ruby使用REXML库来解析xml格式数据的方法,文章最后提及了REXML库的使用相关安全问题可以注意一下,需要的朋友可以参考下

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

    安装 对于Ubuntu,需要安装好 libxml2, libxslt 这两个组件: $ apt-get install libxml2 libxslt 然后就可以: $ gem install nokogiri 可选项 nokogiri提供了一些解析文件时的可...doc = Nokogiri::XML(File.open

    使用Ruby来处理文本的教程

    与 Perl 和 Python 类似,Ruby 拥有出色的...Ruby 中的 String 是容纳、比较和操作文本数据的一种强大方法。在 Ruby 中,String 是一个类,可以通过调用 String::new 或向它分配一个字面值将它实例化。 向 Strings 赋

    Ruby XML Controller-开源

    XML 访问层使用 Ruby 和 REXML,与运行时类创建一起工作,也称为编组。 提供标准功能,使操作结构化 XML 数据与使用数据库一样容易。

    rubygems:Ruby的库包装和发行

    程序包(也称为库)包含可以由Ruby程序调用的一组功能,例如读取和解析XML文件。 我们将这些软件包称为“宝石”,而RubyGems是在您的Ruby环境中安装,创建,管理和加载这些软件包的工具。 RubyGems还是RubyGems....

    xml_fragment:一个本地Puppet模块,用于管理使用REXML构建的XML文件。 Windows兼容

    要求xml_fragment模块由基于Ruby的提供程序驱动,因此它应可在大多数操作系统上运行。 到目前为止,它仅在Windows Server 2012的Puppet Agent 3.8.0上进行了测试,尽管它可能会在其他版本上运行。 请让我知道您使用...

    rdf-rdfxml:用于RDF.rb的Ruby RDFXML阅读器

    与Ruby&gt; = 2.4兼容。 用法: 实例化解析器并解析源,并指定类型和基本URL RDF::RDFXML::Reader.open("./etc/doap.xml") do |reader| reader.each_statement do |statement| puts statement.inspect endend定义xml:...

    nfe_ruby:Ruby语言的NF-e发射器

    nfe_ruby nfe_ruby是用于为状态SEFAZ服务生成,签名和发送XML NF-e / NFC-e的API。 基于NF-e / NFC-e项目OBS的3.10版本:该项目正在实施中,尚未添加所有标签。 项目状态:[x]单个NF-e XML的生成(进行中)[]文档...

    alfred-workflow:Ruby Gem帮助程序,用于构建Alfred工作流程

    读取和写入plist文件的功能。 简化为Alfred生成反馈XML的功能。 安装: gem install alfred-workflow 用法: 有关示例和详细说明,请参阅 。 另请参考一些示例项目: alfred2-sourcetree-workflow 升级指南 ...

    splitHmdbXml:分割HMDB Metabolite数据XML文件

    这些操作是使用Ruby编程语言完成的。 这些操作依赖于某些经过编码的数据,例如初始XML声明以及文档的打开和关闭标签,包括名称空间声明。 由于包含所有代谢物数据的XML文档的大小,使用Ruby来利用File.foreach方法...

    体验布局和树

    体验布局和树 -- Linux,C,C++,Java,Ajax,XML,perl,php,python,ruby,MySQL,Gnome,KDE,Qt,Gtk,bash,shell,嵌入式,网络,信息安全,操作系统,数据结构,编译原理体验布局和树 -- Linux,C,C++,Java,Ajax,XML,perl,php,...

    embulk-parser-xml:XML的Embulk解析器插件

    从输入中读取数据作为xml并提取每个条目以输出。 总览 插件类型:解析器 全部加载或全部不加载:是 支持的简历:否 种类 xml :通过SAX查找行。 xpath :Find通过Xpath查找行,因此您可以通过比xml类型更复杂的...

    nokogiri:Nokogiri(锯)是一种Rubygem,提供HTML,XML,SAX和Reader解析器,并支持XPath和CSS选择器

    能吉里Nokogiri(锯)使使用Ruby中的XML和HTML变得容易而轻松。 它提供了一个明智,易于理解的API,用于读取,写入,修改和查询文档。 它依靠像libxml2(C)和xerces(Java)之类的本机解析器来快速且符合标准。指导...

    arxivsync:用于收集 arXiv 数据库的 Ruby gem OAI 接口

    可用于存储和更新纸质元数据的 XML 镜像,并将 XML 解析为 Ruby 对象以允许转换为更友好的格式。 安装 gem install arxivsync 用法 创建或更新档案 使用包含的 shell 命令: arxivsync ARCHIVE_DIR 这将每个 ...

    dmarcer:一个用于读取DMARC XML报告并从中打印出有用信息的宝石

    Dmarcer 一种用于解析DMARC XML报告并打印有用数据的工具,有关不符合标准的电子邮件来自何处以及它们包含的“来自”标头是什么。安装使用以下命令安装它: $ gem install dmarcer用法使用您的XML DMARC报告作为参数...

Global site tag (gtag.js) - Google Analytics