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

时间:2009-11-20 03:48:47

标签: xml ruby regex

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

XML字符串如下所示:

<?xml version="1.0"?>
<methodCall>
  <methodName>weblogUpdates.extendedPing</methodName>
  <params>
    <param>
      <value>Official Google Blog</value>
    </param>
    <param>
      <value>http://googleblog.blogspot.com/</value>
    </param>
    <param>
      <value>http://googleblog.blogspot.com/</value>
    </param>
    <param>
      <value>http://googleblog.blogspot.com/atom.xml</value>
    </param>
  </params>
</methodCall>

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

我想出了/<value>(.*)<\/value>/xi,但只是将第一个值设为:/

4 个答案:

答案 0 :(得分:3)

Parsing XML with Ruby is trivial,请不要尝试使用正则表达式解析XML - 这是非常困难且容易出错的。

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

答案 1 :(得分:2)

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

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

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

结果是:

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

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

require 'nokogiri'

doc = Nokogiri::XML(<<EOT)
<?xml version="1.0"?>
<methodCall>
  <methodName>weblogUpdates.extendedPing</methodName>
  <params>
    <param>
      <value>Official Google Blog</value>
    </param>
    <param>
      <value>http://googleblog.blogspot.com/</value>
    </param>
    <param>
      <value>http://googleblog.blogspot.com/</value>
    </param>
    <param>
      <value>http://googleblog.blogspot.com/atom.xml</value>
    </param>
  </params>
</methodCall>
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(<value>(.*)</value>),则使用"</value>"这样的正则表达式会发生内爆,并且陷入这些情况会潜入深深的兔子洞。