Sql server SQLServer:阻止访问查询数据的命名空间

Sql server SQLServer:阻止访问查询数据的命名空间,sql-server,xml,namespaces,Sql Server,Xml,Namespaces,一个初学者的问题,希望很容易回答。我有一个xml文件要加载到SQLServer2008并提取有用的信息 我从简单开始,只是尝试提取名称\gpx\name。我的密码是: DECLARE @x xml; SELECT @x = xCol.BulkColumn FROM OPENROWSET (BULK 'C:\Data\EM.gpx', SINGLE_BLOB) AS xCol; -- confirm the xml data is in @x select @x as XML_Data -- tr

一个初学者的问题,希望很容易回答。我有一个xml文件要加载到SQLServer2008并提取有用的信息

我从简单开始,只是尝试提取名称\gpx\name。我的密码是:

DECLARE @x xml; SELECT @x = xCol.BulkColumn FROM OPENROWSET (BULK 'C:\Data\EM.gpx', SINGLE_BLOB) AS xCol; -- confirm the xml data is in @x select @x as XML_Data -- try and get the name of the gpx section SELECT c.value('name[1]', 'varchar(200)') as Name from @x.nodes('gpx') x(c) 以下是xml文件的大幅缩短版本:

<?xml version="1.0" encoding="utf-8"?>
<gpx xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1.0" creator="Groundspeak Pocket Query" xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd http://www.groundspeak.com/cache/1/0 http://www.groundspeak.com/cache/1/0/cache.xsd" xmlns="http://www.topografix.com/GPX/1/0">
  <name>EM</name>
  <desc>Geocache file generated by Groundspeak</desc>
  <author>Groundspeak</author>
  <email>contact@groundspeak.com</email>
  <time>2010-03-24T14:01:36.4931342Z</time>
  <keywords>cache, geocache, groundspeak</keywords>
  <wpt lat="51.2586" lon="-2.213067">
    <time>2008-03-30T07:00:00Z</time>
    <name>GC1APHM</name>
    <desc>Sandman's Noble Hoard by Sandman1973, Unknown Cache (2/3)</desc>
    <groundspeak:cache id="832000" available="True" archived="False" xmlns:groundspeak="http://www.groundspeak.com/cache/1/0">
      <groundspeak:name>Sandman's Noble Hoard</groundspeak:name>
      <groundspeak:placed_by>Sandman1973</groundspeak:placed_by>
    </groundspeak:cache>
  </wpt>
</gpx>
如果前两行仅替换为:

<gpx>
上面的示例工作正常,但是我无法访问groundspeak:name/gpx/wpt/groundspeak:cache/groundspeak:name,所以我猜这是名称空间的问题


欢迎提供任何帮助。

您必须声明名称空间。要么像这样:

WITH XMLNAMESPACES ('http://www.topografix.com/GPX/1/0' as ns1)
SELECT c.value('ns1:name[1]', 'varchar(200)') as Name
  FROM @x.nodes('ns1:gpx') x(c)
SELECT c.value('declare namespace ns1="http://www.topografix.com/GPX/1/0"; ns1:name[1]', 'varchar(200)') as Name
  FROM @x.nodes('declare namespace ns1="http://www.topografix.com/GPX/1/0"; ns1:gpx') x(c)
或者像这样:

WITH XMLNAMESPACES ('http://www.topografix.com/GPX/1/0' as ns1)
SELECT c.value('ns1:name[1]', 'varchar(200)') as Name
  FROM @x.nodes('ns1:gpx') x(c)
SELECT c.value('declare namespace ns1="http://www.topografix.com/GPX/1/0"; ns1:name[1]', 'varchar(200)') as Name
  FROM @x.nodes('declare namespace ns1="http://www.topografix.com/GPX/1/0"; ns1:gpx') x(c)
要同时使用groundspeak命名空间,请执行以下操作:

WITH XMLNAMESPACES ('http://www.topografix.com/GPX/1/0' as gpx, 'http://www.groundspeak.com/cache/1/0' as groundspeak)
SELECT c.value('(gpx:wpt/groundspeak:cache/groundspeak:name)[1]', 'nvarchar(max)')
  FROM @x.nodes('gpx:gpx') x(c)

明白了,对erikkallen的答案做了一些修改,我已经成功了:

;WITH XMLNAMESPACES ('http://www.topografix.com/GPX/1/0' as ns1) 
SELECT c.value('ns1:name[1]', 'varchar(200)') as Name 
  FROM @x.nodes('ns1:gpx') x(c) 


谢谢你的回复。您发布的内容对于WITH XMLNAMESPACES解决方案不太有效,我得到的结果是NULL,但是我计算出名称[1]需要有名称空间引用,所以它应该是:;使用XMLNAMESPACES作为ns1,从@x.nodes的ns1:gpx中选择c.value'ns1:name[1],'varchar200'作为名称,第二个查询仍然无法工作。首先,它引用了您的示例中的冒险工作-简单地修复更改,但仍然没有乐趣。将其更改为从@x.nodes'declare namespace ns1=中选择c.value'name[1],'varchar200'作为名称;ns1:gpx'xc返回一条包含NULL的记录。任何更改名称[1]的尝试都只会导致错误。非常好,它们都工作得很好-谢谢。关于访问groundspeak:name的附加内容是一个非常好的补充,展示了如何混合名称空间;groundspeak:name[1],'varchar200'作为@x.nodes'声明名称空间gpx=的名称;声明命名空间groundspeak=;gpx:gpx/gpx:wpt/groundspeak:cache'xc感谢您的帮助