草庐IT

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

coder 2024-06-25 原文

我尝试使用 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/

有关sql - 在查询生成的 xml 上添加命名空间的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

    当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

  3. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  4. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  5. ruby - 将 Bootstrap Less 添加到 Sinatra - 2

    我有一个ModularSinatra应用程序,我正在尝试将Bootstrap添加到应用程序中。get'/bootstrap/application.css'doless:"bootstrap/bootstrap"end我在views/bootstrap中有所有less文件,包括bootstrap.less。我收到这个错误:Less::ParseErrorat/bootstrap/application.css'reset.less'wasn'tfound.Bootstrap.less的第一行是://CSSReset@import"reset.less";我尝试了所有不同的路径格式,但它

  6. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  7. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  8. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  9. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  10. ruby-on-rails - Ruby on Rails - 为文本区域和图片生成列 - 2

    我是Rails的新手,所以请原谅简单的问题。我正在为一家公司创建一个网站。那家公司想在网站上展示它的客户。我想让客户自己管理这个。我正在为“客户”生成一个表格,我想要的三列是:公司名称、公司描述和Logo。对于名称,我使用的是name:string但不确定如何在脚本/生成脚手架终端命令中最好地创建描述列(因为我打算将其设置为文本区域)和图片。我怀疑描述(我想成为一个文本区域)应该仍然是描述:字符串,然后以实际形式进行调整。不确定如何处理图片字段。那么……说来话长:我在脚手架命令中输入什么来生成描述和图片列? 最佳答案 对于“文本”数

随机推荐