gpt4 book ai didi

sql - 在查询生成的 xml 上添加命名空间

转载 作者:数据小太阳 更新时间:2023-10-29 01:51:30 29 4
gpt4 key购买 nike

我尝试使用 WITH XMLNAMESPACES 在 xml 上添加命名空间。

当我执行查询时, namespace 添加了根元素,但第二个元素我也有 xmlns=""...我想删除它.​​..

我举了一个例子:

创建表和数据的查询:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[tblTest](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](30) NOT NULL,
CONSTRAINT [PK_tblTest] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET IDENTITY_INSERT [dbo].[tblTest] ON
INSERT [dbo].[tblTest] ([Id], [Name]) VALUES (1, N'Barack')
INSERT [dbo].[tblTest] ([Id], [Name]) VALUES (2, N'Nicolas')
INSERT [dbo].[tblTest] ([Id], [Name]) VALUES (3, N'Brian')
SET IDENTITY_INSERT [dbo].[tblTest] OFF

我使用这些查询生成 xml:

DECLARE @Xml xml
SET @Xml = (SELECT Id, Name
FROM dbo.tblTest
FOR XML PATH('Row'), ROOT('DataRows'));

WITH XMLNAMESPACES (DEFAULT 'http://www.mynamespace.com')
SELECT @Xml FOR XML PATH('Names');

生成的 XML:

<Names xmlns="http://www.mynamespace.com">
<DataRows xmlns="">
<Row>
<Id>1</Id>
<Name>Barak</Name>
</Row>
<Row>
<Id>2</Id>
<Name>Nicolas</Name>
</Row>
<Row>
<Id>3</Id>
<Name>Brian</Name>
</Row>
</DataRows>
</Names>

所以,我也试试这个:

DECLARE @Xml xml

;WITH XMLNAMESPACES (DEFAULT 'http://www.mynamespace.com')
SELECT @Xml = (SELECT Id, Name
FROM dbo.tblTest
FOR XML PATH('Row'), TYPE);

;WITH XMLNAMESPACES (DEFAULT 'http://www.mynamespace.com')
SELECT @Xml
FOR XML PATH('DataRows'), ROOT('Names')

现在生成的 xml 是:

<Names xmlns="http://www.mynamespace.com">
<DataRows>
<Row xmlns="http://www.mynamespace.com">
<Id>1</Id>
<Name>Barak</Name>
</Row>
<Row xmlns="http://www.mynamespace.com">
<Id>2</Id>
<Name>Nicolas</Name>
</Row>
<Row xmlns="http://www.mynamespace.com">
<Id>3</Id>
<Name>Brian</Name>
</Row>
</DataRows>
</Names>

最佳答案

丹尼尔 xmlns=""<DataRows> 上element 表示,为 <DataRows> 设置默认命名空间并且所有后代都没有命名空间。

换句话说,如果 xmlns=""如果不存在,整个 XML 树将在 http://www.mynamespace.com 中命名空间。 (因为 namespace 声明是继承的,直到被覆盖。)这可能就是您想要的。但是 SQL Server 认为您只需要 <Names>元素位于该 namespace 中。因此,删除所有后代元素的默认命名空间是“有帮助的”。

然后,解决方案是告诉 SQL Server 所有 元素,而不仅仅是 <Names> , 应该在 http://www.mynamespace.com 中命名空间。

(如果您问我如何做到这一点,答案是我不太了解 SQL Server XML 功能。但也许澄清正在发生的事情和需要发生的事情将帮助您弄清楚如何实现它。)

根据新发布的查询和输出更新:

@Daniel,您的输出现在在技术上是正确的。所有输出元素都在 http://www.mynamespace.com 中命名空间。 xmlns="http://www.mynamespace.com"关于 <Row> 的声明元素是多余的...它们不会更改任何元素的命名空间。

您可能不喜欢它们的额外声明,但它们不应该对任何下游 XML 工具产生任何影响。

如果您想要删除它们,并且您不能通过调整 SQL 查询来实现,则可以通过 XSLT 样式表运行生成的 XML。甚至一个identity transformation我相信可能会摆脱多余的命名空间声明。

关于sql - 在查询生成的 xml 上添加命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3817195/

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