我一直在寻找能让我获得给定XHTML字符串的多维散列的库。
XHTML:
<div class="class-1 class-2" id="my-id">
<div class="classy">
</div>
</div>预期的哈希:
hash = {
:div => {
:class => ['class-1', 'class-2'],
:id => ['my-id'],
:children => {
:div => {
:class => ['classy']
}
}
}
}发布于 2010-08-16 16:36:47
您的示例并没有对应该返回的内容给出明确的定义。文本节点是否被忽略?如果一个元素有多个<div>子元素,会发生什么?如果外部<div>元素有一个名为children的属性,会发生什么情况
除此之外,如果您有办法使用您选择的XML/HTML解析库的内置数据结构,并使用XPath查询到达您想要的数据节点,那么您可能不应该构建这样的结构。
忽略以上所有,这里是一个简单的开始,可能会接近你的想法。
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使用方法如下:
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"]
# }
# }https://stackoverflow.com/questions/3491183
复制相似问题