Выберите значение элемента 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;
Может ли кто-нибудь помочь мне с выпиской, которая будет работать в этом случае?
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
Comments