科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道应用软件用Ruby+Builder创建XML应用

用Ruby+Builder创建XML应用

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文将介绍如何安装Builder,然后用在Ruby中使用Builder创建XML文档,而不需要Rails。

作者:朱先忠编译 来源:天极开发 2007年9月14日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

顺便说一下,当一个名字,例如“:target”以冒号开头时,这意味着,它是一个符号,或更确切地说,是一个Ruby Symbol类的对象。它代表对象的名称;而在没有冒号时它代表对象的值。

你可以使用实例(接收者)x来调用其它方法(如instruct!):

>> x.instruct!

<?xml version="1.0" encoding="UTF-8"?>

=> #<IO:0x279e7e8>

这将生成一个具有一些缺省假属性的XML声明。该方法名后面的感叹号概要性地指出,该方法将适当地修改接收者(receiver),如果无任何变化的话则返回nil。下面生成一个XML注释:

>> x.comment! "greetings"

<!-- greetings -->

=> #<IO:0x279e7e8>

注意,这个方法把一个空格字符插在注释文本的前后。

下面解释怎样创建一个元素。跟在接收者后面的名字也是元素名并且是大小写敏感的:

>> x.Hello "World!"

<Hello>World!</Hello>

=> #<IO:0x279e7e8>

下面是一种在Hello元素上创建属性的方法:

>> x.Hello("World!", "type" => "global")

<Hello type="global">World!</Hello> #<IO:0x279e7e8>

第一个参数是元素的内容,第二个参数使用一个"global"值生成属性类型。

下面的irb示例向你展示了如何把元素内容放在元素内。其中,date元素包含3个子元素:year,month和day;并且子元素被创建于大括号中。

>> x.date {

?> x.year "2006"

>> x.month "01"

>> x.day "01"

>> }

<date>

<year>2006>year>

<month>01>month>

<day>01>day>

<date>

=> #>IO:0x279e7e8>

>>

这些irb示例实际隐藏了用Ruby编写原始的XML的明显特征。下面的示例向你展示更为复杂些的Builder应用。

四、编写一个哈希作为XML标注

通过使用Builder,程序favs.rb将创建一个称为favorites的哈希(hash),然后把它作为XML写出:

#!/usr/bin/ruby

require 'builder'

favorites = {

'candy' => 'Neccos', 'novel' => 'Empire of the Sun', 'holiday' => 'Easter'

}

xml = Builder::XmlMarkup.new( :target => $stdout, :indent => 2 )

xml.instruct! :xml, :version => "1.1", :encoding => "US-ASCII"

xml.favorites do

favorites.each do | name, choice |

xml.favorite( choice, :item => name )

end

end

使用Ruby运行favs.rb,其输出将是:

<?xml version="1.1" encoding="US-ASCII"?>

<favorites>

<favorite item="candy">Neccos<favorite>

<favorite item="holiday">Easter<favorite>

<favorite item="novel">Empire of the Sun<favorite>

<favorites>

最上面一行代码找到Ruby解释器(#!/usr/bin/ruby)的位置。然后,装载Builder库。接着,通过三个名字/值对定义favorites哈希。在此,Builder对象xml被实例化。instruct!方法通过使用一个显式的目标和假属性创建一个XML文档声明(尽管文档可以被作为XML 1.0传递,但是,我在该方法中把版本改为1.1仅为说明实现原理)。

在此,在favorites上调用了一个块(block)(注意,你可以用括号方式来代替上面的“do……end”语句)。对于哈希中的每一对值,都是通过把该哈希名作为一个属性并且把哈希值作为元素内容来创建的。

你可能猜出,用这种方式使用Builder可以非常方便地帮助把大量的名字/值对导出到XML中。

五、创建有效的XHTML文档

最后,我将再讨论一下使用Builder编写有效的XHTML文档的其它的方法和技术。下面是创建这种文档的一个程序(xhtml.rb):

#!/usr/bin/ruby

require 'builder'

x = Builder::XmlMarkup.new(:target => $stdout, :indent => 1)

x.instruct!

x.declare! :DOCTYPE, :html, :PUBLIC, "-//W3C//DTD XHTML 1.0 Strict//EN",

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"

x.html( "xmlns" => "http://www.w3.org/1999/xhtml" ) {

x.head {

x.title "XHTML 1.0 example"

x.style( "type"=>text/css" ) { x.text! "h1 {font-family:tahoma,sans-serif;font-

size:18pt;color:blue} body{font-family:georgia,serif}"

}

}

x.body {

x.h1 "Hello from Builder"

x.p "A Ruby library that facilitates the programatic generation of XML."

x.p { |y| y <<"Methods of interest from <code<Builder::XmlMarkup</code> }

x.ul {

x.li "cdata!"

x.li "comment!"

x.li "declare!"

x.li "instruct!"

x.li "new"

}

x.p{ |y| y << "Methods of interest from "; x.code "Builder::XmlBase"; y << ":" }

x.ul {

x.li "<<"

x.li "new"

x.li "text!"

}

}

}

通过使用符号和字符串,Declare!方法产生一个相应于XHTML 1.0文档类型定义的文档类型声明。style元素用于指定一个类型属性,然后使用text!方法创建了一些CSS。这里选择了把内容放在第一个参数中,见下面代码片断:

x.style("h1 {font-family:tahoma,sans-serif;font-size:18pt;color:blue} body{font-

family:georgia,serif}", "type"=>"text/css" )

这里,可能最有趣的代码是那些创建混合内容的段(paragraph)的代码行(在文本中嵌入了代码元素)。两个语句都使用了块参数|y|,然后使用<<方法把文本添加到它上面。第一个语句把标签嵌入到文本中;第二个语句用代码创建标签,语句之间用分号分开。

Builder是我所发现的用来生成XML标注的最容易使用的工具集之一。尽管本文仅涉及到它的一些简单应用,但却为你在实际工作中使用Builder打好了基础。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章