首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby中将XHTML转换为多维哈希

Ruby中将XHTML转换为多维哈希
EN

Stack Overflow用户
提问于 2010-08-16 15:02:27
回答 1查看 193关注 0票数 1

我一直在寻找能让我获得给定XHTML字符串的多维散列的库。

XHTML:

代码语言:javascript
复制
<div class="class-1 class-2" id="my-id">
    <div class="classy">
    </div>
</div>

预期的哈希:

代码语言:javascript
复制
hash = {
:div => {
  :class => ['class-1', 'class-2'],
  :id => ['my-id'],
  :children => {
    :div => {
      :class => ['classy']
    }
  }
}
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-16 16:36:47

您的示例并没有对应该返回的内容给出明确的定义。文本节点是否被忽略?如果一个元素有多个<div>子元素,会发生什么?如果外部<div>元素有一个名为children的属性,会发生什么情况

除此之外,如果您有办法使用您选择的XML/HTML解析库的内置数据结构,并使用XPath查询到达您想要的数据节点,那么您可能不应该构建这样的结构。

忽略以上所有,这里是一个简单的开始,可能会接近你的想法。

代码语言:javascript
复制
require "nokogiri"

class Nokogiri::XML::Node
  def to_hash
    # Build hash of attributes. Attribute values are split into arrays.
    contents = Hash[attributes.collect { |name, value|
      [name.to_sym, value.to_s.split(/\s+/)] }]

    # Add array of child hashes recursively.
    if element_children.any?
      contents[:children] = element_children.collect { |child| child.to_hash }
    end

    # Return new hash with the element name as single key.
    { name.to_sym => contents }
  end
end

使用方法如下:

代码语言:javascript
复制
doc = Nokogiri::XML('<div class="class-1 class-2" id="my-id">
    <div class="classy">
    </div>
</div>')

doc.root.to_hash
#=> { :div =>
#     { :class => ["class-1", "class-2"],
#       :children =>
#         [ { :div =>
#             { :class => ["classy"] }
#           } ],
#       :id => ["my-id"]
#     }
#   }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3491183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档