Ruby on rails 试图用Nokogiri解析可能嵌套得很深的xml文件

Ruby on rails 试图用Nokogiri解析可能嵌套得很深的xml文件,ruby-on-rails,xml,nokogiri,Ruby On Rails,Xml,Nokogiri,我一直在试图找到足够具体的例子来说明如何进行。我正在使用Builder创建xml文件以供导出/导入使用。我正在从应用程序导出此文件,导入时我希望基于此xml文件创建新记录到数据库。模型之间的关系保持不变 我有几个问题的分类,每个问题都有几个答案,可能会引发一个或多个进一步的问题 我制作了xml文件的简化版本: 由于我自己在做这件事,如果我应该以不同的方式准备xml文件,我也愿意接受建议 questions = doc.css('questions') 这就是我现在的位置,所以从一开始。我发现的

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

我有几个问题的分类,每个问题都有几个答案,可能会引发一个或多个进一步的问题

我制作了xml文件的简化版本:

由于我自己在做这件事,如果我应该以不同的方式准备xml文件,我也愿意接受建议

questions = doc.css('questions')
这就是我现在的位置,所以从一开始。我发现的所有例子都是针对完全不同类型的问题,或者我觉得是这样


我是否使用了适合这份工作的工具?非常感谢您的帮助。

Nokogiri是Ruby的一个很棒的XML/HTML解析库,因此您肯定使用了合适的工具来完成这项工作。因为您正在解析XML文档,所以应该使用CSS选择器,而不是CSS选择器。幸运的是

Nokogiri文档有几个方面。回答你的问题

下面是一个针对您的问题的代码示例。希望这足以让您开始:

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

谢谢你的回复。我尝试了xpath和css,但最后总是卡住了。我最终艰难地度过了这一关。我对每种类型、问题和选择都做了自己的节点设置。然后循环通过它们进入数据库。不太好看,但至少它能用。我在nokogiri.org上读了又读,但还是没能把我的头脑集中在它上面。不过有一个问题。这个doc.xpath//question不也会选择选项中的问题作为条件问题吗?那是我最头疼的事。是的,它会返回所有的街区。如果您只查找顶层,您可能希望执行类似于doc.xpath//questions/questions这样的操作,这会将其限制为仅为的直接子元素。我将代码修改了一点。速度提高约30%。我认为,我在开始时遇到的最棘手的问题是:q.xpath./斜杠前的点选择产生了所有的不同。