繁体   English   中英

如何在SQL Server中使用FOR XML抑制空名称空间

[英]How do I suppress empty namespaces with FOR XML in Sql Server

使用FOR XML以及xml和名称空间片段的SQL Server 2005/2008,我们遇到一个奇怪的问题。 这是有问题的查询。

WITH XMLNAMESPACES ( 
DEFAULT 'http://tempuri.org/newincomingxml.xsd',
'http://tempuri.org/newincomingxml.xsd' as [xsi],
'http://tempuri.org/newincomingxml.xsd' as [a]
) 
SELECT 
 [@a:Source], [AddressCount], [ConsumerCount], [EmailCount], [PermissionCount]
, (
  SELECT 
   [Consumer]
  FROM tbcExportBRC_Current xmlmaster
  FOR XML PATH(''), ROOT('Consumers'), TYPE
 )
FROM tbcExportBRCBatch_Current xmlroot
FOR XML PATH('Datafeed'), TYPE

[Customer]字段是一个xml片段。 当我运行这个我得到。

<Datafeed xmlns:a="http://tempuri.org/newincomingxml.xsd" xmlns:xsi="http://tempuri.org/newincomingxml.xsd" xmlns="http://tempuri.org/newincomingxml.xsd" a:Source="DSD">
  <AddressCount>0</AddressCount>
  <ConsumerCount>0</ConsumerCount>
  <EmailCount>0</EmailCount>
  <PermissionCount>0</PermissionCount>
  <Consumers xmlns:a="http://tempuri.org/newincomingxml.xsd" xmlns:xsi="http://tempuri.org/newincomingxml.xsd" xmlns="http://tempuri.org/newincomingxml.xsd">
    <Consumer>
      <ConsumerType xmlns="">Individual</ConsumerType>
      <FirstName xmlns="">STEVE</FirstName>
      <LastName xmlns="">SMITH</LastName>
    </Consumer>
  </Consumers>
</Datafeed>

如果您注意到标记的子项中有xmlns =“” 如果我们直接在表中查看该片段,则它看起来像这样。

      <ConsumerType>Individual</ConsumerType>
      <FirstName>STEVE</FirstName>
      <LastName>SMITH</LastName>

我可以删除默认名称空间

DEFAULT 'http://tempuri.org/newincomingxml.xsd',

它删除了xmlns =“”,但我们需要将其保留在文件中。 有任何想法吗?

结果是正确的。 在表中,您有没有命名空间的元素,因此,当您将它们添加到具有默认命名空间xmlns =“ http://tempuri.org/newincomingxml.xsd”的Consumers元素下时 ,表中的元素必须覆盖默认命名空间回到 ””。

那正是您应该看到的。 没有xmlns =“”表示ConsumerType / FirstName / LastName元素位于名称空间“ http://tempuri.org/newincomingxml.xsd ”中,这是错误的。

您可能希望将ConsumerType / FirstName / LastName元素移动到“ http://tempuri.org/newincomingxml.xsd ”命名空间中,以匹配父Consumer元素的命名空间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM