使用 t-sql 从 XML 文档中提取数据

杰克琼斯

我一直在尝试使用 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)

能否请你帮忙?提前致谢

拉努

这个答案是由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);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章