3

我目前在 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" } 

我查看了 XmlSimple 的文档,没有看到任何选项表明它可以在文档到哈希的转换中保持大小写混合。

有没有办法使用 XmlSimple 在生成的哈希中保持区分大小写?如果没有,是否有替代的 Ruby XML 解析器可以生成像这样保持区分大小写的哈希?

4

1 回答 1

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"}
于 2013-05-29T16:47:00.007 回答