检索多个 xml 子节点值

Posted

技术标签:

【中文标题】检索多个 xml 子节点值【英文标题】:Retrieving multiple xml child node values 【发布时间】:2014-01-22 20:56:13 【问题描述】:

我有一个 varchar(max) 类型的列,其中填充了 xml 节点和值;例如,列数据以<tag1> <tag2>value1</tag2><tag3>value2</tag3>... </tag1> 开头。我需要从这个字符串中得到的是“value1 value2 value3 ... valueN”,在一个单元格中使用静态 SQL 或存储过程为表中的每一行。节点树并不总是相同的,有时路径是<tagX><tagY>valueY</tagY>...</tagX>

我在粉碎 xml 方面的所有经验仅用于获取一个特定的值、属性或标签,而不是在保留列数和行数的同时获取所有值。目前我查询然后循环遍历我的产品端的结果集并粉碎所有内容,但由于最近的变化,这不再是一个选项。

可以将列更改为 xml 类型,但如果可能的话,我想避免这样做。

【问题讨论】:

你能展示一些数据和你到目前为止尝试过的东西吗??? 我无法显示任何数据,因为它是 PCI。我尝试声明一个 xml 变量并将其设置为列数据(目的是在它包含字符''时循环并切碎)但是因为我需要对列中的所有行执行此操作我被存储在其中的多个值抓住了。我考虑过 modify() 但由于节点路径的可变性质,删除和值都不起作用,因为我需要提供一个设置路径(并且删除不保留值)。我对 xml 的经验相当有限,所以我不知道其他可能的解决方案。 【参考方案1】:

将列转换为 XML(或在表中将其更改为 XML)并将 //* 上的 xml 切碎以获取表中的所有节点。然后您可以使用for xml path 将这些值重新连接在一起。

select (
       select ' '+X.N.value('text()[1]', 'varchar(max)')
       from (select cast(T.XMLCol as xml)) as T1(XMLCol)
         cross apply T1.XMLCol.nodes('//*') as X(N)
       for xml path(''), type
       ).value('substring(text()[1], 2)', 'varchar(max)')
from T

SQL Fiddle

【讨论】:

以上是关于检索多个 xml 子节点值的主要内容,如果未能解决你的问题,请参考以下文章

java 如何读取xml文件中的一个节点下的多个相同子节点

通过c#读取xml的多个子节点

读取具有多个名称空间的子节点

XSLT 1.0 - 用 HTML 包装的多个子节点模板

Codeforces 486D Valid Sets

使用C#XML文档类修改子节点值