使用xml中包含的样式表/名称空间查询XML
问题描述:
我尝试了几种方法来查询这些数据,但尚未成功。我在SQL Server 2012上。任何帮助将不胜感激。使用xml中包含的样式表/名称空间查询XML
<NewDataSet>
<Table>
<_x005B_M_x005D_._x005B_SEQID_x005D_ xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:short">200</_x005B_M_x005D_._x005B_SEQID_x005D_>
<_x005B_M_x005D_._x005B_CPID_x005D_ xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">1002</_x005B_M_x005D_._x005B_CPID_x005D_>
</Table>
</NewDataSet>
答
declare @demo xml = '<NewDataSet>
<Table>
<_x005B_M_x005D_._x005B_SEQID_x005D_ xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:short">200</_x005B_M_x005D_._x005B_SEQID_x005D_>
<_x005B_M_x005D_._x005B_CPID_x005D_ xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">1002</_x005B_M_x005D_._x005B_CPID_x005D_>
</Table>
</NewDataSet>'
select t.r.value('(./*[local-name()=''_x005B_M_x005D_._x005B_SEQID_x005D_'']/text())[1]','integer') seqid
, t.r.value('(./*[local-name()=''_x005B_M_x005D_._x005B_CPID_x005D_'']/text())[1]','nvarchar(128)') cpid
from @demo.nodes('/*/*') t(r)
答
这将有助于对你想要什么摆脱这一点,但这里是一个开始更多的细节,假设每个元素的XML表示行:
DECLARE @SampleData XML = N'
<NewDataSet>
<Table>
<_x005B_M_x005D_._x005B_SEQID_x005D_ xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:short">200</_x005B_M_x005D_._x005B_SEQID_x005D_>
<_x005B_M_x005D_._x005B_CPID_x005D_ xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">1002</_x005B_M_x005D_._x005B_CPID_x005D_>
</Table>
</NewDataSet>
';
DECLARE @Delim VARCHAR(50) = '._x005B_';
DECLARE @DelimLen INT = LEN(@Delim);
;WITH cte AS
(
SELECT xrow.value('local-name(.)', 'VARCHAR(50)') AS [ElementName],
xrow.value('declare namespace xsi="http://www.w3.org/2001/XMLSchema-instance"; (./@xsi:type)[1]', 'VARCHAR(50)') AS [xsi:type],
xrow.value('./text()[1]', N'VARCHAR(50)') AS [ElementValue]
FROM @SampleData.nodes('NewDataSet/Table/*') t(xrow)
)
SELECT *,
SUBSTRING(
cte.ElementName,
CHARINDEX(@Delim, cte.ElementName) + @DelimLen,
CHARINDEX('_',
cte.ElementName,
CHARINDEX(@Delim, cte.ElementName) + @DelimLen + 1) -
(CHARINDEX(@Delim, cte.ElementName) + @DelimLen)
) AS [RowType]
FROM cte;
输出:
ElementName xsi:type ElementValue RowType
_x005B_M_x005D_._x005B_SEQID_x005D_ xs:short 200 SEQID
_x005B_M_x005D_._x005B_CPID_x005D_ xs:string 1002 CPID
另外 - 此文档的根名称空间是什么? – 2014-09-28 19:18:21
...你试过什么样的疑问?展示你的工作。 – 2014-09-28 19:19:21
我在这里看到的唯一命名空间是用于'xs'和'xsi'前缀,并且您的标记不使用任何名称空间前缀,因此它们应该完全不相关。 – 2014-09-28 19:19:54