我一直在嘗試在 sql server 2019 上使用 t-sql 從以下 xml 檔案中提取資料。
XML:
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">
<url>
<loc>https://www.URL1.com/1</loc>
<image:image>
<image:loc>https://www.URL1.com/11</image:loc>
</image:image>
<image:image>
<image:loc>https://www.URL1.com/12</image:loc>
</image:image>
<image:image>
<image:loc>https://www.URL1.com/13</image:loc>
</image:image>
</url>
<url>
<loc>https://www.URL1.com/2</loc>
<image:image>
<image:loc>https://www.URL1.com/21</image:loc>
</image:image>
<image:image>
<image:loc>https://www.URL1.com/22</image:loc>
</image:image>
</url>
<url>
<loc>https://www.URL1.com/3</loc>
<image:image>
<image:loc>https://www.URL1.com/32</image:loc>
</image:image>
</url>
</urlset>
我想將 xml 檔案中的資料提取到 SQL Server 表中。我想要的輸出如下
期望的輸出:
------------------------ -------------------------
| Loc | ImageLoc |
------------------------ -------------------------
| https://www.URL1.com/1 | https://www.URL1.com/11 |
| https://www.URL1.com/1 | https://www.URL1.com/12 |
| https://www.URL1.com/1 | https://www.URL1.com/13 |
| https://www.URL1.com/2 | https://www.URL1.com/21 |
| https://www.URL1.com/2 | https://www.URL1.com/22 |
| https://www.URL1.com/3 | https://www.URL1.com/32 |
------------------------ -------------------------
到目前為止,我的嘗試都失敗了。我已經嘗試了很多事情,但唯一能讓我獲得 Loc 元素的事情是以下,我嘗試使用 OUTER APPLY/CROSS APPLY 來加熱 ImageLoc,但沒有運氣。
我的嘗試:
DECLARE @xml XML
SELECT @xml = BulkColumn
FROM OPENROWSET(BULK 'M:\Files\MyXML.xml', SINGLE_BLOB) x
SELECT
t.c.value('(text())[1]', 'VARCHAR(max)') URLs
, t2.i.value('(text())[1]', 'VARCHAR(max)') URLs
FROM @xml.nodes('*:urlset/*:url/*:loc') t(c)
OUTER APPLY @xml.nodes('*:urlset/*:url/*:loc/*:image/*:loc') t2(i)
能否請你幫忙?提前致謝
uj5u.com熱心網友回復:
這個答案是由lptr在評論中發布的,只是一個小提琴的鏈接。正如 OP 所說,它回答了他們的問題,并且 lptr 不希望/回應發布答案,我已將其遷移到答案部分。
在這里,他們使用*通配符而不是定義命名空間來從 XML 中獲取值:
dbfiddle.uk/...
SELECT t.c.value('(*:loc/text())[1]', 'VARCHAR(max)') URLs , t2.i.value('(text())[1]', 'VARCHAR(max)') URLs FROM @xml.nodes('*:urlset/*:url') t(c) OUTER APPLY t.c.nodes('*:image/*:loc') t2(i);
uj5u.com熱心網友回復:
您還需要在 SQL 中定義命名空間。這可以通過將WITH XMLNAMESPACES查詢放在開頭并在那里定義來完成。然后,您可以定義image命名空間并在參考中為其添加前綴,并從節點回傳值:
WITH XMLNAMESPACES ('xyz' AS image)
SELECT u.i.value('(../loc/text())[1]','varchar(500)') AS loc,
u.i.value('(image:loc/text())[1]','varchar(500)') AS loc
FROM @xml.nodes('urlset/url/image:image') u(i);
db<>小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/467824.html
下一篇:如何獲取按ID分組的資料
