使用OPENXML在MSsql 2005中获取dt元素.
如何在xml中获取xmlns:dt元素?例如,获取列出产品ID和国家/地区代码的两行结果集.
如何在xml中获取xmlns:dt元素?例如,获取列出产品ID和国家/地区代码的两行结果集.
121403 GBR
121403美国
declare @xmldata xml set @xmldata = '<?xml version="1.0"?> <data xmlns="http://www.aaa.com/master_browse_response" xmlns:dt="http://www.aaa.com/DataTypes"> <products> <product> <product_id><![CDATA[121403]]></product_id> <countries> <dt:country>GBR</dt:country> <dt:country>USA</dt:country> </countries> </product> </products> </data>' DECLARE @hDoc int,@rootxmlns varchar(100) SET @rootxmlns = '<root xmlns:hm="http://www.aaa.com/master_browse_response"/>' EXEC sp_xml_preparedocument @hDoc OUTPUT,@xmldata,@rootxmlns SELECT * FROM OPENXML(@hDoc,'//hm:product',2) WITH ([hm:product_id] int,[hm:countries] varchar(100)) --clean up EXEC sp_xml_removedocument @hDoc
这是我通过使用xmlEdgeTable知道的一个解决方案,但我正在寻找更好的解决方案.
DECLARE @hDoc int,@rootxmlns varchar(100) SET @rootxmlns = '<root xmlns:hm="http://www.aaa.com/master_browse_response"/>' EXEC sp_xml_preparedocument @hDoc OUTPUT,@rootxmlns CREATE TABLE #xmlEdgeTable ( id int,parentid int,localname varchar(20),[text] varchar(20) ) INSERT INTO #xmlEdgeTable SELECT id,parentid,localname,cast([text] as varchar(20)) FROM OPENXML(@hDoc,2) SELECT t6.text,t2.text FROM #xmlEdgeTable AS t1 INNER JOIN #xmlEdgeTable AS t2 ON t1.id = t2.parentid INNER JOIN #xmlEdgeTable AS t3 ON t3.id = t1.parentid INNER JOIN #xmlEdgeTable AS t4 ON t4.id = t3.parentid INNER JOIN #xmlEdgeTable AS t5 ON t4.id = t5.parentid INNER JOIN #xmlEdgeTable AS t6 ON t5.id = t6.parentid WHERE t1.localname = 'country' and t5.localname ='product_id' --clean up EXEC sp_xml_removedocument @hDoc DROP TABLE #xmlEdgeTable
解决方法
是否有特殊原因需要使用OPENXML来执行此操作?您可以在2005年使用XQUERY轻松获取信息,如下所示:
declare @xmldata xml set @xmldata = '<data xmlns="http://www.aaa.com/master_browse_response" xmlns:dt="http://www.aaa.com/DataTypes"> <products> <product> <product_id>121403</product_id> <countries> <dt:country>GBR</dt:country> <dt:country>USA</dt:country> </countries> </product> </products> </data>' ;WITH XMLNAMESPACES ( DEFAULT 'http://www.aaa.com/master_browse_response','http://www.aaa.com/DataTypes' as dt ) SELECT x.c.value('(../../product_id)[1]','varchar(100)') as product_id,x.c.value('(.)[1]','varchar(100)') as country FROM @xmldata.nodes('/data/products/product/countries/dt:country') x(c)
编辑:
与OPENXML相同的解决方案是:
declare @xmldata xml set @xmldata = '<data xmlns="http://www.aaa.com/master_browse_response" xmlns:dt="http://www.aaa.com/DataTypes"> <products> <product> <product_id>121403</product_id> <countries> <dt:country>GBR</dt:country> <dt:country>USA</dt:country> </countries> </product> </products> </data>' DECLARE @hDoc int,@rootxmlns varchar(100) SET @rootxmlns = '<root xmlns:hm="http://www.aaa.com/master_browse_response" xmlns:dt="http://www.aaa.com/DataTypes"/>' EXEC sp_xml_preparedocument @hDoc OUTPUT,@rootxmlns SELECT * FROM OPENXML(@hDoc,'//hm:product/hm:countries/dt:country',2) WITH(Country varchar(100) '.',Product_ID varchar(100) '../../hm:product_id') EXEC sp_xml_removedocument @hDoc