上节我们介绍了 JSON,本章节主要介绍一下 Ruby 中如何使用 XML。
可扩展标记语言(英语:Extensible Markup Language,简称为 XML)是一种标记语言。标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。
XML 跟 HTML 语言很类似,但是不同的是,XML 是为了传输数据而存在的而不是显示数据,它具有一定的自我描述性。
常见的 XML 例子:
<priceList> <goods good_id="1"> <name>小米</name> <price>1999</price> </goods> <goods good_id="2"> <name>华为</name> <price>2999</price> </goods> <goods good_id="3"> <name>苹果</name> <price>5999</price> </goods> </priceList>
代码块预览 复制
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
我们将上面的例子放到一个price_list.xml文件中去。
解析文件要使用到 XPath
。XPath 使用路径表达式来选择 XML 文档中的节点,下面是一些 XPath 的基本规则:
表达式 | 描述 |
---|---|
nodename | 选择所有名称为“nodename“的节点 |
/ | 从根节点选择 |
// | 从当前节点中选择匹配选择的节点,无论它们在何处 |
. | 选择当前节点 |
… | 选择当前节点的父节点 |
@ | 选择属性 |
下面给出了一些例子来理解XPath
:
表达式 | 时机简介(调用的时机) |
---|---|
bookstore | 选择所有名称为“bookstore”的节点 |
/bookstore | 选择根元素bookstore。注意:如果路径以斜杠(/)开头,则始终表示元素的绝对路径 |
bookstore/book | 选择所有属于bookstore子级的book元素 |
//book | 选择所有书籍元素,无论它们在文档中的位置如何 |
bookstore//book | 选择作为bookstore元素后代的所有book元素,无论它们在bookstore元素下的位置如何 |
//@lang | 选择所有名为lang的属性 |
下面是XPath谓词(Predicates)的使用方法:
表达式 | 时机简介(调用的时机) |
---|---|
/bookstore/book[1] | 选择第一个book元素,它是bookstore元素的子元素。 |
/bookstore/book[last()] | 选择作为bookstore元素的子元素的最后一个book元素 |
/bookstore/book[last()-1] | 选择倒数第二个book元素,它是bookstore元素的子元素 |
/bookstore/book[position()<3] | 选择作为bookstore元素的子元素的前两个book元素 |
//title[@lang] | 选择所有具有名为lang的属性的title元素 |
//title[@lang=‘en’] | 选择所有具有“lang”属性且值为“en”的title元素 |
/bookstore/book[price>35.00] | 选择bookstore元素中所有price元素大于35.00的book元素 |
/bookstore/book[price>35.00]/title | 选择bookstore元素的book元素的所有title元素,它们的price元素的价格大于35.00。 |
现在让我们打印出所有手机品牌的价格信息,在和 price_list.xml 同一目录下创建脚本,这里我们会使用到rexml/document
库。
require 'rexml/document' include REXML xmlfile = File.new("price_list.xml") xmldoc = Document.new(xmlfile) XPath.each(xmldoc, '//priceList/goods').each do |good| p good.elements["name"].text p good.elements["price"].text end # ---- 输出结果 --- "小米" "1999" "华为" "2999" "苹果" "5999"
代码块预览 复制
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
解释:
我们通过XPath.each
获取所有goods元素,然后对这个结果进行迭代,迭代后每一个goods元素中的elements
方法可以获取到goods的每个子节点。使用[key]
获取每个节点,输出它然后再使用text方法输出其中的字符串。
生成XML我们要使用builder
库。
require 'builder' def product_xml xml = Builder::XmlMarkup.new( :indent => 2 ) xml.instruct! :xml, :encoding => "ASCII" xml.product do |p| p.name "Test XML" end end puts product_xml # ---- 输出结果 --- <?xml version="1.0" encoding="ASCII"?> <product> <name>Test XML</name> </product>
代码块预览 复制
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
之后如果需要的话将这个 XML 写入到文件中即可。
本章节我们了解了什么是 XML,XPath 的基本规则有哪些,在 Ruby 中使用 XPath 解析到元素。使用builder
创建一个 XML 文件。