2016-07-08 3 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'을 사용합니다. 둘 중 하나를 수리하십시오. '/ K : DocuSignEnvelopeInformation/K : EnvelopeStatus'와 ': DocuSignEnvelopeInformation/xsd_k EnvelopeStatus/xsd_k'변화보다,이 디폴트의 이름 공간이며 마지막 변경에와 함께 'EnvelopeID'때문에 '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; 
을 기본 네임 스페이스 선언이 요소에 사용하는 경우

의 범위 내의 모든 비정규 요소 이름이 자동으로 지정된 네임 스페이스 식별자와 연관된 있으며,

HERE (기본 네임 스페이스에 대한 검색)를 참조하십시오.

DocuSignEnvelopeInformation과 그 아래의 다른 모든 노드에는 xmlns = "http://www.docusign.net/API/3.0"네임 스페이스가 있기 때문입니다. 이 네임 스페이스가 정의되지 않은 경우 노드는 네임 스페이스가 없으므로 xmltable에서 네임 스페이스를 사용할 필요가 없습니다.

+0

고마워! 그것은 지금 일했습니다. 맞춤법 오류 ('docusign'대신 'docgign')를 제외하고는 왜 xsd_k를 사용하면 안되는지 궁금합니다. 언제 디폴트 하나를 사용해야하고 다른 것들을 사용해야합니까? 미리 감사드립니다. –

+0

@xml_programmer 기본 네임 스페이스는 모든 노드입니다 (네임 스페이스 이름을 사용하지 않고 루트 노드에 네임 스페이스가 있기 때문에) 이름이없는 네임 스페이스 xmlns = "http://www.docusign.net/API /3.0 "입니다. 다른 모든 이름은 "xsi", "xsd"입니다. 그리고 노드가 이름 공간 아래에 있어야 할 때 이름은 와 같이 사용되어야합니다. 내가 쓴 마카롱은? :) – Mottor

+0

대단히 감사합니다! –