Oracle - Error parseando archivo XML desde Oracle

 
Vista:
Imágen de perfil de Daniel Rodas

Error parseando archivo XML desde Oracle

Publicado por Daniel Rodas (9 intervenciones) el 22/03/2018 00:22:10
Hola, espero me puedan ayudar.

Estuve buscando una forma de leer archivos XML desde Oracle, parsearlos y luego meterlos en una tabla local para hacer luego otros procesos. En el proceso encontré esta pagina: http://www.oracletool.com/blog/?p=25

La solución que dan alli es bien facil, creo el XML que ellos sugieren y me funciona perfectamente, pero cuando pruebo con un archivo real del tipo que yo debe leer ya no me funciona.

A continuación pongo una parte del XML que yo manejo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?xml version="1.0" encoding="utf-8"?>
	<Comprobante
		Version="3.3"
		Serie="A"
		Folio="39844"
		Fecha="2018-03-02T13:23:21"
		Sello="HwUIHEgz6psUFBONmW82K/Gk0nVffpHf3HPuAWaef5I4PhWPWgwMbyyk0BBz31mEzFfPIy5fRK/zyE4MA2iomnNR914uUWBy/V4Akt744Jh+vHzs2FXC8rFqJTPb0B+vMebHCWEsLvij2aAMYrQx76u9/ba8t5k+V+XD5Xt0OYQ="
		FormaPago="99"
		NoCertificado="20001000000100005869"
		Certificado="MIIEdDCCA1ygAwIBAgIUMjAwMDEwMDAwMDAxMDAwMDU4NjkwDQYJKoZIhvcNAQEFBQAwggFvMRgwFgYDVQQDDA9BLkMuIGRlIHBydWViYXMxLzAtBgNVBAoMJlNlcnZpY2lvIGRlIEFkbWluaXN0cmFjacOzbiBUcmlidXRhcmlhMTgwNgYDVQQLDC9BZG1pbmlzdHJhY2nDs24gZGUgU2VndXJpZGFkIGRlIGxhIEluZm9ybWFjacOzbjEpMCcGCSqGSIb3DQEJARYaYXNpc25ldEBwcnVlYmFzLnNhdC5nb2IubXgxJjAkBgNVBAkMHUF2LiBIaWRhbGdvIDc3LCBDb2wuIEd1ZXJyZXJvMQ4wDAYDVQQRDAUwNjMwMDELMAkGA1UEBhMCTVgxGTAXBgNVBAgMEERpc3RyaXRvIEZlZGVyYWwxEjAQBgNVBAcMCUNveW9hY8OhbjEVMBMGA1UELRMMU0FUOTcwNzAxTk4zMTIwMAYJKoZIhvcNAQkCDCNSZXNwb25zYWJsZTogSMOpY3RvciBPcm5lbGFzIEFyY2lnYTAeFw0xMjA3MjcxNzAyMDZaFw0xNjA3MjcxNzAyMDZaMIHbMSkwJwYDVQQDEyBBQ0NFTSBTRVJWSUNJT1MgRU1QUkVTQVJJQUxFUyBTQzEpMCcGA1UEKRMgQUNDRU0gU0VSVklDSU9TIEVNUFJFU0FSSUFMRVMgU0MxKTAnBgNVBAoTIEFDQ0VNIFNFUlZJQ0lPUyBFTVBSRVNBUklBTEVTIFNDMSUwIwYDVQQtExxBQUEwMTAxMDFBQUEgLyBIRUdUNzYxMDAzNFMyMR4wHAYDVQQFExUgLyBIRUdUNzYxMDAzTURGUk5OMDkxETAPBgNVBAsTCFVuaWRhZCAzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC0z7MP37WSVwL1iAoLzNVQD3G78/sMwHfLYmL0T7E65vFCPy/ELzkCNOUAytT+7Pvkh6+A6fDAqJrdSpmrl347SJK3WHJaTjYrJr+HVhkdNLR7lhXCdba0NEAmB0DOBZ5fq3aPvDuxsiWh0FxHNR4d5Iay31tn9Gn/TvK9ykMjswIDAQABox0wGzAMBgNVHRMBAf8EAjAAMAsGA1UdDwQEAwIGwDANBgkqhkiG9w0BAQUFAAOCAQEARBsRuNAaqy8iXlYHMz6u2btkxAQpGnhN9sHIkeq4asIQ26+ARVCXwiJ8pymh+0WiNix3JWkF82Mdqd3dJ0R0fIGxYk8EZ3iTYEi5F0uZiBX1JfkW/Hg3BH7qC5Yk/HWLCQPE3wxaOVQbOgmj4GpSqjjyvnWC5crDsvKp8GtvqrfQ+1edxFs+HSXyykQ2S/q3PpLJzPquuFKdShy3HBNDAdXhvlGZk3RJoVt4Yo07Sf9EyGPbAnpkYECIBhIH+sLwcWryAxgsWrPqIy93QaUfUKG0C0FjhwLMa26Dmoss5T9oCQDt1jBP16EbWVTlB63N6Lj4/4Gp63jbtAAjD34tSg=="
		SubTotal="22.91"
		Moneda="USD"
		TipoCambio="18.524800"
		Total="22.91"
		TipoDeComprobante="I"
		MetodoPago="PPD"
		LugarExpedicion="11000"
		xmlns:cce11="LALALALALALALALALALALALAL"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xsi:schemaLocation="LALALALALAKDKDKDKDKDKDKDKDKDKDKDKDKDK"
		xmlns:cfdi="http://www.MYPAGE.gob.mx/cfd/3">
		<Emisor
			Rfc="ACM040507RY2"
			Nombre="FJALKDFJALSFDJLAKFJDLAKSJFDLAKFJS"
			RegimenFiscal="601" />
		<Receptor
			Rfc="XEXX010101000"
			Nombre="JFSDKLFJSDLFKJSLKFDJSLKFDJSDLKFJ"
			ResidenciaFiscal="GTM"
			NumRegIdTrib="1079220"
			UsoCFDI="P01" />
		<Conceptos>
			<Concepto
				ClaveProdServ="52151700"
				NoIdentificacion="1100307"
				Cantidad="20"
				ClaveUnidad="EA"
				Unidad="Piezas"
				Descripcion="1100307  DESCRIPTION XXXXXXXX"
				ValorUnitario="1.15"
				Importe="22.91" />
		</Conceptos>

