如何使用带有REXML的Ruby获取XML标记的属性?

时间:2015-01-26 19:22:56

标签: ruby xml scripting rexml

我想以特定的方式输出一个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

如果需要进一步说明,请告诉我。

1 个答案:

答案 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"}]

它提供了一个包含节点名称及其文本的哈希数组。

如何更改要用作键的节点的名称并将其打印出来留给你弄清楚。