Hatena::Groupkdri

KazusaAPI開発日誌 このページをアンテナに追加 RSSフィード

2008-01-28

REXML::XPath は xhtml では @class などが働かない

|  REXML::XPath は xhtml では @class などが働かない - KazusaAPI開発日誌 を含むブックマーク はてなブックマーク -  REXML::XPath は xhtml では @class などが働かない - KazusaAPI開発日誌  REXML::XPath は xhtml では @class などが働かない - KazusaAPI開発日誌 のブックマークコメント

require 'rexml/document'

doc = REXML::Document.new(%q|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" 
  "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<body>
<div id='1' class='aaa'></div>
</body>
</html>
| )
p REXML::XPath.match(doc, "//div[@class='aaa']")
p REXML::XPath.match(doc, "//div[@id='1']")

doc = REXML::Document.new(%q|
<html>
<body>
<div id='1' class='aaa'></div>
</body>
</html>
| )
p REXML::XPath.match(doc, "//div[@class='aaa']")
p REXML::XPath.match(doc, "//div[@id='1']")

doc = REXML::Document.new(%q|
<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" 
  "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<body>
<div id='1' class='aaa'></div>
</body>
</html>
| )
p REXML::XPath.match(doc, "//div[@class='aaa']")
p REXML::XPath.match(doc, "//div[@id='1']")

doc = REXML::Document.new(%q|
<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" 
  "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html>
<body>
<div id='1' class='aaa'></div>
</body>
</html>
| )
p REXML::XPath.match(doc, "//div[@class='aaa']")
p REXML::XPath.match(doc, "//div[@id='1']")

を実行するとxhtmlclass名やidからエレメントが取れていないことがわかります。

[]
[]
[<div class='aaa' id='1'/>]
[<div class='aaa' id='1'/>]
[]
[]
[<div class='aaa' id='1'/>]
[<div class='aaa' id='1'/>]

まとめ

  1. <html> だと処理できる。
  2. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> だと処理できない。
  3. <html xmlns=""> ですら処理できない。
  4. どうにかならないものでしょうか(´ー`)
  5. もしくは何か勘違いしているのでしょうか。

そのつづき(解決編)

Google でさまざまな検索をした結果、no title 経由で 500 Internal Server Error に至って解決。/opt/local/lib/ruby/1.8/rexml/element.rb に 556 行目を追加。

553     def attribute( name, namespace=nil )
554       prefix = nil
555       prefix = namespaces.index(namespace) if namespace
556       prefix = nil if prefix == 'xmlns'
557       attributes.get_attribute( "#{prefix ? prefix + ':' : ''}#{name}" )
558     end