微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从 xml 中获取值并计算

如何解决从 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 中提取带有 ConceptoImpuesto 值的 Importe 对象,那么您不需要组合不同的数组,而是使用结构良好的对象。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。