ruby – 如何将Nokogiri Document对象转换成JSON
发布时间:2020-12-16 19:56:41 所属栏目:百科 来源:网络整理
导读:我有一些解析了我想打印为 JSON的Nokogiri :: XML :: Document对象. 我可以去做一个字符串的路由,解析成一个哈希,使用活动记录或者Crack,然后是Hash.to_json;但是这是丑陋的,也是依靠方式太Manay图书馆. 有没有一个简单的方法? 根据注释中的请求,例如XML ro
我有一些解析了我想打印为
JSON的Nokogiri :: XML :: Document对象.
我可以去做一个字符串的路由,解析成一个哈希,使用活动记录或者Crack,然后是Hash.to_json;但是这是丑陋的,也是依靠方式太Manay图书馆. 有没有一个简单的方法? 根据注释中的请求,例如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","$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"],"!"]] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- NSString boundingRectWithSize:options:attri
- AJAX回调函数内部给全局变量赋值后,在外部调用居
- c# – IEnumerable与IObservable的不同之处是什么
- Unity3D如何使用Sqlite数据库
- ruby-on-rails-3.2 – Capistrano删除资产
- [Swift]LeetCode102. 二叉树的层次遍历 | Binary
- Solaris 下自动安装依赖软件的工具pkgutil
- ruby-on-rails – 如何在用户会话中首次跟踪控制
- ruby-on-rails – Rails 4 Asset Pipeline链接
- Oracle导出表空间的创建语句、导入、导出dmp文件
热点阅读