SQL Server — синтаксический анализ XML, возвращающий значение NULL

#sql-server #xml #xml-parsing

#sql-сервер #xml #синтаксический анализ xml

Вопрос:

Проблемы с анализом данных, xml сгенерированных третьей стороной. Проверено, нет ли проблем со XML структурой, и уже проанализировано десятки похожих структур XMLs без каких-либо проблем.

XML получил эту структуру:

  <rss xmlns:media="https://...." version="2.0">
  <channel>
    <title>Title</title>
    <link>Link</link>
    <description>description</description>
    <pubDate>01.01.1900</pubDate>
    <item>
      <guid isPermaLink="false">aaaa</guid>
      <title>Title</title>
      <description>description</description>
      <pubDate>pubDate</pubDate>
      <category>Category</category>
      <enclosure url="https:..." length="72" type="video/mp4" />
      <media:content type="video/mp4" url="https://..." duration="72" lang="en">
        <media:category>AAAA</media:category>
        <media:tags>BBB</media:tags>
        <media:keywords>CCCC</media:keywords>
        <media:thumbnail url="https://...." width="1280" height="720" />
        <media:credit role="producer" scheme="urn:ebu">DDDD</media:credit>
      </media:content>
    </item>
 

I m unable to parse anything which is under media:content . Where full path to it should be / rss / channel / item / media:content / media:thumbnail`, но, по-видимому, это не так.

Вероятно, что-то не замечено.

Был бы очень признателен, если бы кто-нибудь мог посоветовать мне об этом, и с наилучшими пожеланиями всех с Новым годом !!! 🙂

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

1. «Я не могу разобрать ничего, что находится в разделе «media: content».» Потому что вы не объявляете пространство имен.

2. Я сделал:;С ПОМОЩЬЮ XMLNAMESPACES(‘ поиск. yahoo.com/mrss ‘ как «медиа») выберите значение x.y.(‘медиа: содержимое[1]/медиа: миниатюра[1]/@url’, ‘nvarchar(max)’) как [Thubmnail] ИЗ @xml.nodes(‘/rss/канал/элемент’) КАК x (y) Извините, забыл добавить

3. FROM @xml.nodes('/media:rss/channel/item')

Ответ №1:

Как я упоминал в комментарии, вам необходимо объявить свое пространство имен в SQL:

 DECLARE @XML xml = '<rss xmlns:media="https://...." version="2.0">
  <channel>
    <title>Title</title>
    <link>Link</link>
    <description>description</description>
    <pubDate>01.01.1900</pubDate>
    <item>
      <guid isPermaLink="false">aaaa</guid>
      <title>Title</title>
      <description>description</description>
      <pubDate>pubDate</pubDate>
      <category>Category</category>
      <enclosure url="https:..." length="72" type="video/mp4" />
      <media:content type="video/mp4" url="https://..." duration="72" lang="en">
        <media:category>AAAA</media:category>
        <media:tags>BBB</media:tags>
        <media:keywords>CCCC</media:keywords>
        <media:thumbnail url="https://...." width="1280" height="720" />
        <media:credit role="producer" scheme="urn:ebu">DDDD</media:credit>
      </media:content>
    </item>
  </channel>'   --Assumed exists
'</rss>'; --Assumed exists

WITH XMLNAMESPACES ('https://....' as media) --'https://....' would be replaced with your real namespace
SELECT c.i.value('media:content[1]/media:thumbnail[1]/@url', 'nvarchar(max)') as [Thubmnail]
FROM @xml.nodes('/rss/channel/item') AS c(i);
 

db<>скрипка

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

1. Спасибо тебе, Ларну, спасибо тебе, я ve found my issue was the http against https in NS. Of course you couldn не знаю этого, поскольку я не придавал значения реальным ценностям.. Но вы указываете мне, где его искать. Еще раз огромное спасибо и с Новым годом, сэр !!! 🙂