Ruby libXML Xpath find在result中返回结果



用Ruby libXML解析XML文档时,我注意到一个奇怪的行为。当搜索某些元素并遍历结果时,我在结果本身中获得结果对象。

下面是一个示例XML

<?xml version="1.0" encoding="UTF-8"?>
<main>
    <projects>
        <project id="1">
            <name>Project 1</name>
            <van>Guus</van>
        </project>
        <project id="2">
            <name>Project 2</name>
            <van>Guus</van>
        </project>
    </projects>
</main>

解析代码(控制器):

 @projects = @xmlDoc.find('//project[@id]/name')

显示它(视图):

<ul>
<%= @projects.each do |pr| %>
    <li><%= pr.first.content %></li>
<% end %>
</ul>
<hr>
<%= @projects.inspect%>

结果:

- Project 1
- Project 2
  #<LibXML::XML::XPath::Object:0x000008153182c0>  
------------------------------------------------------------------------
#<LibXML::XML::XPath::Object:0x000008153182c0>

可以看到,该列表包含XPath对象self。我有意将其显示为一个项目列表,并在一条水平线后显示一个inspect。如你所见,最后一项前面没有子弹。但它从何而来?是我漏了什么还是这是个bug?

each的返回值是结果对象本身。在您的代码中,由于您在<%= @projects.each do |pr| %>行中使用=,因此您将每个项目作为列表项(在块中)打印出来,,然后打印来自each 的返回值。

解决方案是使用<% ... %>(即不使用=):

<ul>
<% @projects.each do |pr| %>
    <li><%= pr.first.content %></li>
<% end %>
</ul>

最新更新