我想以特定的方式输出一个xml文件,只使用带有Ruby的REXML。这是xml文件的样子:
<desc>
<id>2408</id>
<who name="Joe Silva">joe@silva.com</who>
<when>Today</when>
<thetext>Hello World</thetext>
</desc>
<desc>
<id>2409</id>
<who name="Joe Silva2">joe2@silva.com</who>
<when>Future</when>
<thetext>Hello World Again</thetext>
</desc>
到目前为止,这是我使用的代码:
document.elements.each("//desc") {
|e| e.elements.each
|i| puts "#{i.name} : #{i.text}"
puts "\n"
}
这给了我以下输出:
commentid : 2408
who : joe@silva.com
bug_when : Today
thetext : Hello World
commentid : 2409
who : joe2@silva.com
bug_when : Future
thetext : Hello World Again
我可以访问每个标记的文本,但不能访问它们的属性。如何访问属性并获取具有name属性的输出?
所以我想要的输出是:
commentid : 2408
name : Joe Silva
who : joe@silva.com
bug_when : Today
thetext : Hello World
如果需要进一步说明,请告诉我。
答案 0 :(得分:0)
我不会使用REXML,而是使用Nokogiri。使用它,我写了类似的东西:
require 'nokogiri'
doc = Nokogiri::XML(<<EOT)
<xml>
<desc>
<id>2408</id>
<who name="Joe Silva">joe@silva.com</who>
<when>Today</when>
<thetext>Hello World</thetext>
</desc>
<desc>
<id>2409</id>
<who name="Joe Silva2">joe2@silva.com</who>
<when>Future</when>
<thetext>Hello World Again</thetext>
</desc>
</xml>
EOT
data = doc.search('desc').map{ |desc|
desc.children.reject(&:text?).map { |desc_child|
[desc_child.name, desc_child.text]
}.to_h
}
data
# => [{"id"=>"2408",
# "who"=>"joe@silva.com",
# "when"=>"Today",
# "thetext"=>"Hello World"},
# {"id"=>"2409",
# "who"=>"joe2@silva.com",
# "when"=>"Future",
# "thetext"=>"Hello World Again"}]
它提供了一个包含节点名称及其文本的哈希数组。
如何更改要用作键的节点的名称并将其打印出来留给你弄清楚。