Ruby Regexp用于提取XML字符串中的特定元素

我有一个简单的XML字符串,或多或少总是一样的。 我宁愿避免使用XML解析器来处理这么一小段代码,尽管Regexp会有所帮助。

XML字符串如下所示:

  weblogUpdates.extendedPing   Official Google Blog   http://googleblog.blogspot.com/   http://googleblog.blogspot.com/   http://googleblog.blogspot.com/atom.xml    

我想提取每个参数的值(并保持顺序)。

我提出了/(.*)/xi但是它只是将第一个值变为:/ /

使用Ruby解析XML是微不足道的 ,请不要尝试使用正则表达式解析XML – 这是非常困难且容易出错的。

尽管尝试使用正则表达式可能很诱人,但请不要这样做。 无论你怎么努力用螺丝刀砸碎钉子都不会像锤子一样 – 请使用众多精美的锤子中的一把。

作为一个侧面评论,对于这个特定的应用程序,它可能会感到困难,但学习Nokogiri或libXML可以帮助您做出更复杂的XML解析的决定。 此外,在Ruby中解析XML实际上非常简单,并且正确行事正确的方法至少可以让您在客户端最终请求您做一些荒谬的超出范围涉及完整的XML解析时,轻松扩展到一个非平凡的方法。 🙂

对于其他框架和技术,我可能不会推荐这样的投资,但Nokogiri是无痛的。 如果你只是想玩,你可以尝试Hpricot并获得当天_why的剂量(RIP)。

通常你应该使用XML解析器,但我仍然认为它有点矫枉过正。

如果你像我一样,我会这样做:

 x = File.new("test.xml", "r").read puts x.scan(/(.*)<\/value>/) 

结果如下:

 Official Google Blog http://googleblog.blogspot.com/ http://googleblog.blogspot.com/ http://googleblog.blogspot.com/atom.xml 

如果你想遍历每个值,你可以这样做:

 x.scan(/(.*)<\/value>/) do |x| puts x end 

我认为没有理由使用正则表达式而不是真正的解析器。 简单的使用是一个可怕的借口,并不是真的:

 require 'nokogiri' doc = Nokogiri::XML(<  weblogUpdates.extendedPing   Official Google Blog   http://googleblog.blogspot.com/   http://googleblog.blogspot.com/   http://googleblog.blogspot.com/atom.xml    EOT puts doc.search('value').map(&:text) 

运行输出:

 Official Google Blog http://googleblog.blogspot.com/ http://googleblog.blogspot.com/ http://googleblog.blogspot.com/atom.xml 

如果需要更具体,请使用更具体的CSS路径向下钻取:

 doc.search('param value') 

如果包含的文本包含"" ,那么使用正则表达式(例如%r((.*))将会发生爆炸,并且捕获这些情况会潜入深深的兔子洞。