如何像这样解析XML有序列表
<ol>
<li>value1</li>
<li>value2</li>
<li>value3</li>
</ol>
进入这样的表格(就像它在html中可见(:
Nr Value
----------- ------
1 value1
2 value2
3 value3
以下是XML字符串的代码:
declare @ol XML= '<ol><li>'+REPLACE('value1,value2,value3', ',', '</li><li>')+'</li></ol>'
select @ol
注意是否可以在不创建类似identity
列的内容的情况下从XML中解析"编号"?
小更新:以下解决方案为上述简单示例提供了正确答案:
- 伊扎克·哈宾斯基,萨勒曼A
- 阿赫莱什·辛格
但是有可能为这个更棘手的例子找到解决方案吗:
DECLARE @ol XML
SET @ol=
'<ol type="i" start="3">
<li>value1</li>
<li>value2</li>
<li>value3</li>
</ol>';
估计结果:
Nr Value
---- -------
iii value1
iv value2
v value3
找到节点很容易,找到它们的相对位置很棘手。以下是通过<<
运算符和count
函数使用节点比较操作的一个解决方案:
DECLARE @ol XML = '<ol>
<li>value1</li>
<li>value2</li>
<li>value3</li>
</ol>';
SELECT li.value('.', 'NVARCHAR(100)') AS value
, li.value('let $n := . return count(../*[. << $n]) + 1', 'int') AS pos
FROM @ol.nodes('/ol/li') AS x(li)
DECLARE @ol XML
SET @ol= '<ol>
<li>value1</li>
<li>value2</li>
<li>value3</li>
</ol>';
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS Nr,
li.value('.', 'NVARCHAR(100)') AS Value
FROM @ol.nodes('/ol/li') AS x(li)
尝试此简单查询。。。在这里正在获取行号((。。。所以我们得到Nr作为数字。。。1,2,3..依此类推…并将xml值放入表…中。。。。
您将获得这种类型的输出。。。
输出:
Nr Value
----------- ------
1 value1
2 value2
3 value3
编辑问题后。。。解决方案应该是这样的。。。。。
DECLARE @ol XML
SET @ol=
'<ol type="i" start="3">
<li>value1</li>
<li>value2</li>
<li>value3</li>
</ol>';
SELECT 2 + ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS Nr,
li.value('.', 'NVARCHAR(100)') AS Value
FROM @ol.nodes('/ol/li') AS x(li)
输出:
Nr Value
----------- ------
3 value1
4 value2
5 value3
这里将+2值添加到RowNumber((中,这样……我们就可以得到值2,3,4…等等。