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

参考文章

Last Updated 2015-11-15 Sun 15:55.

Created by Howard Hou with Emacs 24.5.1 (Org mode 8.2.10)