[英]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.