2013-05-29 50 views
3

我目前在Ruby中使用XmlSimple將XML轉換爲使用xml_in方法的哈希。除了生成的散列鍵全部爲小寫字母,而XML元素名稱爲混合大小寫外,所有內容都非常好。Ruby的區分大小寫的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

我提交錯誤...解析器的行爲是很醜陋... –

+0

一個最好的紅寶石的XML解析器是引入nokogiri,看看這裏http://nokogiri.org/ – Senjai

+0

它尚未更新一段時間,但[Crack](https://github.com/jnunemaker/crack)是一個不錯的簡單的XML和JSON解析器,可以保留大小寫。 –

回答

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"} 
+0

您正在使用哪個版本的xmlsimple gem?我有1.1.2,你提供的代碼返回一個散列,小寫的鍵仍然存在。也許這只是這個特定版本的xmlsimple中的一個錯誤? – dsw88

相關問題