Nokogiri解析含有多个命名空间的XML文件
当使用 Nokogiri::XML::Documen 的 at(), xpath() 方法不能获得XML文件中的元素(element)时,可能的原因就是,该XML文件中存在的多个命名空间所致。对于该问题,Nokogiri有两个解决办法。
其一,使用类 Nokogiri::XML::Document 的 remove\namespaces! 方法强制删除XML文件中的所有命名空间,然后就可以使用 at(), xpath() 方法得到相关的元素(element)了。
其二,使用该类的方法 collect\namespaces() 得到XML文件中全部的命名空间,然后,将其作为 at(), xpath() 方法的第二个参数传入。为方便使用,可以用以下代码为类 Nokogiri::XML::Document 增加了两个方法 get\element() 和 get\elements()
require 'nokogiri' module Nokogiri module XML class Document def get_element xpath set_namespace unless @namespaces at xpath, @namespaces end def get_elements xpath set_namespace unless @namespaces xpath xpath, @namespaces end private def set_namespace @namespaces = {} collect_namespaces.each_pair do |key, value| @namespaces[key.sub(/^xmlns:/, '')] = value end end end end end
参考文章