Esta es una parte de mi procedimiento que hace el parseo en PL/SQL:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
CREATE OR REPLACE PROCEDURE ADMINISTRATOR.PROCESS_XML AS
   V_XML                XMLTYPE;
   V_ROWCOUNT           NUMBER;
   V_DESCRIPCION        mytable.DESCRIPCION%TYPE;
   V_CONCEPTOSCOUNT     NUMBER;
   V_NOIDENTIFICACION   VARCHAR2(15);
   S_CODIGO_PT          VARCHAR2(15);
   S_DESCRIPCION        VARCHAR2(300);
BEGIN
   DBMS_OUTPUT.PUT_LINE('Getting directory listing');
   --
   -- The records in the DIR_LIST table will be removed on commit!
   --
   GET_DIR_LIST('XML_INBOUND');
 
   FOR I IN (SELECT FILE_NAME
             FROM   DIR_LIST
             WHERE  UPPER(FILE_NAME) LIKE '%.XML') LOOP
      V_ROWCOUNT         := 0;
      DBMS_OUTPUT.PUT_LINE('Filename: '|| I.FILE_NAME);
      GET_XML_FILE_FROM_OS('XML_INBOUND',I.FILE_NAME,V_XML);
      DBMS_OUTPUT.PUT_LINE('File loaded');
 
      -- Recorrer conceptos que es el detalle de codigos
      V_CONCEPTOSCOUNT := 1;
 
      WHILE v_XML.existsNode('/Comprobante/Conceptos/Concepto/['||V_CONCEPTOSCOUNT||']') = 1 LOOP
         V_DESCRIPCION      := V_XML.EXTRACT('/Comprobante/Conceptos/Concepto/['||V_CONCEPTOSCOUNT||']/Descripcion/text()').GETSTRINGVAL();
         S_CODIGO_PT        := TRIM(SUBSTR(V_DESCRIPCION,1,(LENGTH(V_DESCRIPCION) - (  LENGTH(V_DESCRIPCION) - INSTR(V_DESCRIPCION,' ')))));
         S_DESCRIPCION      := TRIM(SUBSTR(V_DESCRIPCION,INSTR(V_DESCRIPCION,' ') + 1,(LENGTH(V_DESCRIPCION) - INSTR(V_DESCRIPCION,' '))));
 
         INSERT INTO mytable
         VALUES      (S_CODIGO_PT, S_DESCRIPCION);
 
         V_CONCEPTOSCOUNT := V_CONCEPTOSCOUNT + 1;
      END LOOP;

