Sql server 如何在OPENXML中使用命名空间属性?
我试图使用这个函数将XML解析为表格形式,但在存在名称空间属性时,我不断遇到误导性错误 例如,SQL Server声称此格式良好的XML文档具有以下特点:Sql server 如何在OPENXML中使用命名空间属性?,sql-server,xml,tsql,Sql Server,Xml,Tsql,我试图使用这个函数将XML解析为表格形式,但在存在名称空间属性时,我不断遇到误导性错误 例如,SQL Server声称此格式良好的XML文档具有以下特点: DECLARE @hdoc int; DECLARE @doc varchar(1000); SET @doc = ' <?xml version="1.0" encoding="UTF-8"?> <Data xmlns="http://www.digitalmeasures.com/schema/data" xmlns
DECLARE @hdoc int;
DECLARE @doc varchar(1000);
SET @doc =
'
<?xml version="1.0" encoding="UTF-8"?>
<Data xmlns="http://www.digitalmeasures.com/schema/data" xmlns:dmd="http://www.digitalmeasures.com/schema/data-metadata" dmd:date="2016-06-13">
<Record userId="123456" username="jeffp" termId="129" dmd:surveyId="1234567">
<dmd:IndexEntry indexKey="AACSBSUFF" entryKey="Participating" text="Participating"/>
<dmd:IndexEntry indexKey="DEPARTMENT" entryKey="WCBD" text="WCBD"/>
<dmd:IndexEntry indexKey="QUALIFICATION" entryKey="Instructional Practitioner" text="Instructional Practitioner"/>
<dmd:IndexEntry indexKey="RANK" entryKey="Academic Staff" text="Academic Staff"/>
<GENSERVE id="33426841601" dmd:lastModified="2011-03-15T10:23:01" dmd:startDate="2010-07-01">
<TYPE>University</TYPE>
<TYPEOTHER/>
<ORG>University Academic Advising Council </ORG>
<ROLE>Committee Member</ROLE>
<ROLEOTHER/>
<OFFICE>President/Elect/Past</OFFICE>
<RESPONSIBILITIES/>
<NUMHOURS/>
<ELECAPP>Elected</ELECAPP>
<AUDIENCE>Local</AUDIENCE>
<EXOFFICIO/>
<DTM_START>July</DTM_START>
<DTD_START/>
<DTY_START>2010</DTY_START>
<START_START>2010-07-01</START_START>
<START_END>2010-07-31</START_END>
<DTM_END/>
<DTD_END/>
<DTY_END/>
<END_START></END_START>
<END_END></END_END>
</GENSERVE>
</Record>
</Data>
';
EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc;
SELECT *
FROM OPENXML (@hdoc, '/Data/Record/GENSERVE', 2)
with(TYPE varchar(250),
ORG varchar(250) )
exec sp_xml_removedocument @hdoc;
如何读取名称空间属性?您的XML字符串被截断,因为它的长度超过
varchar(1000)
,因此XML解析错误。错误消息与命名空间无关
现在是名称空间问题。。请注意,XML具有默认名称空间(声明的名称空间没有前缀)。查询中涉及的所有元素都隐式地从Data
元素继承默认名称空间。您需要将前缀映射到默认命名空间URI,并在OPENXML查询中使用该前缀引用命名空间中的元素:
DECLARE @doc varchar(5000);
.....
EXEC sp_xml_preparedocument @hdoc OUTPUT,
@doc,
'<Data xmlns:d="http://www.digitalmeasures.com/schema/data" />';
SELECT *
FROM OPENXML (@hdoc, '/d:Data/d:Record/d:GENSERVE', 2)
with(TYPE varchar(250) 'd:TYPE',
ORG varchar(250) 'd:ORG' )
XML字符串被截断,因为它的长度超过
varchar(1000)
,因此出现XML解析错误。错误消息与命名空间无关
现在是名称空间问题。。请注意,XML具有默认名称空间(声明的名称空间没有前缀)。查询中涉及的所有元素都隐式地从Data
元素继承默认名称空间。您需要将前缀映射到默认命名空间URI,并在OPENXML查询中使用该前缀引用命名空间中的元素:
DECLARE @doc varchar(5000);
.....
EXEC sp_xml_preparedocument @hdoc OUTPUT,
@doc,
'<Data xmlns:d="http://www.digitalmeasures.com/schema/data" />';
SELECT *
FROM OPENXML (@hdoc, '/d:Data/d:Record/d:GENSERVE', 2)
with(TYPE varchar(250) 'd:TYPE',
ORG varchar(250) 'd:ORG' )
哦,太棒了,谢谢,这很有道理,我觉得自己很笨!当我回到工作岗位时,我很高兴能尝试一下,谢谢!再次感谢您不仅修复了我的愚蠢问题并回答了我的问题,而且最重要的是,我感谢您改进的解决方案“使用SQL Server的XQuery和XML数据类型”,这是我完全没有意识到的。解决方法!哦,太棒了,谢谢,这很有道理,我觉得自己很笨!当我回到工作岗位时,我很高兴能尝试一下,谢谢!再次感谢您不仅修复了我的愚蠢问题并回答了我的问题,而且最重要的是,我感谢您改进的解决方案“使用SQL Server的XQuery和XML数据类型”,这是我完全没有意识到的。解决方法!
<?xml version="1.0" encoding="UTF-8"?>
<Data>
<Record userId="123456" username="jeffp" termId="129">
<GENSERVE id="33426841601" >
<TYPE>University</TYPE>
<TYPEOTHER/>
<ORG>University Academic Advising Council </ORG>
<ROLE>Committee Member</ROLE>
<ROLEOTHER/>
<OFFICE>President/Elect/Past</OFFICE>
<RESPONSIBILITIES/>
<NUMHOURS/>
<ELECAPP>Elected</ELECAPP>
<AUDIENCE>Local</AUDIENCE>
<EXOFFICIO/>
<DTM_START>July</DTM_START>
<DTD_START/>
<DTY_START>2010</DTY_START>
<START_START>2010-07-01</START_START>
<START_END>2010-07-31</START_END>
<DTM_END/>
<DTD_END/>
<DTY_END/>
<END_START></END_START>
<END_END></END_END>
</GENSERVE>
</Record>
</Data>
TYPE ORG
University University Academic Advising Council
DECLARE @doc varchar(5000);
.....
EXEC sp_xml_preparedocument @hdoc OUTPUT,
@doc,
'<Data xmlns:d="http://www.digitalmeasures.com/schema/data" />';
SELECT *
FROM OPENXML (@hdoc, '/d:Data/d:Record/d:GENSERVE', 2)
with(TYPE varchar(250) 'd:TYPE',
ORG varchar(250) 'd:ORG' )
DECLARE @xml XML = 'your xml string here'
;WITH XMLNAMESPACES (DEFAULT 'http://www.digitalmeasures.com/schema/data' )
SELECT
t.c.value('TYPE[1]', 'VARCHAR(100)' ) AS TYPE,
t.c.value( 'ORG[1]', 'VARCHAR(100)' ) AS ORG
FROM @xml.nodes('/Data/Record/GENSERVE') t(c)