Выберите значение элемента xml в Oracle



Я пытаюсь извлечь значение из xml-элемента, расположенного в столбце XMLTYPE в таблице Oracle. Xml-элемент, который я пытаюсь извлечь, имеет родителя,для которого определено пространство имен.
Xml выглядит примерно так:



<a>
<b xmlns="urn:www.someSite.com/myModel">
<c>my value</c>
</b>
</a>


Если я хочу извлечь содержимое элемента" a", его контекст правильно возвращается:



SELECT Extract(myColumn, '/a') FROM myTable;


Но для возвращения содержимого элемента " c " мне не удалось найти ни одной версии для работы. Следующие инструкции не делают работа:



SELECT Extract(myColumn, '/a/b/c') FROM myTable;

SELECT Extract(myColumn, '/a/b/c', 'xmlns="urn:www.someSite.com/myModel"') FROM myTable;

SELECT Extract(myColumn, '/a/b/c', 'urn:www.someSite.com/myModel') FROM myTable;


Может ли кто-нибудь помочь мне с выпиской, которая будет работать в этом случае?

708   4  

4 ответов:

Поскольку элемент a не имеет пространства имен, можно сначала извлечь его дочерние элементы без использования пространств имен в функции, а затем извлечь значение из b с помощью пространства имен:
Попробуйте:

select extract(extract(myColumn, 'a/*'),
               'b/c/text()',
               'xmlns=urn:www.someSite.com/myModel') 
  from myTable
select a.*
from   XMLTABLE(
         XMLNAMESPACES('urn:www.someSite.com/myModel' AS "ns"),
         '/*'
         PASSING my.myColumn           
         COLUMNS
           val  VARCHAR2(2000)   PATH '/a/ns:b/ns:c'
       ) a, myTable my;

При изменении пространства имен по умолчанию одним из способов задания пространств имен является запись подстановочного знака ('*') и функций local-name() и namespace-uri() XPath.

select extract(myColumn, '/a/*[local-name()='b' and namespace-uri()='urn:www.someSite.com/myModel']/*[local-name()='c' and namespace-uri()='urn:www.someSite.com/myModel']') from myTable

SELECT XMLAGG(XMLELEMENT(E,ename||',')).EXTRACT('//text()') "Result"
FROM   emp

Comments

    Ничего не найдено.