【问题标题】:Case-sensitive XML parser for RubyRuby 的区分大小写的 XML 解析器
【发布时间】:2013-05-24 23:31:39
【问题描述】:

我目前在 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 的 documentation,没有看到任何选项表明它可以在文档到哈希的转换中保持大小写混合。

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

【问题讨论】:

  • 我会提交一个错误...解析器的行为非常丑陋...
  • 最好的 ruby​​ xml 解析器之一是 nokogiri,在这里查看 nokogiri.org
  • 已经有一段时间没有更新了,但是Crack 是一个不错的简单 XML 和 JSON 解析器,可以保留大小写。

标签: ruby case-sensitive xml-simple


【解决方案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"}

【讨论】:

  • 您使用的是哪个版本的 xmlsimple gem?我有 1.1.2,您提供的代码仍然返回带有小写键的哈希。也许这只是这个特定版本的 xmlsimple 中的一个错误?
猜你喜欢
  • 2012-03-09
  • 2018-03-11
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多