아래에 언급 된 xml 문자열이 있습니다.
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
xmlns:ser="http://service.soap.CDRator.com" xmlns:xsd="http://data.soap.CDRator.com/xsd"
xmlns:xsd1="http://core.data.soap.CDRator.com/xsd" xmlns:xsd2="http://core.result.service.soap.CDRator.com/xsd">
<soap:Body>
<ser:generateArchiveDocument>
<!--Optional:-->
<ser:contextUser>
<!--Optional:-->
<xsd:brandKey>QAMSP</xsd:brandKey>
</ser:contextUser>
<!--Optional:-->
<ser:subscription>
<!--Optional:-->
<xsd1:id>201505261213407749</xsd1:id>
</ser:subscription>
<!--Optional:-->
<ser:letterKey>POS_CONTRACT_PRIVATE</ser:letterKey>
</ser:generateArchiveDocument>
</soap:Body>
</soap:Envelope>
나는 문자열에서 값을 얻기 위해 선택 쿼리 아래 작성한 <xsd1:id>201505261213407749</xsd1:id>
와 <ser:letterKey>POS_CONTRACT_PRIVATE</ser:letterKey>
. 이 문자열에서 값을 얻고 싶지만 쿼리는 아무것도 반환하지 않습니다.
내 선택 쿼리는 다음과 같습니다.
SELECT ID,xt_req.SUBSCRIPTION_ID,CREATE_DATE,WEB_SERVICE_NAME,WEB_METHOD_NAME
FROM TEMP_SOAP_GENERATE_CONTRACT sm
CROSS JOIN XMLTable(XMLNAMESPACES (
'http://www.w3.org/2003/05/soap-envelope' AS "xsd1"
),
'for $i in //xsd1:id return $i'
passing XMLType(sm.REQUEST_XML)
columns "SUBSCRIPTION_ID" number path '/') xt_req
CROSS JOIN XMLTable(XMLNAMESPACES (
'http://www.w3.org/2003/05/soap-envelope' AS "ser"
),
'for $i in ser:letterKey return $i'
passing XMLType(sm.REQUEST_XML)
columns "LETTER_KEY" VARCHAR2(1000) path '/') xt_letterkey;
네임 스페이스 별칭에 제공하는 URL은 XML에 정의 된 것과 일치해야합니다.
CROSS JOIN XMLTable(XMLNAMESPACES (
'http://core.data.soap.CDRator.com/xsd' AS "xsd1"
),
과
CROSS JOIN XMLTable(XMLNAMESPACES (
'http://service.soap.CDRator.com' AS "ser"
),
네임 스페이스 별칭은 원래 XML에서 사용 된 별칭과 일치 할 필요가 없습니다. 다른 이름으로 호출 할 수 있지만 혼란 스러울 수 있으므로 권장하지 않습니다. 하지만 URL은 일치해야합니다. 노드를 일치시키는 데 사용되는 네임 스페이스 별칭이 나타내는 URL입니다. 따라서이 woudl도 작동합니다. 예 :
CROSS JOIN XMLTable(XMLNAMESPACES (
'http://core.data.soap.CDRator.com/xsd' AS "my_alias"
),
'for $i in //my_alias:id return $i'
그리고 seconf XMLTable의 경우 XPath는 최상위 요소를 찾고 있습니다. 처음과 같이 할 수있는 간단한 일이 함께 이전 수준을 무시하는 것입니다 //ser:letterKey
오히려 단지보다 //ser:letterKey
.
따라서 합치면 :
SELECT ID,xt_req.SUBSCRIPTION_ID,CREATE_DATE,WEB_SERVICE_NAME,WEB_METHOD_NAME
FROM TEMP_SOAP_GENERATE_CONTRACT sm
CROSS JOIN XMLTable(XMLNAMESPACES (
'http://core.data.soap.CDRator.com/xsd' AS "xsd1"
),
'for $i in //xsd1:id return $i'
passing XMLType(sm.REQUEST_XML)
columns "SUBSCRIPTION_ID" number path '/') xt_req
CROSS JOIN XMLTable(XMLNAMESPACES (
'http://service.soap.CDRator.com' AS "ser"
),
'for $i in //ser:letterKey return $i'
passing XMLType(sm.REQUEST_XML)
columns "LETTER_KEY" VARCHAR2(1000) path '/') xt_letterkey;
... 한 행을 다시 가져옵니다 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다