HpricotのXPATHを使って属性名の小文字大文字を無視する

This entry was posted by admin on Tuesday, 5 January, 2010 at

HpricotのXPATHではlower-caseとupper-caseは使えなかったんですね。アイター。

ということでさっくりとコードいじりました。

例えばmetaタグのdescriptionを取り出すときに、以下のように大文字になっていると

<meta NAME="DESCRIPTION" ...>

次のようなxpathでは取り出せません。

//head/meta[@name=description]

これを解決するには以下のようにxpathの関数を使うのが理想なのですが

//head/meta[lower-case(@name)=description]

Hpricotでの実現方法が分からなかったのでElem::Travを直でいじるという乱暴な方法で解決しました。

#
# 属性へのアクセスは全て小文字に揃えます。
#
module Hpricot
  module Elem::Trav
    def has_attribute?(name)
      self.raw_attributes && self.raw_attributes.has_key?(name.to_s.downcase)
    end
    def get_attribute(name)
      a = self.raw_attributes && self.raw_attributes[name.to_s.downcase]
      a = Hpricot.uxs(a) if a
      a = a.downcase if (a && self.name.downcase == "meta" && name == "name")
      a
    end
    alias_method :[], :get_attribute
    def set_attribute(name, val)
      altered!
      self.raw_attributes ||= {}
      self.raw_attributes[name.to_s.downcase] = val.fast_xs
    end
    alias_method :[]=, :set_attribute
    def remove_attribute(name)
      name = name.to_s.downcase
      if has_attribute? name
        altered!
        self.raw_attributes.delete(name)
      end
    end
  end
end

これでmetaタグのname属性だけが全て小文字に揃います。


Leave a Reply