简体   繁体   English

使用 Java (DOM) 从 XML 读取特定数据

[英]Read specific data from XML using Java (DOM)

I want to extrat some data from an invoice (XML) using Java.我想使用 Java 从发票 (XML) 中提取一些数据。 I'm using the example on this link ( https://www.mkyong.com/java/how-to-read-xml-file-in-java-dom-parser/ ) The problem is my XML doesn't look like the one in the example, here is mine:我正在使用此链接上的示例( https://www.mkyong.com/java/how-to-read-xml-file-in-java-dom-parser/ )问题是我的 XML 看起来不就像示例中的那样,这是我的:

<?xml version="1.0" encoding="UTF-8"?>
<cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/3" xmlns:bfa2="http://www.buzonfiscal.com/ns/addenda/bf/2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" NumCtaPago="4007" LugarExpedicion="CUAJIMALPA DE MORELOS,CIUDAD DE MEXICO" metodoDePago="99" tipoDeComprobante="ingreso" total="2490" subTotal="2146.55" fecha="2016-12-14T10:23:08" folio="57318" serie="BT" version="3.2" xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv32.xsd http://www.buzonfiscal.com/ns/addenda/bf/2 http://www.buzonfiscal.com/schema/xsd/Addenda_BF_v20.xsd">
   <cfdi:Emisor nombre="BEST BUY STORES S. DE R.L. DE C.V." rfc="BBS070606D33">
      <cfdi:DomicilioFiscal codigoPostal="05348" pais="MEXICO" estado="CIUDAD DE MEXICO" municipio="CUAJIMALPA DE MORELOS" referencia="EDIFICIO CENTURY PLAZA" colonia="SANTA FE CUAJIMALPA" noInterior="PISO 2 OFNA 202 Y 203 P3 Y P4" noExterior="440" calle="AV. SANTA FE" />
      <cfdi:ExpedidoEn codigoPostal="05348" pais="MEXICO" estado="CIUDAD DE MEXICO" municipio="CUAJIMALPA DE MORELOS" colonia="SANTA FE" calle="AVENIDA SANTA FE NO. 440 PISO 2 (OFICINA 203 Y 204),PISO 3 Y PISO 4" />
      <cfdi:RegimenFiscal Regimen="Regimen General de Ley Personas Morales" />
   </cfdi:Emisor>
   <cfdi:Receptor nombre="VIALCOMA S.A DE C.V" rfc="VIA8011248W0">
      <cfdi:Domicilio codigoPostal="54080" pais="México" estado="Estado de México" municipio="Tlalnepantla de Baz" referencia="VIALCOMA S.A. de C.V." localidad="Tlalnepantla de Baz" colonia="EL MIRADOR" noExterior="107" calle="AV. GUSTAVO BAZ " />
   </cfdi:Receptor>
   <cfdi:Conceptos>
      <cfdi:Concepto importe="2146.55" valorUnitario="2146.55" descripcion="PANASONIC PHONE KX-PRD260MEB" noIdentificacion="000000001000189023" unidad="PZA" cantidad="1" />
   </cfdi:Conceptos>
   <cfdi:Impuestos totalImpuestosTrasladados="343.45">
      <cfdi:Traslados>
         <cfdi:Traslado importe="343.45" tasa="16.0" impuesto="IVA" />
      </cfdi:Traslados>
   </cfdi:Impuestos>
   <cfdi:Complemento>
      <tfd:TimbreFiscalDigital xmlns:tfd="http://www.sat.gob.mx/TimbreFiscalDigital" xsi:schemaLocation="http://www.sat.gob.mx/TimbreFiscalDigital http://www.sat.gob.mx/sitio_internet/cfd/TimbreFiscalDigital/TimbreFiscalDigital.xsd" UUID="2e36935c-4948-4f7b-9b29-477546aa2922" version="1.0" />
   </cfdi:Complemento>
   <cfdi:Addenda>
      <bfa2:AddendaBuzonFiscal version="2.0">
         <bfa2:Receptor email="" />
         <bfa2:TipoDocumento descripcion="Factura" nombreCorto="FAC" />
         <bfa2:CFD totalConLetra="Dos mil cuatrocientos noventa pesos 00/100 M.N." fechaEnvio="2016-12-12T10:42:15-06:00" />
         <bfa2:Extra valor="02028001014520161212" atributo="numTicket" />
      </bfa2:AddendaBuzonFiscal>
   </cfdi:Addenda>
</cfdi:Comprobante>

I want to get (print on console) the data on "folio" "serie" and "UUID"我想获取(在控制台上打印)关于“folio”、“serie”和“UUID”的数据

Can someone help me please?有人能帮助我吗?

The following should give your desire output.This example is based on DOM parser as you have provide.以下应该给出您想要的输出。本示例基于您提供的 DOM 解析器。

   System.out.println("Root element :" + doc.getDocumentElement().getNodeName());

   NodeList nList = doc.getElementsByTagName("cfdi:Comprobante");

   org.w3c.dom.Node nNode = nList.item(0);

   System.out.println("folio: " + ((Element) nNode).getAttribute("folio"));
   System.out.println("serie: " + ((Element) nNode).getAttribute("serie"));

   NodeList list = doc.getElementsByTagName("cfdi:Complemento");
   for (int i = 0; i < 1; i++) {
    NodeList child = list.item(i).getChildNodes();
    for (int j = 0; j < child.getLength(); j++) {
     if (child.item(j).getNodeName().equals("tfd:TimbreFiscalDigital")) {
      String uuid = ((Element)(child.item(j))).getAttribute("UUID");
      System.out.println("UUID : " + uuid);
     }
    }
   }

console output:控制台输出:

Root element :cfdi:Comprobante
----------------------------
folio: 57318
serie: BT
UUID : 2e36935c-4948-4f7b-9b29-477546aa2922

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM