【问题标题】:how to parse repeated elements with nokogiri如何用 nokogiri 解析重复的元素
【发布时间】:2011-06-05 21:28:25
【问题描述】:

我是 Nokogiri 的新手,那么如何解析“数据”及其文本,以及 以下xml中“方法”中的“名称”:

<get_escalators_response status="200" status_text="OK">
<escalator id="6181e65d-8ba0-4937-9c44-8f2b10b0def7">
 <name>Team alert</name>
 <comment/>
 <in_use>1</in_use>
 <condition>
   Threat level at least
   <data>
     High
     <name>level</name>
   </data>
 </condition>
 <event>
   Task run status changed
   <data>
     Done
     <name>status</name>
   </data>
 </event>
 <method>
   Email
   <data>
     team@example.org
     <name>to_address</name>
   </data>
   <data>
     admin@example.org
     <name>from_address</name>
   </data>
   <data>
     0
     <name>notice</name>
   </data>
 </method>
</escalator>
...
</get_escalators_response>

【问题讨论】:

    标签: ruby-on-rails ruby xml nokogiri


    【解决方案1】:

    将您的 XML 分配给一个名为 xml 的变量,我会这样做:

    require 'nokogiri'
    require 'pp'
    
    doc = Nokogiri::XML(xml)
    pp doc.search('//method/data').map{ |n| n.text.scan(/\S+/) }
    

    注意这是返回一个数组数组。将数据强制转换为字符串或哈希很容易。

    # >> [["team@example.org", "to_address"],
    # >>  ["admin@example.org", "from_address"],
    # >>  ["0", "notice"]]
    

    【讨论】:

      【解决方案2】:

      有几种方法可以做到这一点,这里是一种:

      doc = Nokogiri::XML("your_xml_document")
      doc.search("data").each do |data|
        name = data.search("name").remove # remove the name element from data element
        name_text = name.text
        data_text = data.text
        # do stuff with text
      end
      

      您可以像这样搜索特定的嵌套元素:

      doc.search("method > data").each do |data|
        # do stuff
      end
      

      【讨论】:

      • 谢谢,但如果我只想从“方法”而不是“条件”或“事件”中获取名称/数据怎么办?
      • 没关系,doc.search("method/data").each 做 |data| ......似乎工作。再次感谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-17
      • 1970-01-01
      • 2013-08-15
      相关资源
      最近更新 更多