如何将Nokogiri Document对象转换为JSON

|| 我有一些解析后的“ 0”对象,要打印为JSON。 我可以采用以下方法:将其创建为字符串,将其解析为哈希,使用active-record或Crack,然后使用Hash.to_json;。但这既丑陋又取决于图书馆的管理方式。 有没有更简单的方法? 根据注释中的请求,例如XML
<root a=\"b\"><a>b</a></root>
可以表示为JSON:
<root a=\"b\"><a>b</a></root> #=> {\"root\":{\"a\":\"b\"}}
<root foo=\"bar\"><a>b</a></root> #=> {\"root\":{\"a\":\"b\",\"foo\":\"bar\"}}
这也是我现在用Crack获得的。而且,可以肯定的是,实体和子标签之间的冲突是一个潜在的问题,但是我自己构建了大多数XML,因此对我而言,最简单的是避免这些冲突:)     
已邀请:
        这是做到这一点的一种方法。如我的评论所述,“正确”的答案取决于您的输出结果。 JSON中没有XML节点的规范表示,因此所涉及的库没有内置这种功能:
require \'nokogiri\'
require \'json\'
class Nokogiri::XML::Node
  def to_json(*a)
    {\"$name\"=>name}.tap do |h|
      kids = children.to_a
      h.merge!(attributes)
      h.merge!(\"$text\"=>text) unless text.empty?
      h.merge!(\"$kids\"=>kids) unless kids.empty?
    end.to_json(*a)
  end
end
class Nokogiri::XML::Document
  def to_json(*a); root.to_json(*a); end
end
class Nokogiri::XML::Text
  def to_json(*a); text.to_json(*a); end
end
class Nokogiri::XML::Attr
  def to_json(*a); value.to_json(*a); end
end

xml = Nokogiri::XML \'<root a=\"b\" xmlns:z=\"zzz\">
  <z:a>Hello <b z:x=\"y\">World</b>!</z:a>
</root>\'
puts xml.to_json
{
  \"$name\":\"root\",
  \"a\":\"b\",
  \"$text\":\"Hello World!\",
  \"$kids\":[
    {
      \"$name\":\"a\",
      \"$text\":\"Hello World!\",
      \"$kids\":[
        \"Hello \",
        {
          \"$name\":\"b\",
          \"x\":\"y\",
          \"$text\":\"World\",
          \"$kids\":[
            \"World\"
          ]
        },
        \"!\"
      ]
    }
  ]
}
请注意,以上内容完全忽略了名称空间,名称空间可能是您想要的,也可能不是。 转换为JsonML 这是转换为JsonML的另一种选择。尽管这是有损转换(它不支持注释节点,DTD或名称空间URL),并且格式设计上有点“愚蠢”(第一个子元素是
[1]
[2]
,取决于属性是否存在),它确实指示元素和属性的名称空间前缀:
require \'nokogiri\'
require \'json\'
class Nokogiri::XML::Node
  def namespaced_name
    \"#{namespace && \"#{namespace.prefix}:\"}#{name}\"
  end
end
class Nokogiri::XML::Element
  def to_json(*a)
    [namespaced_name].tap do |parts|
      unless attributes.empty?
        parts << Hash[ attribute_nodes.map{ |a| [a.namespaced_name,a.value] } ]
      end
      parts.concat(children.select{|n| n.text? ? (n.text=~/\\S/) : n.element? })
    end.to_json(*a)
  end
end
class Nokogiri::XML::Document
  def to_json(*a); root.to_json(*a); end
end
class Nokogiri::XML::Text
  def to_json(*a); text.to_json(*a); end
end
class Nokogiri::XML::Attr
  def to_json(*a); value.to_json(*a); end
end

xml = Nokogiri::XML \'<root a=\"b\" xmlns:z=\"zzz\">
  <z:a>Hello <b z:x=\"y\">World</b>!</z:a>
</root>\'
puts xml.to_json
#=> [\"root\",{\"a\":\"b\"},[\"z:a\",\"Hello \",[\"b\",{\"z:x\":\"y\"},\"World\"],\"!\"]]
    
        这对我有用:
Hash.from_xml(@nokogiri_object.to_xml).to_json
此方法正在使用主动支撑,因此,如果您不使用滑轨,则请手动包括主动支撑核心扩展:
require \'active_support/core_ext/hash\'
    

要回复问题请先登录注册