El hecho es que cuando ejecuto el procedimiento anterior via SQLPLUS recibo el siguiente mensaje:
SQL> Exec process_xml;
BEGIN process_xml; END;

*
ERROR at line 1:
ORA-20111: ORA-31011: XML parsing failed
ORA-19202: Error occurred in XML processing
LPX-00601: Invalid token in: '/Comprobante/Conceptos/Concepto/[1]'Error en el
Stored Procedure PROCESS_XML
ORA-06512: at "ADMINISTRATOR.PROCESS_XML", line 48
ORA-06512: at line 1

He buscado por muchos sitios pero ninguno me da una solución satisfactoria. Imagino que tiene que ver con la estructura del archivo, pero no le veo por donde.

¿Tienen alguna idea?

Gracias anticipadas por cualquier ayuda
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 22
Ha mantenido su posición en Oracle (en relación al último mes)
Gráfica de Oracle

Error parseando archivo XML desde Oracle

Publicado por Cesar (8 intervenciones) el 22/03/2018 00:37:09
Hola.

Duda, ¿Porque quieres leer el XML (parece que es un CFDI 3.3 del SAT) directo desde Oracle?

Yo lo haria desde algun lenguaje de programacion.

Ejemplo, en mi caso, empleando el XSD del SAT, creo mi clase en C#, deserializo el XML a dicha clase, y ya puedo accesar a todos los nodos y atributos del XML, en forma de propiedades de mi clase en C#, y las inserto a la base de datos.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Daniel Rodas

Error parseando archivo XML desde Oracle

Publicado por Daniel Rodas (9 intervenciones) el 22/03/2018 17:28:01
Gracias por responder Cesar.

Te comento
* Desde un sistema generan facturas y las ponen en un repositorio al cual debo acceder y obtener los XML donde está la información que necesito.
* Quieren un proceso automático, sin intervención humana que corra por medio de scheduled jobs en la base de datos a ciertas horas.
* Una vez obtenida la información yo la meto en una tabla de oracle y genero con eso otro archivo, esta vez de texto para que lo lea otro sistema(as400), tambien por jobs automaticos para que con esa info actualicen otras tablas.

Me interesa lo que dijiste sobre el uso de XSD (no se que es eso o donde se obtiene), tambien una idea de como es eso de deserializar el XML a la clase creada en C# y que deberia hacerse en la clase ¿ tendras algun ejemplo practico (anonimo) que puedas compartir?

Yo habia pensado en algo con Java y que corra desde el S.O calendarizando el crontab, pero no estoy seguro.

PD: Si tienes alguna info me la puedes compartir al correo: [email protected]
Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 22
Ha mantenido su posición en Oracle (en relación al último mes)
Gráfica de Oracle

Error parseando archivo XML desde Oracle

Publicado por Cesar (8 intervenciones) el 23/03/2018 17:01:51
Hola.

El XSD, es el archivo que sirve para validar un XML. En el se definen que etiquetas y atributos son opcionales o obligatorios:

http://www.ticarte.com/contenido/que-son-los-esquemas-xsd

Para este caso (del CFDI 3.3), puedes bajar el XSD en la pagina del SAT:

http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd

O. K., te envio ejemplo al correo.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar