¿Cómo deshabilitar la validación XML DTD en Oracle DB?
-
10-07-2019 - |
Pregunta
Estoy usando la siguiente declaración en la parte seleccionada de la consulta:
extract(XMLTYPE(doc.payload),'/SHOW_SHIPMENT_005/DATAAREA/SHOW_SHIPMENT/SHIPMENT/SHIPITEM/DOCUMNTREF/DOCUMENTID')
funciona bien si doc.payload
contiene XML
sin declaración DTD
, pero genera un error cuando DTD
la declaración está presente cuando Oracle intenta validar el documento pero no puede encontrar el DTD
.
¿Cómo deshabilitar la validación XML
para esta consulta? No quiero afectar la configuración de mi sesión ni la configuración del sistema global en este asunto.
Solución
Puede desactivar la validación cuando crea un XMLTYPE, la firma del constructor se ve así:
XMLType(
xmlData IN varchar2,
schema IN varchar2 := NULL,
validated IN number := 0,
wellformed IN number := 0)
Para que pueda desactivar la validación de esta manera:
extract(XMLTYPE(doc.payload, NULL, 1, 1),
'/SHOW_SHIPMENT_005/DATAAREA/SHOW_SHIPMENT/SHIPMENT/SHIPITEM/DOCUMNTREF/DOCUMENTID')
Sin embargo, esto no lo ayudará si tiene una referencia de DTD externa. Todavía intentaría cargarlo. ¿No es posible cargar el archivo DTD en el repositorio XMLDB? Esa sería la solución más simple. Si no, no hay una solución 'agradable', debe deshacerse de la referencia DTD antes de crear XMLTYPE:
extract(XMLTYPE(REGEXP_REPLACE(doc.payload, '<!DOCTYPE[^<]*>', '')),
'/SHOW_SHIPMENT_005/DATAAREA/SHOW_SHIPMENT/SHIPMENT/SHIPITEM/DOCUMNTREF/DOCUMENTID')