繁体   English   中英

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

[英]Ruby Regexp to extract specific elements in an XML string

我有一个简单的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但这只是第一个值:/

使用Ruby解析XML是微不足道的 ,请不要尝试使用正则表达式来解析XML-众所周知,这很困难且容易出错。

虽然尝试使用正则表达式可能很诱人,但请不要使用。 无论您多么努力地用螺丝刀砸碎钉子,它都不会像锤子一样工作-请使用许多出色的锤子之一。

通常,您应该使用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

顺便提一句,对于这个特定的应用程序,可能会感到困难,但是学习Nokogiri或libXML可能会帮助您做出更复杂的XML解析决策。 此外,如今在Ruby中解析XML确实非常简单,并且当您的客户端最终要求您执行涉及完整XML解析的可笑的事情时,“正确的方法”至少可以轻松地将其扩展为非简单的方法。 :)

对于其他框架和技术,我可能不推荐这种投资,但是Nokogiri毫不费力。 而且,如果您只是想玩游戏,可以尝试Hpricot并获得当天的_why剂量(RIP)。

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

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')

如果所包含的文本包含"</value>" ,则使用%r(<value>(.*)</value>)类的正则表达式会“沉迷"</value>"并且陷入那些情况会陷入一个非常深的兔子洞。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM