`
bryanzk
  • 浏览: 57741 次
文章分类
社区版块
存档分类
最新评论

Best of Ruby Quiz 笔记之三:GEDCOM Parser

阅读更多

关键字:XML  REXML 数组 堆栈

本quiz的目的是将一种给定格式的文件转换成为xml文件。
需要在ruby中操作xml,可以使用REXML标准库

回过头来,看标准答案:
1、ARGF 与$<同义
看看《Programming Ruby第二版》p335上的解释:
$< 返回object,一个可以访问作为命令行参数给出或者$stdin(当没有参数的时候)给出的所有文件的内容对象。 谁能告诉我,介句话是嘛意思??让我翻译成人话试试看,一个对象,当文件名作为命令行参数给出时,可以使用该对象访问这些文件的内容,如果没有参数,那么访问$stdin给出的文件内容。应该是这样吧?
$< 支持的方法和File对象类似。返回的对象可能会改变,因为$<会依次读取命令行上给出的文件。

2、\S 在ruby的正则表达式中匹配除空格之外的任何字符

3、下面这段代码有点trick
# pop off the stack until we get the parent
 while (level+1) < stack.size
  stack.pop
 end
 parent = stack.last
 # create XML tag
 if tag =~ /@.+@/
  el = parent.add_element data
  el.attributes[' id' ] = tag
 else
  el = parent.add_element tag
  el.text = data
 end
 stack.push el
 
 当刚刚初始化完成后,doc所代表的xml中只有一个根节点<gedcom/>,此后开始读取给定的GedCOM格式文件,读到第一个有效的行时,其level为0,while判断为false,置parent为根节点<gedcom/>,然后将当前的节点作为子节点,并分析其level、tag和data,然后添加到doc中,并将该元素添加到stack数组中,再继续向下处理文件中的行。当遇到一行,其level与上一行的level相同时,此时的level+1就小于了stack这个数组的size,上一行数据所形成的节点就是当前行数据对应节点的兄弟节点,那么就将上一行数据从数组中移除,这样可以保证stack数组中的最后一个元素,一直是要当前这一行要添加节点的父节点。这样一直处理到最后处理完成。

4、doc.write($stdout, 0)

write( output=$stdout, indent=-1, transitive=false, ie_hack=false )
输出XML树,并带有缩进可选项indent.这个方法输出完整的XML文档,包括XML声明,doctype声明,任何处理指令。一个争论的焦点是Document是否应该总是输出XML声明(<?xml version='1.0'?>),有人认为这应该由用户决定。如果没有指定的话,REXML不做输出,因为它向类似XML-RPC这样的应用添加了不必要的带宽占用。

output: 输出支持'<< string'的对象,document向其中写入
indent: 整数。如果是-1,不产生缩进;否则,缩进的该数字指定的空格个数,并且子节点将多产生一个额外的缩进。默认-1.
transive: (没看懂,照抄)If transitive is true and indent is >= 0, then the output will be pretty-printed in such a way that the added whitespace does not affect the absolute value of the document — that is, it leaves the value and number of Text nodes in the document unchanged.
ie_hack: (这段原文很有趣,而且简单,建议自己看)Internet Explorer is the worst piece of crap to have ever been written, with the possible exception of Windows itself. Since IE is unable to parse proper XML, we have to provide a hack to generate XML that IE’s limited abilities can handle. This hack inserts a space before the /> on empty tags. Defaults to false 。
 
源代码



小熊bryan 2007-07-23 15:32 发表评论
分享到:
评论

相关推荐

    Best of Ruby Quiz

    《Best of Ruby Quiz》是一本聚焦于Ruby编程语言的精选问答集锦,旨在帮助开发者深入理解和掌握Ruby的各种特性。这本书的描述简洁明了,"Best of Ruby Quiz"直接点出了其核心内容——一系列关于Ruby的精彩挑战和问题...

    《Best of Ruby Quiz》

    读者大多可以想出一种办法来解决这些问题,往往还能 通过思考和重构找到第二种优雅的设计,但这本书却给你列出了第三种、第四种真正精巧的解决方案——充分利用Ruby技巧才能得出的解决方案。

    《RUBY QUIZ - The Solitaire Cipher 》

    通过查看提供的文件列表,我们看到有“Pragmatic.Bookshelf.Best.of.Ruby.Quiz.Mar.2006.pdf”,这很可能是《Pragmatic Programmer》出版社出版的一本关于Ruby Quiz的最佳解答合集,其中可能包含了对这个具体挑战的...

    Pragmatic.Bookshelf.Best.of.Ruby.Quiz.Mar.2006

    #### 一、《Pragmatic Bookshelf: Best of Ruby Quiz Mar. 2006》概述 - **书籍标题**:本书名为《Pragmatic Bookshelf: Best of Ruby Quiz Mar. 2006》,是一本专注于Ruby编程语言的经典练习册。 - **书籍内容**:...

    Pragmatic.Bookshelf.Best.of.Ruby.Quiz.Mar.2006.pdf

    《Pragmatic Bookshelf Best of Ruby Quiz Mar 2006》是一本专注于Ruby编程语言的书籍,由Pragmatic Bookshelf出版社出版。这本书的独特之处在于它采用了问答的形式,即"Quiz",来帮助读者深入理解和掌握Ruby的核心...

    Best.of.Ruby.Quiz

    《Best.of.Ruby Quiz》是一本专为Ruby初学者精心编写的英文教程,旨在帮助新手逐步掌握这门强大而优雅的编程语言。Ruby作为一种动态、面向对象的脚本语言,因其简洁的语法和强大的元编程能力,深受开发者的喜爱。...

    ruby_quiz.rar

    "Pragmatic.Bookshelf.Best.of.Ruby.Quiz.Mar.2006.pdf"是这本书的电子版,出版于2006年3月,由Pragmatic Bookshelf出版社发行。 Ruby是一种动态、面向对象的脚本语言,以其简洁、优雅的语法和强大的元编程能力著称...

    BestofRubyQuizFreePdfBook.pdf 英文原版

    Best of Ruby Quiz – Free Pdf Book

    Ruby语言中英文教程.rar

    Best.of.Ruby.Quiz.pdf O'Reilly - Ruby in a Nutshell (2001).chm OReilly.Ruby.Cookbook.Jul.2006.chm Rails Recipes (2006) .pdf Rolling with Ruby on Rails.chm Ruby On Rails Book (Save Ink Version).pdf ...

    MongoDB and Ruby

    #### 三、Ruby与MongoDB集成 在Ruby中使用MongoDB非常简单,可以通过几个关键的步骤完成: 1. **安装Ruby驱动程序**:首先需要安装MongoDB的Ruby驱动程序,通过命令`gem install mongo`和`gem install bson`进行...

    object-array-quiz-lucyk22:由GitHub Classroom创建的object-array-quiz-lucyk22

    object-array-quiz-lucyk22:由GitHub Classroom创建的object-array-quiz-lucyk22

    quiz-modulo12:使用 node.js 和 BD Postgress 创建题库和答案游戏

    测验 node.js 中的项目用于制作测验 连接到 Postgress 数据库 要在本地运行,请在 unix 命令控制台键入:&gt; foreman ... 要在本地运行,Windows 命令控制台键入:&gt; Quiz 在浏览器中: 要在云中运行: 在浏览器中: :

    quiz-app::performing_arts:Projeto feito com Angular,聋子,重罪,阿尔根斯测验

    :closed_mailbox_with_raised_flag: Contribuindo para o Quiz应用程序 Para contribuir com Weather App,埃斯帕加斯地区: Bifurque esterepositório。 Crie um分支: git checkout -b &lt;nome&gt; 。 faasa ...

    javascript-quiz:一个用 javascript 编码的 javascript 测验

    "javascript-quiz"项目就是一个利用JavaScript构建的互动式测验,旨在帮助学习者检验和提升他们的JavaScript知识。这个测验可能是通过创建HTML页面来呈现问题,使用JavaScript处理用户交互,并可能结合CSS来实现视觉...

    Rails相关电子书汇总二

    文件名 "Best of Ruby Quiz Volume One.pdf" 暗示了一本书籍,可能是系列中的第一卷,专门收集了关于Ruby编程的智力挑战或问题解答。这种类型的书籍通常会涵盖各种编程技巧、最佳实践以及对语言特性的深入理解,对于...

    JavaScript-Quiz-Application-:使用HTML,CSS和JavaScriptJavaScript测验应用程序

    JavaScript测验应用程序是一种交互式的学习工具,它利用HTML(超文本标记语言)、CSS(层叠样式表)和JavaScript这三种核心技术来创建动态的、用户友好的界面,供学习者检验和提升自己的JavaScript知识。在这个项目...

    ssd3 practical quiz2

    【标题】"ssd3 practical quiz2"是一个与软件工程相关的实践测验,可能是课程"Software System Development 3"(SSD3)的一部分。这个测验可能涉及了软件开发过程中的实际操作和问题解决,旨在检验学生在项目管理和...

    Quiz2_Stack:实现一个堆栈

    在这个"Quiz2_Stack"项目中,我们将关注堆栈的基本操作,如压栈、弹栈以及检查堆栈是否为空。 首先,我们需要理解堆栈的基本概念。堆栈可以看作是一个容器,允许在顶部进行添加(压栈,push)和移除(弹栈,pop)...

Global site tag (gtag.js) - Google Analytics