如何解决从 xml 中获取值并计算
我从一个 xml 文件中获取金额,但我需要将它们相加以进行检查。 我正在使用带有 Nokogiri gem 的 Ruby on rails 来自 xml 文件的示例:
<cfdi:Conceptos>
<cfdi:Concepto ClaveProdServ="15101514" NoIdentificacion="PL/762/EXP/ES/2015-16665610" Cantidad="52.967" ClaveUnidad="LTR" Descripcion="MAGNA (LT)" ValorUnitario="16.34" Importe="865.74">
<cfdi:Impuestos>
<cfdi:Traslados>
<cfdi:Traslado Base="842.59" Impuesto="002" TipoFactor="Tasa" TasaOCuota="0.160000" Importe="134.81"/>
</cfdi:Traslados>
</cfdi:Impuestos>
</cfdi:Concepto>
<cfdi:Concepto ClaveProdServ="15101514" NoIdentificacion="PL/767/EXP/ES/2015-8515840" Cantidad="35.045" ClaveUnidad="LTR" Descripcion="MAGNA (LT)" ValorUnitario="16.34" Importe="572.80">
<cfdi:Impuestos>
<cfdi:Traslados>
<cfdi:Traslado Base="557.49" Impuesto="002" TipoFactor="Tasa" TasaOCuota="0.160000" Importe="89.20"/>
</cfdi:Traslados>
</cfdi:Impuestos>
</cfdi:Concepto>
<cfdi:Concepto ClaveProdServ="15101514" NoIdentificacion="PL/762/EXP/ES/2015-16665910" Cantidad="21.992" ClaveUnidad="LTR" Descripcion="MAGNA (LT)" ValorUnitario="16.34" Importe="359.45">
<cfdi:Impuestos>
<cfdi:Traslados>
<cfdi:Traslado Base="349.84" Impuesto="002" TipoFactor="Tasa" TasaOCuota="0.160000" Importe="55.97"/>
</cfdi:Traslados>
</cfdi:Impuestos>
</cfdi:Concepto>
<cfdi:Concepto ClaveProdServ="15101514" NoIdentificacion="PL/762/EXP/ES/2015-16665560" Cantidad="25.002" ClaveUnidad="LTR" Descripcion="MAGNA (LT)" ValorUnitario="16.34" Importe="408.62">
<cfdi:Impuestos>
<cfdi:Traslados>
<cfdi:Traslado Base="397.69" Impuesto="002" TipoFactor="Tasa" TasaOCuota="0.160000" Importe="63.63"/>
</cfdi:Traslados>
</cfdi:Impuestos>
</cfdi:Concepto>
我设法用这行代码获得了所有的金额和税款:
array = []
array_i = []
file = Nokogiri::XML(File.open(params[:consumption][:factura]))
doc_pass = file.xpath("//cfdi:Comprobante/cfdi:Conceptos/cfdi:Concepto")
doc_pass.each do |pass|
hash_importe = {}
hash_importe[:total] = pass['Importe']
array << hash_importe
end
doc_pass2 = file.xpath("//cfdi:Comprobante/cfdi:Conceptos/cfdi:Concepto/cfdi:Impuestos/cfdi:Traslados/cfdi:Traslado")
doc_pass2.each do |pass2|
hash_impuesto = {}
hash_impuesto[:tax] = pass2['Importe']
array_i << hash_impuesto
end
这些是我从 xml 文件中得到的结果:
(byebug) array
[{:importe=>"865.74"},{:importe=>"572.80"},{:importe=>"359.45"},{:importe=>"408.62"},{:importe=>"324.48"},{:importe=>"649.64"},{:importe=>"823.45"},{:importe=>"545.15"},{:importe=>"428.02"},{:importe=>"527.21"},{:importe=>"487.67"},{:importe=>"331.72"},{:importe=>"511.64"},{:importe=>"406.67"},{:importe=>"820.81"},{:importe=>"1635.54"},{:importe=>"484.14"},{:importe=>"564.83"},{:importe=>"1463.30"}]
(byebug) array_i
[{:importe=>"134.81"},{:importe=>"89.20"},{:importe=>"55.97"},{:importe=>"63.63"},{:importe=>"50.52"},{:importe=>"101.18"},{:importe=>"128.21"},{:importe=>"84.88"},{:importe=>"66.73"},{:importe=>"82.10"},{:importe=>"75.90"},{:importe=>"51.58"},{:importe=>"79.67"},{:importe=>"63.33"},{:importe=>"127.80"},{:importe=>"254.69"},{:importe=>"75.36"},{:importe=>"87.92"},{:importe=>"227.84"}]
现在我想要的是将两个值相加(importe + impuesto)例如:
- 865.74 + 134.81
- 572.80 + 89.20
- 359.45 + 55.97
我是 Rails 新手,非常感谢您的帮助
解决方法
如果两个数组的大小相同,您可以返回一个带有结果的数组(我认为是的),如下所示:
(0..array.size - 1).each_with_object([]) { |i,obj| obj << array[i][:importe].to_f + array_i[i][:importe].to_f }
结果:
[1000.55,662.0,415.41999999999996,472.25,375.0,750.8199999999999,951.6600000000001,630.03,494.75,609.3100000000001,563.57,383.3,591.31,470.0,948.6099999999999,1890.23,559.5,652.75,1691.1399999999999]
,
使用zip
方法组合两个数组对应索引处的值
result = array.zip(array_i)
.map { |importe,impuesto| importe[:importe].to_f + impuesto[:importe].to_f }
或者可以为您的具体数据结构进一步简化
result = array.zip(array_i).map { |hashes| hashes.sum {|h| h[:importe].to_f }}
更好的方法是,如果您直接从 xml 中提取带有 Concepto
和 Impuesto
值的 Importe
对象,那么您不需要组合不同的数组,而是使用结构良好的对象。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。