babie steps

作業療法記録

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