XPath がわからない。
#!/usr/bin/ruby require 'rexml/document' xml = <<XHTML <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>hoge</title> </head> <body> <select name="s1"> <option>s1-o1</option> <option>s1-o2</option> <option>s1-o3</option> </select> <select name="s2"> <option>s2-o1</option> <option>s2-o2</option> <option>s2-o3</option> </select> </body> </html> XHTML if __FILE__ == $0 doc = REXML::Document.new xml REXML::XPath.match(doc, '//select') do |s| puts s.attributes['name'] + ": " + s.elements.to_a('option').map{|o| o.text}.join(", ") end end
[babie@rouge:2]$ ruby xpath-check.rb [babie@rouge:2]$
うーん、うーん…… untmsntm
XML Path Language (XPath) バージョン 1.0 - 2.5 省略シンタックス
//para はドキュメントルートの para という名前の子孫エレメントをすべて選択する。つまり、コンテキストノードと同じドキュメント内の para という名前のエレメントをすべて選択する。
合ってると思うんだけどなぁ。
追記:
REXML::Elements#each(xpath) でできた。
if __FILE__ == $0 doc = REXML::Document.new xml doc.elements.each('//select') do |s| puts s.attributes['name'] + ": " + s.elements.to_a('option').map{|o| o.text}.join(", ") end end
$ ruby xpath-check.rb s1: s1-o1, s1-o2, s1-o3 s2: s2-o1, s2-o2, s2-o3