gpt4 book ai didi

tsql - 如何使用 FOR XML PATH 避免子节点中的命名空间?

转载 作者:行者123 更新时间:2023-12-04 08:36:34 26 4
gpt4 key购买 nike

我想直接从数据库创建一个站点地图 xml 文件(包括图像),而不需要其他过程(如转换或其他技巧)。

我的查询是:

;WITH XMLNAMESPACES(
DEFAULT 'http://www.sitemaps.org/schemas/sitemap/0.9',
'http://www.google.com/schemas/sitemap-image/1.1' as [image] )
SELECT
(SELECT
'mysite' as [loc],
(select
'anotherloc'
as [image:loc]
for XML path('image:image'), type
)
for xml path('url'), type
)
for xml path('urlset'), type

返回:
<urlset xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<loc>mysite</loc>
<image:image xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<image:loc>anotherloc</image:loc>
</image:image>
</url>
</urlset>

但我需要这个输出,没有重复的命名空间声明:
<urlset xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>mysite</loc>
<image:image>
<image:loc>anotherloc</image:loc>
</image:image>
</url>
</urlset>

最佳答案

我确信您意识到额外的 otiose namespace 声明不会改变 XML 文档的含义,因此如果结果将由符合 XML 的工具使用,它们应该无关紧要。尽管如此,我知道有一些工具不能正确执行 XML 命名空间,并且在大型 XML 实例中,多余的重复命名空间声明会显着增加结果的大小,这可能会导致其自身的问题。

一般来说,每个 SELECT...FOR XML WITH XMLNAMESPACES 范围内的声明前缀将在其结果集中的最外层 XML 元素上生成命名空间声明,在 SQL Server 的所有 XML 支持版本中,直到 SQL Server 2012。

在您的具体示例中,您可以通过分隔 SELECT 来非常接近所需的 XML。 s 而不是嵌套它们,并使用 ROOT包围根元素的语法,因此:

DECLARE @inner XML;
WITH XMLNAMESPACES('http://www.google.com/schemas/sitemap-image/1.1' as [image])
SELECT @inner =
(
SELECT
'anotherloc' AS [image:loc]
FOR XML PATH('image:image'), TYPE
)

;WITH XMLNAMESPACES(
DEFAULT 'http://www.sitemaps.org/schemas/sitemap/0.9'
)
SELECT
'mysite' AS [loc],
@inner
FOR XML PATH('url'), ROOT('urlset'), TYPE

结果是:
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>mysite</loc>
<image:image xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns="">
<image:loc>anotherloc</image:loc>
</image:image>
</url>
</urlset>

但是这种方法并没有为这个问题提供一个完全通用的解决方案。

关于tsql - 如何使用 FOR XML PATH 避免子节点中的命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12823556/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com