Ruby:
处理XML
如何操作:
让我们使用Ruby自带的REXML来解析一个XML片段:
require 'rexml/document'
include REXML
xml_data = <<-XML
<fruits>
<fruit name="apple" color="green"/>
<fruit name="banana" color="yellow"/>
</fruits>
XML
document = Document.new(xml_data)
document.elements.each('fruits/fruit') { |element|
puts "Name: #{element.attributes['name']}, Color: #{element.attributes['color']}"
}
输出:
Name: apple, Color: green
Name: banana, Color: yellow
生成XML也很直接:
doc = Document.new
doc.add_element 'fruits'
apple = doc.root.add_element 'fruit', {'name' => 'apple', 'color' => 'green'}
banana = doc.root.add_element 'fruit', {'name' => 'banana', 'color' => 'yellow'}
puts doc
XML输出:
<fruits>
<fruit name="apple" color="green"/>
<fruit name="banana" color="yellow"/>
</fruits>
深入了解:
XML的根源可追溯到1990年代,作为一种简化的SGML子集用于网络文档。它虽然冗长但结构高度严密,这也是为什么它能持续使用。虽然不是唯一选择——JSON和YAML因其简单性而变得流行——但XML在许多企业和遗留系统中仍然占据重要地位。
Ruby提供了几种处理XML的方法。REXML是一个全Ruby库,易于上手。Nokogiri是一个包装了更快的C库的宝石(gem),提供速度和额外的功能。如何选择?对于较小的任务先从REXML开始,如果需要更强的性能则转向Nokogiri。
在底层,解析XML是关于将字符串转换为DOM或SAX模型。DOM在内存中创建一棵树,而SAX则流式处理文档并在解析时触发事件。REXML提供这两种模型,但通常比Nokogiri使用的C扩展要慢。
另见:
- Ruby REXML文档:https://www.rubydoc.info/stdlib/rexml
- Nokogiri宝石:https://nokogiri.org/
- XML规范:https://www.w3.org/XML/
- SAX简介:https://www.saxproject.org/
- YAML与JSON与XML比较:https://www.upwork.com/resources/json-vs-xml-vs-yaml