2013-05-29 2 views
3

В настоящее время я использую XmlSimple в Ruby для преобразования XML в хэш с помощью метода xml_in. Все действительно приятно, за исключением того факта, что полученные хеш-ключи являются строчными, тогда как имена элементов XML были смешанными.Синтаксический анализатор XML для Ruby

Вот пример:

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, и не видел ни одной опции, указывающей на то, что он может поддерживать смешанный регистр в конвейере document-to-hash ersion.

Есть ли способ использовать XmlSimple для поддержания чувствительности к регистру в результате хэша? Если нет, существует ли альтернативный синтаксический анализатор Ruby XML, который может генерировать хэш, который поддерживает чувствительность к регистру?

+0

Я бы файл ошибка ... Поведение парсера очень некрасиво ... –

+0

Один из лучших рубин XML парсеров является nokogiri, проверить его здесь http://nokogiri.org/ – Senjai

+0

It не был обновлен какое-то время, но [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"}} 

EDIT: Сделав немного чтения выясняется, что передача некоторых параметров в 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 вы используете? У меня есть 1.1.2, и ваш код, который вы предоставили, возвращает хэш с младшими клавишами. Может быть, это всего лишь ошибка в этой конкретной версии xmlsimple? – dsw88