为openxml设置默认的xml命名空间

时间:2015-11-06 08:25:49

标签: xml tsql xml-namespaces

这可能是一个简单的问题,对不起。

我有一个以这些行开头的XMl文件:

<?xml version="1.0" encoding="windows-1252"?>
<MyData xmlns="http://xyz.com.au/schema/v1_10/MyData">
  <data>
    <patient>
      <link_id>{764C733A-64DE-4663-82B1-1A23B95FDFE2}</link_id>

我将它加载到如下表格中的XML数据类型中:

CREATE TABLE MMD (
Id INT IDENTITY PRIMARY KEY,
XMLData XML,
LoadedDateTime DATETIME)

INSERT INTO MMD (XMLData, LoadedDateTime)
SELECT CONVERT(XML, BulkColumn) AS BulkColumn, GETDATE() 
FROM OPENROWSET(BULK 'C:\Test.xml', SINGLE_BLOB) AS x;

然后我这样查询:

DECLARE @XML AS XML, @hDoc AS INT, @SQL NVARCHAR (MAX)

SELECT @XML = XMLData FROM MMD

EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML

;with xmlnamespaces (default 'http://xyz.com.au/schema/v1_10/MyData/')
SELECT  distinct(link_id)
FROM OPENXML(@hDoc, 'MyData/data/patient')
WITH 
(link_id [varchar](50) 'link_id') t

EXEC sp_xml_removedocument @hDoc
GO

查询返回0行。但是,如果我从文件的第二行删除命名空间,如下所示:from:

<MyData xmlns="http://xyz.com.au/schema/v1_10/MyData">

为:

<MyData>

然后我得到了我期望的结果!

我已阅读所有帖子并尝试了各种语法变体但未成功。

提前感谢您的帮助。

布赖恩

1 个答案:

答案 0 :(得分:0)

我不确定OPENXMLwith xmlnamespaces是否可以合作。如果我完全切换到使用xml data type methods(并将示例扩展为有效的xml),一切正常:

declare @t table (XMLData xml)
insert into @t(XmlData) values ('<?xml version="1.0" encoding="windows-1252"?>
<MyData xmlns="http://xyz.com.au/schema/v1_10/MyData">
  <data>
    <patient>
      <link_id>{764C733A-64DE-4663-82B1-1A23B95FDFE2}</link_id>
    </patient>
  </data>
</MyData>')

;with xmlnamespaces (default 'http://xyz.com.au/schema/v1_10/MyData')
select distinct XmlData.value('(MyData/data/patient/link_id)[1]','varchar(50)')
from @t

结果:

--------------------------------------------------
{764C733A-64DE-4663-82B1-1A23B95FDFE2}