免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4560 | 回复: 3
打印 上一主题 下一主题

使用REXML在ruby中处理xml [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-03-30 14:48 |只看该作者 |倒序浏览
本帖最后由 中关村村草 于 2011-03-30 14:49 编辑

使用REXML在ruby中处理xml



REXML简单使用说明:
(http://www.germane-software.com/software/rexml/docs/tutorial.html)
1、解析XML文件
  1. require \\"rexml/document\\"
  2. file = File.new( \\"mydoc.xml\\" )
  3. doc = REXML:ocument.new file
复制代码
2、解析XML字符串
  1. require \\"rexml/document\\"
  2. include REXML # so that we don\'t have to prefix everything with REXML::...
  3. string = <<EOF
  4. <mydoc>
  5. <someelement attribute=\\"nanoo\\">Text, text, text</someelement>
  6. </mydoc>
  7. EOF
  8. 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
  1. # The invisibility cream is the first <item>
  2. invisibility = XPath.first( doc, \\"//item\\" )
  3. # Prints out all of the prices
  4. XPath.each( doc, \\"//price\\") { |element| puts element.text }
  5. # Gets an array of all of the \\"name\\" elements in the document.
  6. names = XPath.match( doc, \\"//name\\" )
复制代码
4、使用Element.elements.to_a()方法,也可以得到匹配解决的数组。
  1. all_elements = doc.elements.to_a
  2. all_children = doc.to_a
  3. all_upc_strings = doc.elements.to_a( \\"//item/attribute::upc\\" )
  4. all_name_elements = doc.elements.to_a( \\"//name\\" )
复制代码
5、手动添加元素的方式创建XML文档
  1. require \\"rexml/document\\"

  2. doc = REXML:ocument.new \\"<root/>\\"
  3. root_node = doc.root
  4. el = root_node.add_element \\"myel\\"
  5. el2 = el.add_element \\"another\\", {\\"id\\"=>\\"10\\"}
  6. # does the same, but also sets attribute \\"id\\" of el2 to \\"10\\"
  7. el3 = REXML::Element.new \\"blah\\"
  8. el.elements << el3
  9. el3.attributes[\\"myid\\"] = \\"sean\\"
  10. puts doc.to_s
复制代码
输出:


6、为Element添加文本

  1. el1 = Element.new \\"myelement\\"
  2. el1.text = \\"Hello world!\\"
  3. # -> <myelement>Hello world!</myelement>
  4. el1.add_text \\"Hello dolly\\"
  5. # -> <myelement>Hello world!Hello dolly</element>
  6. el1.add Text.new(\\"Goodbye\\")
  7. # -> <myelement>Hello world!Hello dollyGoodbye</element>
  8. el1 << Text.new(\\" cruel world\\")
  9. # -> <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把输出对象包装起来。
  1. e = Element.new \\"<a/>\\"
  2. e.text = \\"f\\xfcr\\" # ISO-8859-1  \ ' ?? \ '
  3. o = \'\'
  4. e.write( Output.new( o, \\ " ISO-8859-1\\ "  )  )  可以向Output传递任何支持的编码。

  5. 8、插入元素
  6. 两种方式:标准的Ruby数组表示法[code]doc = Document.new \\"<a><one/><three/></a>\\"
  7. doc.root[1,0] = Element.new \\"two\\"
  8. # -> <a><one/><two/><three/></a>
复制代码
调用Parent.insert_before 或 Parent.insert_after
  1. three = doc.elements[\\"a/three\\"]
  2. doc.root.insert_after three, Element.new \\"four\\"
  3. # -> <a><one/><two/><three/><four/></a>
  4. # A convenience method allows you to insert before/after an XPath:
  5. doc.root.insert_after( \\"//one\\", Element.new(\\"one-five\\") )
  6. # -> <a><one/><one-five/><two/><three/><four/></a>
  7. # Another convenience method allows you to insert after/before an element:
  8. four = doc.elements[\\"//four\\"]
  9. four.previous_sibling = Element.new(\\"three-five\\")
  10. # -> <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,用作取得下一个和上一个兄弟节点,不管其类型是什么。

论坛徽章:
0
2 [报告]
发表于 2011-04-01 10:16 |只看该作者
来个解释json格式的吧,艹艹。

论坛徽章:
0
3 [报告]
发表于 2011-04-01 11:35 |只看该作者
回复 2# 2gua


    偶了 下次发这方面的

论坛徽章:
0
4 [报告]
发表于 2011-04-01 14:04 |只看该作者
回复 3# 中关村村草


    期待你的发帖!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP