【问题标题】:Extracting Text Values from XML in SQL在 SQL 中从 XML 中提取文本值
【发布时间】:2019-05-29 16:21:02
【问题描述】:

我正在处理由第 3 方托管的 SQL 数据,并试图提取一些特定信息以进行报告。但是,我需要解析的一些内容是 XML 格式的,我被卡住了。我正在寻找仅从 XML 代码中提取 text= 值的语法。

我相信代码应该是这样的,但是我可以在网上找到的大多数示例都涉及比我正在处理的更简单的 XML 层次结构。

<[columnnameXML].value('(/RelatedValueListBO/Items/RelatedValueListBOItem/text())[1]','varchar(max)')>

无法提取任何结果。我也尝试过声明空间名称,但又一次......我最终只得到了 NULL 值。

我正在处理的示例 XML:

<RelatedValueListBO xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                    xmlns="http://tempuri.org/RelatedValueListBOSchema.xsd">
    <Items>
        <RelatedValueListBOItem groupKey="Response1" text="Response1" selected="true" />
        <RelatedValueListBOItem groupKey="Response2" text="Response2" selected="true" />
        <RelatedValueListBOItem groupKey="Response3" text="Response3" selected="true" />
    </Items>
</RelatedValueListBO>

理想情况下,我想拉响应1;响应2; response3 放入一列。考虑到可能存在多个响应的事实。我相信由于与 RelatedValueListBO 关联的命名空间以及我想要的内容被分组在 groupKey、text 和 selected 中的事实,我一直在尝试使用基本代码,而不是我想要的值。项目节点。

【问题讨论】:

  • 您应该发布您正在使用的实际查询。在我看来,最有可能的问题是您在编写查询时没有考虑 xml 命名空间。
  • 最好使用真正的编程语言,如 c#。
  • 我假设您使用的是 SQL Server,请更新标签。

标签: sql xml ssms


【解决方案1】:

您在 XML 中定义了名称空间,因此您也需要在 XQuery 中定义它们。
快速而肮脏的方法是用“*”替换所有命名空间:

SELECT @x.value('(/*:RelatedValueListBO/*:Items/*:RelatedValueListBOItem/@text)[1]','varchar(max)')

要在单个列中获取所有响应,您可以使用:


SELECT 
 Item.Col.value('./@text','varchar(max)') X
FROM @x.nodes('/*:RelatedValueListBO/*:Items/*:RelatedValueListBOItem') AS Item(Col)

如果您需要更好的性能,您可能需要正确定义命名空间。

【讨论】:

  • 非常感谢。您的第一个回复是我在此处的第二个答案之后尝试过的:stackoverflow.com/questions/22818591/…,但我错过了文本的血腥@符号。您的第一个答案工作正常,并将 1 更改为 2 等...如果需要,我可以将后续响应拉到一起。现在我并没有完全遵循您的第二个解决方案,但我确实取得了成功:
  • Columnname = STUFF(( SELECT ',' + CONVERT(VARCHAR(50), review.value('@text', 'varchar(max)')) FROM tablenamea w CROSS APPLY w.[ ContributingBiologicalFactorsXML].nodes('/*:RelatedValueListBO/*:Items/*:RelatedValueListBOItem') 评论(评论) where w.uniqueid = tablenamea(x).uniqueid FOR XML PATH('')), 1, 1, '' )
【解决方案2】:

您可以使用类似这样的方法来提取 RelatedValueListBOItem 的第一个节点中“文本”的值

SELECT  extractvalue(value(rs), '//RelatedValueListBOItem[1]/@text')
  FROM TABLE (xmlsequence(extract(sys.xmltype('<RelatedValueListBO>
      <Items>
        <RelatedValueListBOItem groupKey="Response1" text="Response1" 
    selected="true" />
    <RelatedValueListBOItem groupKey="Response2" text="Response2" 
    selected="true" />
    <RelatedValueListBOItem groupKey="Response3" text="Response3" 
    selected="true" />
     </Items>
    </RelatedValueListBO>'),'/RelatedValueListBO/Items'))) rs;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 2020-09-21
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多