Выберите значение элемента XML в Oracle - PullRequest
2 голосов
/ 02 апреля 2012

Я пытаюсь извлечь значение из элемента 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 ]

5 голосов
/ 02 апреля 2012
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;
4 голосов
/ 02 апреля 2012

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

select extract(extract(myColumn, 'a/*'),
               'b/c/text()',
               'xmlns=urn:www.someSite.com/myModel') 
  from myTable
0 голосов
/ 11 декабря 2014

При изменении пространства имен по умолчанию одним из способов задания пространств имен является запись символа подстановки ('*') и 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

0 голосов
/ 25 марта 2014
SELECT XMLAGG(XMLELEMENT(E,ename||',')).EXTRACT('//text()') "Result"
FROM   emp
...