سؤال

هل هناك طريقة سهلة لتحويل وثيقة XML Nokogiri إلى تجزئة؟

وشيء من هذا القبيل Hash.from_xml القضبان ".

هل كانت مفيدة؟

المحلول

نصائح أخرى

إذا كنت ترغب في تحويل مستند XML Nokogiri إلى تجزئة، تفعل ما يلي:

require 'active_support/core_ext/hash/conversions'
hash = Hash.from_xml(nokogiri_document.to_s)

وهنا صيغة أبسط بكثير يخلق تجزئة قوية يتضمن معلومات مساحة الاسم، سواء بالنسبة للعناصر والصفات:

require 'nokogiri'
class Nokogiri::XML::Node
  TYPENAMES = {1=>'element',2=>'attribute',3=>'text',4=>'cdata',8=>'comment'}
  def to_hash
    {kind:TYPENAMES[node_type],name:name}.tap do |h|
      h.merge! nshref:namespace.href, nsprefix:namespace.prefix if namespace
      h.merge! text:text
      h.merge! attr:attribute_nodes.map(&:to_hash) if element?
      h.merge! kids:children.map(&:to_hash) if element?
    end
  end
end
class Nokogiri::XML::Document
  def to_hash; root.to_hash; end
end

وتواجد في العمل:

xml = '<r a="b" xmlns:z="foo"><z:a>Hello <b z:m="n" x="y">World</b>!</z:a></r>'
doc = Nokogiri::XML(xml)
p doc.to_hash
#=> {
#=>   :kind=>"element",
#=>   :name=>"r",
#=>   :text=>"Hello World!",
#=>   :attr=>[
#=>     {
#=>       :kind=>"attribute",
#=>       :name=>"a", 
#=>       :text=>"b"
#=>     }
#=>   ], 
#=>   :kids=>[
#=>     {
#=>       :kind=>"element", 
#=>       :name=>"a", 
#=>       :nshref=>"foo", 
#=>       :nsprefix=>"z", 
#=>       :text=>"Hello World!", 
#=>       :attr=>[], 
#=>       :kids=>[
#=>         {
#=>           :kind=>"text", 
#=>           :name=>"text", 
#=>           :text=>"Hello "
#=>         },
#=>         {
#=>           :kind=>"element", 
#=>           :name=>"b", 
#=>           :text=>"World", 
#=>           :attr=>[
#=>             {
#=>               :kind=>"attribute", 
#=>               :name=>"m", 
#=>               :nshref=>"foo", 
#=>               :nsprefix=>"z", 
#=>               :text=>"n"
#=>             },
#=>             {
#=>               :kind=>"attribute", 
#=>               :name=>"x", 
#=>               :text=>"y"
#=>             }
#=>           ], 
#=>           :kids=>[
#=>             {
#=>               :kind=>"text", 
#=>               :name=>"text", 
#=>               :text=>"World"
#=>             }
#=>           ]
#=>         },
#=>         {
#=>           :kind=>"text", 
#=>           :name=>"text", 
#=>           :text=>"!"
#=>         }
#=>       ]
#=>     }
#=>   ]
#=> }

ولقد وجدت هذا في حين تحاول ببساطة تحويل XML إلى تجزئة (وليس في القضبان). كنت أفكر أود أن استخدام Nokogiri، ولكن انتهى الأمر مع نوري .

وبعد ذلك كان قانون بلدي trival:

response_hash = Nori.parse(response)

وأشار

وباقي الأعضاء إلى أن هذا لا يعمل. أنا لم التحقق، ولكن يبدو أن طريقة التحليل قد تم نقله من فئة إلى المثيل. قانون بلدي عملت فوق في مرحلة ما. أن القانون الجديد (لم يتم التحقق منها) على النحو التالي:

response_hash = Nori.new.parse(response)

Nokogiri لتحليل استجابة XML إلى روبي التجزئة. انها سريعة جدا.

doc = Nokogiri::XML(response_body) 
Hash.from_xml(doc.to_s)

إذا كنت تعرف شيئا من هذا القبيل في التكوين الخاص بك:

ActiveSupport::XmlMini.backend = 'Nokogiri'

وأنه يتضمن وحدة نمطية في Nokogiri ويمكنك الحصول على طريقة to_hash.

إذا العقدة التي اخترتها في Nokogiri تتكون من علامة واحدة فقط، يمكنك استخراج مفاتيح وقيم والرمز البريدي لهم في التجزئة واحد، كما يلي:

  @doc ||= Nokogiri::XML(File.read("myxmldoc.xml"))
  @node = @doc.at('#uniqueID') # this works if this selects only one node
  nodeHash = Hash[*@node.keys().zip(@node.values()).flatten]

http://www.ruby-forum.com/topic/125944 لمزيد من المعلومات حول روبي مجموعة الدمج.

وإلقاء نظرة على هذا المزيج في البسيط الذي أدليت به لNokogiri XML عقدة.

http://github.com/kuroir/Nokogiri-to-Hash

وإليك مثال الاستعمال:

require 'rubygems'
require 'nokogiri'
require 'nokogiri_to_hash'
html = '
  <div id="hello" class="container">
    <p>Hello! visit my site <a href="http://kuroir.com">Kuroir.com</a></p>
  </div>
'
p Nokogiri.HTML(html).to_hash
=> [{:div=>{:class=>["container"], :children=>[{:p=>{:children=>[{:a=>{:href=>["http://kuroir.com"], :children=>[]}}]}}], :id=>["hello"]}}]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top