如何将 XML 有序列表解析为表格视图

Posted

技术标签:

【中文标题】如何将 XML 有序列表解析为表格视图【英文标题】:How to parse XML ordred list into table view 【发布时间】:2019-10-23 10:51:09 【问题描述】:

如何像这样解析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

注意!是否可以从 XML 解析“编号”而不创建类似 identity 列的内容?

小更新: 以下解决方案为上述简单示例提供了正确答案:

    Yitzhak Khabinsky, Salman A akhilesh singh

但是是否有可能为这个更棘手的例子找到解决方案:

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

?

【问题讨论】:

到目前为止您尝试过什么?你看过XQUERY吗?有很多关于如何在 SQL Server 中读取 xml 数据类型的示例;您不理解哪些答案,因此我们可以向您解释。谢谢, 订单是否重要,例如是否可以在结果中使用1, value3 而不是1, value1 @SalmanA 是的,这很重要 @Denis...我已经编辑了我的答案,您可以查看... 【参考方案1】:

找到节点很容易,找到它们的相对位置很棘手。这是通过&lt;&lt; 运算符和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)

【讨论】:

谢谢你们,为这个“疯狂”的例子。 :) 您的解决方案适用于任何元素。代码是否可以考虑到它是特定元素olli 并读取一些“元数据”? 不确定你的意思。如果您尝试匹配特定的ol,例如&lt;ol class="foo"&gt; 然后只需使用选择器 /ol[@class="foo"]/li 我更新了帖子:将您的解决方案的链接放在我的问题中,并添加一个更棘手的问题/示例。你有解决办法吗? @Denis typestart 属性只能由浏览器理解和呈现。 XML 不知道这些 HTML 属性是什么意思。可以读取 start 属性并将其添加到每个数字(1 变为 3,2 变为 4),但我不确定如何将数字转换为罗马数字。然后你也有type=a 好吧,换个角度看:不使用&lt;ol&gt;标签,是否可以在XML中组织编号?【参考方案2】:
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...等等..

【讨论】:

您确定这是确定性解决方案吗?例如,你确定对于 value1 我总是得到 Nr 1,而不是其他东西(尤其是在大列表中)? No...No....它将生成行号....1,2,3...并且必须继续...不取决于 value1 或 value2 谢谢。我更新了帖子:将指向您的解决方案的链接放在我的问题中,并添加一个更棘手的问题/示例。你有解决办法吗? ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) 将生成任意行号。您无法保证 Value1 将始终获得 1 作为行号。阅读The “Natural order” misconception @akhileshsingh 不幸的是,正如上面提到的@Zohar Peled,为此目的使用ROW_NUMBER() 是不安全的。

以上是关于如何将 XML 有序列表解析为表格视图的主要内容,如果未能解决你的问题,请参考以下文章

具有多个连接/提要/视图的 XML 解析的设计/实施建议

将部分 XML 字符串解析为 XElement 列表

将 JSON 解析为 Dart 中的列表

SBJSON 解析器内存泄漏

将 App.Config 数据解析为对象列表

将 HTML 表解析为 Python 列表?