2013-10-01 90 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爲空失敗。

唯一的區別是graphml元素有一個屬性。

如何選擇graphml元素,而不管它是否具有屬性?

回答

2

xmlns="abc"不是標準屬性,它是一個namespace prefix declaration。在這種情況下,因爲省略了前綴,所以實際上指定了該節點(以及所有子節點)的默認名稱空間

XPath在第二種情況下不匹配的原因是因爲節點的名稱不是隻是graphml,其abc:graphml,即它在abc命名空間。你的XPath應該看起來像這樣。

/rfs-graph/a:graphml[1] 

其中前綴a已經映射到abc命名空間,我覺得 PL/SQL做到這一點的方法如下

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

但我不知道,因爲我在此之前,我從來沒有寫過一行PL/SQL。

+0

好吧,現在你有!它完美地工作,你可以把PL/SQL放在你的簡歷上。謝謝! –

2

實際上它沒有屬性而是xml名稱空間聲明。因此,您的xpath正在從空名稱空間查找graphml元素,但只有來自「abc」名稱空間的graphml元素。因此它找不到任何東西。

您可以使用例如以下XPath

/rfs-graph/node()[local-name() = 'graphml' and namespace-uri() = 'abc'] 
相關問題