试图用Nokogiri解析可能非常深层嵌套的xml文件

时间:2011-09-18 19:27:36

标签: ruby-on-rails xml nokogiri

我一直试图找到足够具体的例子来说明如何进行。我正在使用Builder创建xml文件以供导出/导入使用。我从应用程序导出此文件,导入时我想基于此xml文件创建新数据到数据库。模型之间的关系完好无损。

我有几个问题的类别,每个问题有几个答案,可能会触发一个或多个问题。

我制作了xml文件的简化版:https://gist.github.com/1225431

正如我自己做的那样,如果我应该以不同的方式准备xml文件,我也愿意接受建议。

questions = doc.css('questions')

这就是我现在的位置,所以就在开始时。我发现的所有例子都是针对完全不同的问题(或者我觉得)。

我甚至使用合适的工具来完成这份工作吗?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

Nokogiri是Ruby的一个优秀的XML / HTML解析库,所以你肯定使用正确的工具来完成工作。由于您正在解析XML文档,因此您应该使用XPath而不是CSS选择器。幸运的是,Nokogiri has you covered

Nokogiri文档有一些basic, helpful usage tutorialsThis one回答了你的问题。

以下是特定于您的问题的代码示例。希望这足以让你开始:

require 'nokogiri'

# Reads the `example.xml` file from the current directory.
file    = File.read("example.xml")

# Uses Nokogiri::XML to parse the file.
doc     = Nokogiri::XML(file)

# Iterate over each <question> element and print 
# the text inside the first <name> element of each.
doc.xpath("//question").each do |q|
    puts q.at("name").text

    # Iterate over each <selection> element within the
    # current question and print its <name> and <conditional> 
    # line "name: conditional"
    q.xpath("./selection").each do |selection|
        puts "#{selection.at("name").text}: #{selection.at("conditional").text}"
    end

    # Same as above, but use variables.
    q.xpath("./selection").each do |selection|
        name                = selection.at("name").text
        conditional = selection.at("conditional").text

        puts "#{name}: #{conditional}"
    end
end