Comment désactiver la validation de la DTD XML dans Oracle DB?
-
10-07-2019 - |
Question
J'utilise l'instruction suivante dans une partie sélectionnée de la requête:
extract(XMLTYPE(doc.payload),'/SHOW_SHIPMENT_005/DATAAREA/SHOW_SHIPMENT/SHIPMENT/SHIPITEM/DOCUMNTREF/DOCUMENTID')
cela fonctionne bien si le doc.payload
contient du XML
sans déclaration DTD
, mais génère une erreur lorsque DTD
déclaration est présente car Oracle tente de valider le document mais ne trouve pas la DTD
.
Comment désactiver la validation XML
pour cette requête? Je ne veux pas affecter mon paramètre de session ni celui du système global dans cette affaire.
La solution
Vous pouvez désactiver la validation lorsque vous créez un XMLTYPE. La signature du constructeur ressemble à ceci:
XMLType(
xmlData IN varchar2,
schema IN varchar2 := NULL,
validated IN number := 0,
wellformed IN number := 0)
Vous pouvez donc désactiver la validation de la manière suivante:
extract(XMLTYPE(doc.payload, NULL, 1, 1),
'/SHOW_SHIPMENT_005/DATAAREA/SHOW_SHIPMENT/SHIPMENT/SHIPITEM/DOCUMNTREF/DOCUMENTID')
Cela ne vous aidera pas si vous avez une référence DTD externe. Il essaierait toujours de le charger. N'est-il pas possible de télécharger le fichier DTD dans le référentiel XMLDB? Ce serait la solution la plus simple. Sinon, il n'y a pas de solution «intéressante», vous devez vous débarrasser de la référence DTD avant de créer XMLTYPE:
extract(XMLTYPE(REGEXP_REPLACE(doc.payload, '<!DOCTYPE[^<]*>', '')),
'/SHOW_SHIPMENT_005/DATAAREA/SHOW_SHIPMENT/SHIPMENT/SHIPITEM/DOCUMNTREF/DOCUMENTID')