2009-03-12 13 views
2

ich in ausgewählten Teil der Abfrage folgende Anweisung verwende:Wie kann ich die XML-DTD-Validierung in Oracle DB deaktivieren?

extract(XMLTYPE(doc.payload),'/SHOW_SHIPMENT_005/DATAAREA/SHOW_SHIPMENT/SHIPMENT/SHIPITEM/DOCUMNTREF/DOCUMENTID') 

es funktioniert gut, wenn die doc.payload enthält XML ohne DTD Erklärung, sondern wirft einen Fehler, wenn DTD Erklärung vorhanden ist, wie Oracle, das Dokument zu validieren versucht, aber kann die DTD nicht finden.

Wie Sie die XML Validierung für diese Abfrage deaktivieren? Ich möchte meine Sitzungseinstellung und globale Systemeinstellung in diesem Fall nicht beeinflussen.

Antwort

4

Sie können Validierung deaktivieren, wenn Sie eine XMLTYPE erstellen, sieht Konstruktor Signatur wie folgt aus:

XMLType(
    xmlData IN varchar2, 
    schema IN varchar2 := NULL, 
    validated IN number := 0, 
    wellformed IN number := 0) 

So können Sie die Validierung wie folgt deaktivieren:

extract(XMLTYPE(doc.payload, NULL, 1, 1), 
'/SHOW_SHIPMENT_005/DATAAREA/SHOW_SHIPMENT/SHIPMENT/SHIPITEM/DOCUMNTREF/DOCUMENTID') 

Dies wird Ihnen allerdings nicht helfen, wenn Sie eine externe DTD-Referenz haben. Es würde immer noch versuchen, es zu laden. Ist es nicht möglich, die DTD-Datei in das XMLDB-Repository hochzuladen? Das wäre die einfachste Lösung. Wenn nicht, gibt es keine ‚nette‘ Lösung ist, müssen Sie die DTD-Referenz loszuwerden, bevor die XMLTYPE erstellen:

extract(XMLTYPE(REGEXP_REPLACE(doc.payload, '<!DOCTYPE[^<]*>', '')), 
'/SHOW_SHIPMENT_005/DATAAREA/SHOW_SHIPMENT/SHIPMENT/SHIPITEM/DOCUMNTREF/DOCUMENTID') 
+0

Referenzen in XML die ich verwende, sind lokale, ich bin zur Zeit zu Hause, aber sobald ich wieder zu arbeite ich werde das sicher überprüfen :) Danke! –

Verwandte Themen