Ruby 如何仅检索未嵌套的元素?

Ruby 如何仅检索未嵌套的元素?,ruby,nokogiri,Ruby,Nokogiri,我正在尝试解析一些XML内容,在本例中是使用一些产品: <PRODUCTS> <PRODUCT> <NAME><![CDATA[Some name]]></NAME> <CATEGORIES> <CATEGORY> <NAME><![CDATA[Category 1]]></NAME> </CATEGORY>

我正在尝试解析一些XML内容,在本例中是使用一些产品:

<PRODUCTS>
  <PRODUCT>
    <NAME><![CDATA[Some name]]></NAME>
    <CATEGORIES>
      <CATEGORY>
        <NAME><![CDATA[Category 1]]></NAME>
      </CATEGORY>
      <CATEGORY>
        <NAME><![CDATA[Category 2]]></NAME>
      </CATEGORY>
    </CATEGORIES>
  </PRODUCT>
  <PRODUCT>
    <NAME><![CDATA[Some other name]]></NAME>
    <CATEGORIES>
      <CATEGORY>
        <NAME><![CDATA[Category 1]]></NAME>
      </CATEGORY>
      <CATEGORY>
        <NAME><![CDATA[Category 2]]></NAME>
      </CATEGORY>
    </CATEGORIES>
  </PRODUCT>
</PRODUCTS>
我还获取每个产品的嵌套
名称
元素


如何仅获取未嵌套的
名称
?我知道
product.at_css(“NAME”)
只返回第一个元素,但我的问题不是如何获取第一个元素,而是如何获取未嵌套的元素。

您可以使用
仅选择
NAME
元素,这些元素是
产品的直接子元素:

doc.css("PRODUCT").each do |product|
  puts product.css("> NAME")
end
这将输出以下内容:

<NAME><![CDATA[Some name]]></NAME>
<NAME><![CDATA[Some other name]]></NAME>

您可以使用以下命令

doc.css("PRODUCT").each do |product|
   puts product.css("NAME").first
end
使用:

.xpath(“NAME”)
在本例中,只返回直接后代。css子选择器也可以达到同样的效果

doc.css("PRODUCT").each do |product| 
  puts product.css("> NAME").first
end

但这取决于XML的顺序。如果
类别
名称
被切换,它将返回第一个类别的名称。当然,你的答案要好得多!谢谢,但这正是我所说的,我不想看到的。谢谢,但这将完全改变事情的顺序。它会将操作限制为仅与一种元素一起工作。如果我想逐个产品执行一系列任务,我不能使用这种方法,因为在这种方法中,事情是按元素名逐个元素名完成的。@JohnSmith1976查看更新的版本。我最初的例子是简明扼要的,当然你不必马上使用组合选择器。
doc.xpath("PRODUCTS/PRODUCT").each do |product| 
  puts product.xpath("NAME").first
end
doc.css("PRODUCT").each do |product| 
  puts product.css("> NAME").first
end