2016-07-08 25 views
0

Ich versuche, Envelope_id als 80621b17-97a8-926d945b602a aus dem folgenden XML durch dieses Skript zu erhalten, aber nichts kommt heraus. Kann jemand eine Idee haben?Oracle XMLTABLE Namespace Problem

SELECT b.EnvelopeID 
FROM sample_xml a, 
     XMLTABLE(xmlnamespaces('http://www.w3.org/2001/XMLSchema' as "xsd_k", 
           'http://www.w3.org/2001/XMLSchema-instance' AS "xsi", 
           'http://www.docusign.net/API/3.0' AS "k"), 
     '/xsd_k:DocuSignEnvelopeInformation/xsd_k:EnvelopeStatus' PASSING a.xml 
         COLUMNS EnvelopeID  VARCHAR2(200) PATH 'EnvelopeID')b; 

Meine Probe xml ist:

<DocuSignEnvelopeInformation xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.docgign.net/API/3.0"> 
    <EnvelopeStatus> 
    <EnvelopeID>80621b17-97a8-926d945b602a</EnvelopeID> 
    </EnvelopeStatus> 
</DocuSignEnvelopeInformation> 
+0

Haben Sie Fehler? – Andrej

+0

Danke Andrej! Ich habe keine Fehler bekommen, einfach nichts angezeigt. Aber die Antwort von Mottot unten funktioniert gut. Vielen Dank –

Antwort

0

Sie den Standard-Namespace verwenden können. Sag einfach "Standard" :). Und sehen Sie so aus wie in Ihrem XML-Dokument:

SELECT b.EnvelopeID 
FROM (SELECT xmltype (' 
<DocuSignEnvelopeInformation xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.docgign.net/API/3.0"> 
    <EnvelopeStatus> 
    <EnvelopeID>80621b17-97a8-926d945b602a</EnvelopeID> 
    </EnvelopeStatus> 
</DocuSignEnvelopeInformation>') AS xml FROM DUAL) a, 
     XMLTABLE(xmlnamespaces(default 'http://www.docgign.net/API/3.0'), 
     '/DocuSignEnvelopeInformation/EnvelopeStatus' PASSING a.xml 
         COLUMNS EnvelopeID  VARCHAR2(200) PATH 'EnvelopeID')b; 

Wir können auch Ihre Variante reparieren. Zuerst haben Sie 'docgign' anstelle von 'docusign' im XML-Dokument. Repariere eines der beiden. Als Änderung '/ xsd_k: DocuSignEnvelopeInformation/xsd_k: EnvelopeStatus' mit '/ k: DocuSignEnvelopeInformation/k: EnvelopeStatus', denn dies ist der Standard-Namespace und letzte Änderung 'EnvelopeID' mit 'k: EnvelopeID':

SELECT EnvelopeID 
FROM (SELECT xmltype (' 
<DocuSignEnvelopeInformation xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.docusign.net/API/3.0"> 
    <EnvelopeStatus> 
    <EnvelopeID>80621b17-97a8-926d945b602a</EnvelopeID> 
    </EnvelopeStatus> 
</DocuSignEnvelopeInformation>') AS xml FROM DUAL) a, 
     XMLTABLE(xmlnamespaces('http://www.w3.org/2001/XMLSchema' as "xsd_k", 
           'http://www.w3.org/2001/XMLSchema-instance' AS "xsi", 
           'http://www.docusign.net/API/3.0' AS "k"), 
     '/k:DocuSignEnvelopeInformation/k:EnvelopeStatus' PASSING a.xml 
         COLUMNS EnvelopeID  VARCHAR2(200) PATH 'k:EnvelopeID')b; 

Siehe HERE (Suche nach Standard-Namespace)

Wenn eine Standard-Namespace-Deklaration für ein Element verwendet wird, wird alle unqualifizierten Elementnamen in ihrem Umfang sind automatisch mit der angegebenen Namespace-Kennung zugeordnet ist.

Das ist der Grund, weil DocuSignEnvelopeInformation und alle anderen Knoten darunter den Namensraum xmlns = "http://www.docusign.net/API/3.0" haben. Wenn dieser Namespace nicht definiert wäre, hätten die Knoten keinen Namespace und Sie müssten den Namespace in der XML-Tabelle nicht verwenden.

+0

Vielen Dank Mottor! Es hat jetzt funktioniert. Abgesehen von dem Schreibfehler ('docgign' statt 'docusign') habe ich mich gefragt, ob ich nicht sicher bin, warum ich xsd_k nicht verwenden sollte. Wann sollte ich Standard verwenden und wann sollte ich die anderen verwenden? Vielen Dank im Voraus –

+0

@xml_programmer Der Standard-Namespace, unter dem alle Knoten sind (weil sie keinen Namespacenamen verwenden und der Namespace auf dem Stammknoten liegt), ist der Namespace ohne den Namen xmlns = "http://www.docusign.net/API" /3.0 ". Alle anderen haben Namen "xsi", "xsd". Und wenn der Knoten unter dem Namensraum mit dem Namen sein sollte, sollte der Name wie verwendet werden. Was für Macaron habe ich geschrieben? :) – Mottor

+0

Vielen Dank! –