Oracle XMLType에서 잎 노드를 추출하는 방법
문제
Oracle 10G의 XMLType 객체에서 잎 노드 만 추출하고 싶습니다.
SELECT
t.getStringVal() AS text
FROM
TABLE( XMLSequence(
XMLTYPE(
'<xml>
<node>
<one>text</one>
</node>
<node>
<two>text</two>
</node>
<node>
<three>text</three>
</node>
</xml>'
).extract( '//*' )
) ) t
Where 절로 사용해야하므로 다음과 같이 반환해야합니다.
<one>text</one>
<two>text</two>
<three>text</three>
나는 다음을 시도했지만 작동하지 않습니다.
WHERE t.existsNode( '//*' ) = 0
WHERE t.existsNode( '/.//*' ) = 0
WHERE t.existsNode( './/*' ) = 0
내가 무엇을 놓치고 있습니까?
해결책
Nevermind, 나는 그것을 발견했다 :
WHERE
t.existsNode( '/*//*' ) = 0
다른 팁
xpath //*[not(*)]
자녀가없는 레벨 1 이상의 요소를 얻습니다.
쿼리 1:
SELECT t.getStringVal()
FROM TABLE(
XMLSEQUENCE(
XMLTYPE(
'<xml>
<node><one>text</one></node>
<node><two>text</two></node>
<node><three>text</three></node>
</xml>'
).extract( '//*[not(*)]' )
)
) t
결과:
| T.GETSTRINGVAL() |
|---------------------|
| <one>text</one> |
| <two>text</two> |
| <three>text</three> |
루트 요소를 포함하려면 XPath를 사용하십시오. (//*|/*)[not(*)]
다음 pl/sql을 시도 할 수 있습니다.
DECLARE
x XMLType := XMLType(
'<?xml version="1.0" ?>
<xml>
<node>
<one>text</one>
</node>
<node>
<two>text</two>
</node
<node>
<three>text</three>
</node>
</xml>');
BEGIN
FOR r IN (
SELECT ExtractValue(Value(p),'/XML/node/one/text()') as one_x
,ExtractValue(Value(p),'/XML/node/two/text()') as TWO_x
,ExtractValue(Value(p),'/XML/node/three/text()') as three
FROM TABLE(XMLSequence(Extract(x,'/XML/node/'))) p
) LOOP
/* do whatever you want with r.one_x, r.TWO_x, r.three_x */
END LOOP;
END;
제휴하지 않습니다 StackOverflow