我一直在试图解决这个问题。这是我第一次使用任何脚本语言进行此类工作,我想我可能会选择一份艰苦的工作。从本质上讲,我需要做的是将一些基本的XML转换为更重的XML结构。
示例:
翻译以下内容:
<xml>
<test this="stuff">13141</test>
<another xml="tag">do more stuff</another>
<xml>
进入这个:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Package>
<Package version="1.0">
<tests>
<test name="stuff">
<information>13141</information>
</test>
</tests>
<anothers>
<another name="tag">
<information>do more stuff</information>
</another>
</anothers>
</Package>
我已尝试通过正则表达式手动执行此操作,但这需要做很多工作。我已经尝试将多个测试标签存储到一个数组中,因此我可以将它们保存到第二个示例中的tests标签中,但我似乎无法跟踪所有内容。我查看了REXML和Hpricot,但无法弄清楚如何使用它们来正确地执行此操作。
所以,基本上,我要问的是:有没有人对如何以更有效的方式管理这个有任何想法?
答案 0 :(得分:2)
了解XSLT。我只熟悉这项技术,但它的用途是将XML文档从一种形式转换为另一种形式,这听起来就像你需要的那样。
答案 1 :(得分:1)
require 'rubygems'
require 'hpricot'
require 'activesupport'
source = <<-XML
<xml>
<test this="stuff">13141</test>
<another xml="tag">do more stuff</another>
</xml>
XML
def each_source_child(source)
doc = Hpricot.XML(source)
doc.at('xml').children.each do |child|
if child.is_a?(Hpricot::Elem)
yield child
end
end
end
output = Hpricot.build do |doc|
doc << '<?xml version="1.0" encoding="UTF-8"?>'
doc << '<!DOCTYPE Package>'
doc.tag! :Package, :version => '1.0' do |package|
each_source_child(source) do |child|
package.tag! child.name.pluralize do |outer|
outer.tag! child.name, :name => child.attributes.values.first do |inner|
inner.tag! :information do |information|
information.text! child.innerText
end
end
end
end
end
end
puts output
标签之间不会有空格
答案 2 :(得分:0)
Hpricot和Builder结合使用可能会提供您所需要的功能。步骤将是: