dc:creator 从 XML 变成 SQL table

dc:creator from XML into SQL table

我正在尝试存储一个 XML 文件(下面的代码),但是 dc:creator 导致了一个错误。我从这里的其他相关问题中发现我应该使用 ;WITH XMLNAMESPACES(''http://purl.org/dc/elements/1.1/'' AS dc) 但这没有用关于 problem/solution 可能是什么的任何想法? .

XML 文件:

<?xml version="1.0" encoding="UTF-8"?>

-<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:base="http://talksport.com/rss/sports-news/football/feed" version="2.0">


-<channel>

<title>Football</title>

<link>http://talksport.com/rss/sports-news/football/feed</link>

<description/>

<language>en</language>

<atom:link type="application/rss+xml" rel="self" href="http://talksport.com/rss/sports-news/football/feed"/>


-<item>

<title>Hillsborough families 'back introduction of rail seating' as bereaved family says 'standing did not kill our 96'</title>

<link>http://talksport.com/football/hillsborough-families-back-introduction-rail-seating-bereaved-family-says-standing-did-not</link>

<description/>

<pubDate>Wed, 19 Jul 2017 08:18:37 +0000</pubDate>

<dc:creator>talkSPORT</dc:creator>

<guid isPermaLink="false">247276 at http://talksport.com</guid>

</item>
</rss>

这是存储过程:

CREATE PROCEDURE feed.usp_importXML(@file VARCHAR(8000))
AS
    BEGIN
    DECLARE @Query VARCHAR(8000)
    SET @Query ='
        DECLARE @xmlFile as XML
        SET @xmlFile = ( cast

        SELECT CONVERT(XML,BulkColumn) as BulkColumn
        FROM OPENROWSET (BULK  '''+@file+''', SINGLE_BLOB) AS t)
        INSERT INTO feed.tempXML (title,link,source)
        SELECT
         title = t.value (''title[1]'', ''NVARCHAR(300)''),
         link = t.value (''link[1]'', ''NVARCHAR(300)''),
         source = t.value(''(dc:creator)[1]'',''NVARCHAR(30)'')
        FROM @xmlFile.nodes(''/rss/channel/item'') AS xTable(t);'
        EXEC(@Query)
    END
    GO

在您的情况下,用通配符替换 dc: 可能就足够了:*:。假设您的 XML 已经写入 XML 文件,您可以这样尝试:

DECLARE @xmlFile XML=
N'<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:base="http://talksport.com/rss/sports-news/football/feed" version="2.0">
  <channel>
    <title>Football</title>
    <link>http://talksport.com/rss/sports-news/football/feed</link>
    <description />
    <language>en</language>
    <atom:link type="application/rss+xml" rel="self" href="http://talksport.com/rss/sports-news/football/feed" />
    <item>
      <title>Hillsborough families ''back introduction of rail seating'' as bereaved family says ''standing did not kill our 96''</title>
      <link>http://talksport.com/football/hillsborough-families-back-introduction-rail-seating-bereaved-family-says-standing-did-not</link>
      <description />
      <pubDate>Wed, 19 Jul 2017 08:18:37 +0000</pubDate>
      <dc:creator>talkSPORT</dc:creator>
      <guid isPermaLink="false">247276 at http://talksport.com</guid>
    </item>
  </channel>
</rss>';

SELECT
         title = t.value ('title[1]', 'NVARCHAR(300)'),
         link = t.value ('link[1]', 'NVARCHAR(300)'),
         source = t.value('(*:creator)[1]','NVARCHAR(30)')
FROM @XmlFile.nodes('/rss/channel/item') AS xTable(t);

这也行得通:

WITH XMLNAMESPACES('http://purl.org/dc/elements/1.1/' AS dc)
SELECT
         title = t.value ('title[1]', 'NVARCHAR(300)'),
         link = t.value ('link[1]', 'NVARCHAR(300)'),
         source = t.value('(dc:creator)[1]','NVARCHAR(30)')
FROM @XmlFile.nodes('/rss/channel/item') AS xTable(t);

您也可以在 .value 中声明命名空间:

SELECT
         title = t.value ('title[1]', 'NVARCHAR(300)'),
         link = t.value ('link[1]', 'NVARCHAR(300)'),
         source = t.value('declare namespace dc="http://purl.org/dc/elements/1.1/";(dc:creator)[1]','NVARCHAR(30)')
FROM @XmlFile.nodes('/rss/channel/item') AS xTable(t);