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:
Esta es una parte de mi procedimiento que hace el parseo en PL/SQL:
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
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
0