Извлечение / извлечение значения для тегов с пространством имен

#xml #oracle #plsql #extract #extract-value

#xml #Oracle #plsql #извлечение #извлечение-значение

Вопрос:

Я пытаюсь извлечь значение тега с пространством имен в Oracle 10g. Мой запрос

 select      extract(xmltype(xml_text),
            '/feed/entry[1]/yt:statistics',
            'xmlns:yt="http://gdata.youtube.com/schemas/2007"') title
from    edgecast_xml
where   load_date > sysdate-1
 

и он возвращает null

Исходный xml таков (мне пришлось пометить как htp, а не http, чтобы избежать ссылок):

 <feed xmlns='htp://www.w3.org/2005/Atom' xmlns:media='htp://search.yahoo.com/mrss/' xmlns:openSearch='htp://a9.com/-/spec/opensearch/1.1/' xmlns:gd='htp://schemas.google.com/g/2005' xmlns:yt='http://gdata.youtube.com/schemas/2007' gd:etag='W/amp;quot;D0YEQH88eSp7I2A9XRZQEU8.amp;quot;'>
    <entry gd:etag='W/amp;quot;CUMNRH47eCp7I2A9XRZRGUo.amp;quot;'>
       <id>tag:youtube.com,2008:video:qXPtXPJLnJY</id>
       <updated>2014-06-17T02:51:35.000Z</updated>
       <category scheme='http://schemas.google.com/g/2005#kind' term='http://gdata.youtube.com/schemas/2007#video'/>
       <category scheme='http://gdata.youtube.com/schemas/2007/categories.cat' term='Nonprofit' label='Nonprofits amp;amp; Activism'/>
       <title>Rear Admiral Lee Addresses Restrictive Regulations on Religious Liberty</title>
       <gd:rating average='4.8343196' max='5' min='1' numRaters='5239' rel='http://schemas.google.com/g/2005#overall'/>
       <yt:statistics favoriteCount='0' viewCount='365565'/>
       <yt:rating numDislikes='217' numLikes='5022'/>
   </entry>
</feed>
 

Почему я получаю null? Если я выбираю только /feed/entry[1], он возвращает xml для всего, что находится в теге entry .

Комментарии:

1. xmlns В этом XML нет. Почему вы используете пространство имен?

2. Я по ошибке забыл включить тег feed <feed xmlns=’ w3.org/2005/Atom ‘ xmlns:media=’ поиск. yahoo.com/mrss ‘ xmlns:OpenSearch=’ a9.com/-/spec/opensearch/1.1 ‘ xmlns:gd=’ schemas.google.com/g/2005 ‘xmlns:yt=’ gdata. youtube.com/schemas/2007 ‘б-г:etag=’W/»D0YEQH88eSp7I2A9XRZQEU8.»‘>

Ответ №1:

Поскольку вы получаете результат при использовании /feed/entry[1] , кажется, что ваше пространство имен по умолчанию (Atom) регистрируется автоматически. yt Пространство имен также зарегистрировано, поэтому оно должно работать.

Вы получаете null при извлечении строкового значения /feed/entry[1]/yt:statistics , поскольку <yt:statistics> элемент не имеет текстового содержимого. Это пустой тег. Но вы можете прочитать его атрибуты:

 /feed/entry[1]/yt:statistics/@viewCount
 

и

 /feed/entry[1]/yt:statistics/@favoriteCount