我过去使用过perl,现在我转向ruby,或者更喜欢在perl旁边学习ruby。
我正在尝试从包含此类数据的xml文件中提取数据
<outline type="rss" text="w4kfu's bl0g" title="w4kfu's bl0g" xmlUrl="http://blog.w4kfu.com/?feed=rss" htmlUrl="http://blog.w4kfu.com"/>
我试图仅在text =&#34; blahblah&#34;的引号之间提取文本。和htmlUrl中的网址=&#34; http:// blahblahblah&#34;
这是我尝试解决这个问题
ruby -ne 'next if $_ =~ %r[text=\"([^"]*)\"]x and print $1, "\n"' file_name.xml
我知道ruby试图像perl一样强大但同时拥有更整洁的代码。对我来说,这个解决方案似乎有点儿了,我想知道什么是正确的红宝石方式。
答案 0 :(得分:2)
我建议使用真正的解析器解析XML。它具有更强大的优势。例如,如果另一个元素恰好具有text
属性,它将不会误报,并且它将容纳XML中的空格和换行符。
由于您提到您无法访问宝石(您应该使用这个:),这里使用标准库中的REXML。它不像Nokogiri那么干净,但也不算太差。
require 'rexml/document'
doc = REXML::Document.new open("file.xml")
REXML::XPath.each(doc, "//outline") do |element|
puts element.attributes["title"], element.attributes["htmlUrl"]
end
这里是一个ruby
命令行来打印标题:
ruby -r 'rexml/document' -e "doc = REXML::Document.new open('file_name.xml')"
-e "puts REXML::XPath.each(doc, '//outline').map{|el| el.attributes['title']}"
#=> w4kfu's bl0g
但我觉得你真的想要一个具有更多红宝石感的正则表达式解决方案。你走了:
ruby -ne 'puts $_.scan(/text=\"([^"]*)\"/)' file_name.xml
#=> w4kfu's bl0g