2011-11-16 20 views
5

Tôi không chắc chắn cách lấy giá trị của dc: creator từ một nguồn cấp dữ liệu RSS bằng cách sử dụng SQL. Đây là xml của tôi/rss nguồn cấp dữ liệu:Nhận giá trị của dc: người tạo bằng cách sử dụng SQL XML

<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"> 
<channel> 
    <title>Foobar RSS</title> 
    <link>http://www.foobar.com/</link> 
    <description>RSS feed</description> 
    <language>en</language> 
    <ttl>15</ttl> 
    <item> 
     <title>This is my title</title> 
     <link>http://www.foobar.com/link/blabla</link> 
     <description>Bla..bla..bla..</description> 
     <dc:creator>John Doe</dc:creator> 
     <guid isPermaLink="false">00082EA751F1D905DE00E7CFA2417DA9</guid> 
     <pubDate>Wed, 26 Oct 2011 00:00:00 +0200</pubDate> 
    </item> 
</channel> 
</rss> 

Trong SQL của tôi, tôi sử dụng một cái gì đó như thế này để có được những giá trị - Thường dùng cho các pubDate tôi sử dụng một cái gì đó như thế này:

DECLARE @xml XML 
SET @xml = cast('my rss feed here' AS xml) 

SELECT 
convert(datetime,substring(T.nref.value('pubDate[1]','nvarchar(100)'),6,20)) as pubdate, 
FROM @xml.nodes('//item') AS T(nref) 

này hoạt động tốt, nhưng khi tôi đang cố gắng để có được dc: giá trị sáng tạo 'John Doe', sau đây chỉ mang lại cho tôi một lỗi:

SELECT 
    T.nref.value('dc:creator','nvarchar(100)') as creator 
FROM @xml.nodes('//item') AS T(nref) 

    error: 
    XQuery [value()]: The name "dc" does not denote a namespace. 

tôi cần để có thể chọn nhiều cột từ rss nguồn cấp dữ liệu. Ai có thể cung cấp một giải pháp hoặc hướng để có được giá trị của dc: người sáng tạo?

Tôi có một câu hỏi khác - bạn sẽ xây dựng mã như thế nào nếu bạn đang thực hiện nó trong một lựa chọn phụ?

E.g. 
INSERT INTO RSSResults (ID, pubDate) 
SELECT @ID, tbl.pubDate FROM (  

;WITH XMLNAMESPACES('http://purl.org/dc/elements/1.1/' AS dc) 
    SELECT 
     RSS.Item.value('(dc:creator)[1]', 'nvarchar(100)') as pubDate 
    FROM 
     @xml.nodes('/rss/channel/item') as RSS(Item)) AS tbl 

Mã ngắt tại "; VỚI XMLNAMESPACES". Có thể bao gồm không gian tên trực tiếp trong tuyên bố bằng cách nào đó không?

Trả lời

8

Hãy thử một cái gì đó như thế này:

DECLARE @xml XML 
SET @xml = cast('my rss feed here' AS xml) 

;WITH XMLNAMESPACES('http://purl.org/dc/elements/1.1/' AS dc) 
SELECT 
    @xml.value('(rss/channel/item/dc:creator)[1]', 'nvarchar(100)') 

Nếu bạn cần phải nắm bắt nhiều mục - thử điều này:

DECLARE @xml XML 
SET @xml = cast('my rss feed here' AS xml) 

;WITH XMLNAMESPACES('http://purl.org/dc/elements/1.1/' AS dc) 
SELECT 
    RSS.Item.value('(dc:creator)[1]', 'nvarchar(100)') 
FROM 
    @xml.nodes('/rss/channel/item') as RSS(Item) 
Các vấn đề liên quan