我过去一直使用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="blahblah"和url在htmlUrl="http://blahblahblah"的url
这是我解决这个问题的尝试
ruby -ne 'next if $_ =~ %r[text="([^"]*)"]x and print $1, "n"' file_name.xml
我知道ruby试图像perl一样强大,但同时拥有更整洁的代码。这个解决方案对我来说似乎有点像perl,我想知道正确的红宝石路是什么。
我建议使用真正的解析器解析XML。它的优点是更健壮。例如,如果另一个元素恰好具有text
属性,它将不会误报,并且它将在XML中容纳空白和换行符。
既然您提到您无法访问gems(您应该解决这个问题:),这里有一些使用标准库中的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