我目前正在使用Ruby中的XmlSimple,使用xml_in方法将XML转换为哈希。一切都非常好,除了生成的散列键都是小写的,而XML元素名称是混合大小写的。
以下是一个例子:
hash = XmlSimple.xml_in( xml_string, { 'KeyAttr' => 'name',
'ForceArray' => false,
'NoAttr' => true,
'KeyToSymbol' => true,
'SuppressEmpty' => "" } )
所以,例如,这个xml:
<aclEntry>
<aclEntryId>Stuff here</aclEntryId>
<principalName>Stuff here</principalName>
</aclEntry>
导致这个哈希:
{ :aclentryid => "Stuff Here", :principalname => "Stuff here" }
我查看了documentation的XmlSimple,并没有看到任何表明它可以在文档到哈希转换中保持混合大小写的选项。
有没有办法使用XmlSimple在结果哈希中保持区分大小写?如果没有,是否有另一种Ruby XML解析器可以生成一个像这样保持区分大小写的哈希?
答案 0 :(得分:1)
Nokogiri和Activesupport的结合将有所帮助。
require 'active_support/core_ext/hash/conversions'
require 'nokogiri'
require 'pp'
xml_doc = Nokogiri::XML("<aclEntry><aclEntryId>Stuff here</aclEntryId><principalName>Stuff here</principalName></aclEntry>")
h = Hash.from_xml(xml_doc.to_s).symbolize_keys
pp h #=> {:aclEntry=>{"aclEntryId"=>"Stuff here", "principalName"=>"Stuff here"}}
您也可以使用ReXML和Activesupport
执行相同的操作require 'rexml/document'
require 'pp'
include REXML
require 'active_support/core_ext/hash/conversions'
xmldoc = Document.new("<aclEntry><aclEntryId>Stuff here</aclEntryId><principalName>Stuff here</principalName></aclEntry>")
h = Hash.from_xml(xmldoc.to_s).symbolize_keys
pp h #=> {:aclEntry=>{"aclEntryId"=>"Stuff here", "principalName"=>"Stuff here"}}
编辑:经过一些阅读后发现,将一些选项传递给SimpleXML会产生你想要的结果,除了它没有象征着哈希键,但这是一个不同的问题击>
require 'xmlsimple'
require 'pp'
xml_str = <<XML_STR
<aclEntry>
<aclEntryId>Stuff here</aclEntryId>
<principalName>Stuff here</principalName>
</aclEntry>
XML_STR
result = XmlSimple.xml_in xml_str, { 'ForceArray' => false, 'AttrPrefix' => true, 'KeyToSymbol' => true }
pp result # =>{:principalName=>"Stuff here", :aclEntryId=>"Stuff here"}