2016-07-08 21 views
0

私はこのスクリプトを通して以下のXMLからenvelope_idを80621b17-97a8-926d945b602aとして取得しようとしていますが、何も出ていません。誰にでも分かりますか?Oracle XMLTABLE名前空間の問題

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; 

私のサンプルXMLは次のとおりです。

<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

エラーが発生しますか? – Andrej

+0

ありがとうAndrej!私は何のエラーも表示せず、単に何も表示しませんでした。しかし、以下のMottotからの答えはうまくいきます。おかげで –

答えて

0

あなたはデフォルトの名前空間を使用することができます。ちょうど 'デフォルト'と言う:)。また、XML文書の場合と同じように見えます。

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; 

また、バリアントを修復することもできます。まず、xmlドキュメントに「docusign」ではなく「docgign」があります。両方のいずれかを修復します。これはデフォルトの名前空間で、最後の変更であるため、 'EnvelopeID' 'K:EnvelopeID':とと 'EnvelopeStatus/K:DocuSignEnvelopeInformation/K' 変更 ':DocuSignEnvelopeInformation/xsd_k EnvelopeStatus/xsd_k' より

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; 
デフォルトの名前空間宣言が要素で使用されている場合

HERE(デフォルトの名前空間を検索)

参照してください、その範囲内のすべての 非修飾要素名が自動的に指定された名前空間識別子に関連付けられた です。

これはDocuSignEnvelopeInformationとこれに属するすべてのノードに名前空間xmlns = "http://www.docusign.net/API/3.0"があるためです。この名前空間が定義されていない場合、ノードは名前空間がなくなり、xmltableに名前空間を使用する必要はありません。

+0

ありがとうMottor!それは今働いた。ここでスペルミス(「docusign」ではなく「docgign」)を除いて、なぜxsd_kを使用してはいけないのか分かりません。いつ私がデフォルトのものを使うべきか、そしていつ他のものを使うべきか?事前に感謝します –

+0

@xml_programmerデフォルトの名前空間はすべてのノードです(名前空間名を使用せず、ルートノードに名前空間があるため)名前のない名前空間xmlns = "http://www.docusign.net/API /3.0 "となる。他のすべての名前は「xsi」、「xsd」です。そして、ノードが名前空間の下になければならない場合、その名前はのように使用されるべきです。私が書いたマカロンはどうですか? :) – Mottor

+0

ありがとう非常に! –

関連する問題