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.

Était-ce utile?

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')
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top