2013-10-01 2 views
0

바보 같은 XPATH 질문이 있습니다. 코드는 PL/SQL이지만 중요하지 않습니다. 실행하면XPATH 추출물에 속성이있는 노드가 없습니다.

lx_a := XMLTYPE('<rfs-graph><graphml>foo</graphml><rfs-graph>'); 
lx_b := lx_a.extract('/rfs-graph/graphml[1]'); 
dbms_output.put_line(lx_b.getStringVal()); 

는, 결과는

<graphml>foo</graphml> 

이다 그러나이 코드를 실행하면 : lx_b가 null이기 때문에

lx_a := XMLTYPE('<rfs-graph><graphml xmlns="abc">foo</graphml></rfs-graph>'); 
lx_b := lx_a.extract('/rfs-graph/graphml[1]'); 
dbms_output.put_line(lx_b.getStringVal()); 

는 실패합니다.

유일한 차이점은 graphml 요소에 특성이 있다는 것입니다.

속성이 있는지 여부에 관계없이 그래프 항목을 어떻게 선택합니까?

답변

2

xmlns="abc" 그것이 namespace prefix declaration이며, 표준 속성이 아닙니다. 이 경우 접두어가 생략되었으므로 실제로 해당 노드 (및 모든 하위 노드)에 대한 기본 네임 스페이스를 지정합니다.

두 번째 경우에서 XPath가 일치하지 않는 이유는 노드의 이름이 단지 graphml, 그 abc:graphml, 즉 abc 네임 스페이스에 있습니다. XPath는 다음과 유사해야합니다.

접두사 aabc 네임 스페이스에 매핑 된
/rfs-graph/a:graphml[1] 

가, 내가 PL/SQL에서이 작업을 수행하는 방법

lx_b := lx_a.extract('/rfs-graph/a:graphml[1]', 'xmlns:a="abc"'); 

을 다음과 같다 생각 그러나 나는대로 잘 모르겠어요 I 지금까지는 한 줄의 PL/SQL을 작성하지 못했습니다.

+0

글쎄, 지금 당신은! 완벽하게 작동하며 PL/SQL을 이력서에 추가 할 수 있습니다. 감사! –

2

사실 그것은 특성이 아니라 XML 네임 스페이스 선언입니다. 그래서 xpath null 네임 스페이스에서 graphml 요소를 찾고 있지만 "abc"네임 스페이스의 graphml 요소 만 있습니다. 그러므로 아무것도 찾지 못합니다.

예 : XPath는 다음

/rfs-graph/node()[local-name() = 'graphml' and namespace-uri() = 'abc'] 
관련 문제