Ruby 从REST查询返回一项时,HttpParty XML解析器无法正常工作

Ruby 从REST查询返回一项时,HttpParty XML解析器无法正常工作,ruby,httparty,Ruby,Httparty,我试图使用HttpParty(在Ruby程序中)查询REST服务并解析XML代码 我发现了一个奇怪的问题,如果REST查询返回两个或多个元素,httparty会将它们视为散列数组 如果REST查询返回一个元素,HttpParty会将其视为散列(而不是包含一个元素的数组) 这有一个副作用,即我不能用“each”预先循环,因为当我对包含散列的变量执行此操作时,它会爆炸(而如果我对散列数组进行循环,则效果很好) 这是我正在使用的一段代码: response = self.class.get("/api

我试图使用HttpParty(在Ruby程序中)查询REST服务并解析XML代码

我发现了一个奇怪的问题,如果REST查询返回两个或多个元素,httparty会将它们视为散列数组

如果REST查询返回一个元素,HttpParty会将其视为散列(而不是包含一个元素的数组)

这有一个副作用,即我不能用“each”预先循环,因为当我对包含散列的变量执行此操作时,它会爆炸(而如果我对散列数组进行循环,则效果很好)

这是我正在使用的一段代码:

response = self.class.get("/api/vdc/#{vDC}/peers")

peers = response['References']['Reference']

peers.each do |peer|

# ....various stuff.... 

end 
“References”是主标记,“Reference”是返回的项目数,范围从1到多(如果1,代码失败,如果多,代码正常工作)

想法?谢谢


Massimo.

获得一致行为的一种快速而肮脏的方法是将结果放入数组并将其展平

对类敏感的方法:

response = self.class.get("/api/vdc/#{vDC}/peers")

peers = response['References']['Reference']
peers = [peers] if peers.is_a?(Hash)
response = self.class.get("/api/vdc/#{vDC}/peers")

peers = [response['References']['Reference']].flatten
不区分类的方法:

response = self.class.get("/api/vdc/#{vDC}/peers")

peers = response['References']['Reference']
peers = [peers] if peers.is_a?(Hash)
response = self.class.get("/api/vdc/#{vDC}/peers")

peers = [response['References']['Reference']].flatten

这样,无论返回单个散列还是散列数组,每次都将结果视为散列数组。您需要确定展平方法的费用是否太高-非常大的数组可能需要一些时间/内存才能展平。

听起来您可以做以下两件事之一:1)检查对象
的类型,并相应地采取行动;2)创建自定义httparty解析器(请参阅)#1绝对是较低的努力水平。我现在采用的解决方法是检查“对等点”是一个散列还是一个散列数组,并在此基础上分别不使用每个循环进行迭代或使用每个循环进行迭代。我希望有人能告诉我显而易见的事情,我做错了什么。谢谢事实上,这是解决这个问题最简单的方法。您还可以通过查看我发布的链接来创建自定义解析器。这太棒了。压扁技巧正是我所需要的。现在,我可以使用EACH进行迭代,而不必考虑重新运行的记录数。它同时适用于1条记录和2条以上记录。酷!非常感谢,当然。如果传入的值是数组本身,请小心。。。展平将采用所有数组和子数组,并将所有数组值放入一个一维数组。@BenH
Flatte
还采用可选参数定义展平的嵌套级别,例如
Flatte(2)
将只展平到嵌套数组的两个级别,不再深入。