从 xml 中获取值并计算

Get value from xml and calculate

我正在从 xml 文件中获取金额,但我需要对它们求和以进行检查。 我在 rails 上使用 Ruby 和 Nokogiri gem 来自 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)例如:

我是 rails 的新手,非常感谢您的帮助

如果两个数组的大小相同(我想是的),您可以 return 一个包含结果的数组,如下所示:

(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 中提取具有 ImpuestoImporte 值的 Concepto 对象,那么您不需要组合不同的数组,但使用结构良好的对象。