如何提取 XML 节点值?

Posted

技术标签:

【中文标题】如何提取 XML 节点值?【英文标题】:How to extract XML node value? 【发布时间】:2019-04-17 06:09:07 【问题描述】:

我正在尝试创建一个 SQL 函数,该函数通过读取 xmlNode 返回值为 true 的所有月份的逗号分隔值。

但是,我根本无法导航到月份节点。

将命名空间添加到路径并没有帮助我从 Node.Data 中提取值

对于第一个节点(StartDateTime),我能够在类似的行上提取值(通过使用路径作为

/ScheduleDefinition/StartDateTime

请参考以下代码:

CREATE FUNCTION [dbo].[GetMonthsFromXML] 
(
    -- Add the parameters for the function here
    @xmlText NTEXT
)
RETURNS VARCHAR(MAX)
AS
BEGIN
/*
<ScheduleDefinition>
<StartDateTime>04/10/2019 06:00:00</StartDateTime>
<MonthlyRecurrence xmlns="http://schemas.microsoft.com/sqlserver/reporting/2010/03/01/ReportServer">
<Days>29</Days>
<MonthsOfYear>
<January>true</January>
<February>false</February>
<March>true</March>
<April>true</April>
<May>false</May>
<June>false</June>
<July>false</July>
<August>false</August>
<September>false</September>
<October>false</October>
<November>false</November>
<December>false</December>
</MonthsOfYear>
</MonthlyRecurrence>
</ScheduleDefinition>
*/
DECLARE @resultVar VARCHAR(MAX)
DECLARE @x xml
SET @x = CAST(@xmlText AS XML); 


;with cte 
as
(
SELECT 
    [MonthName] = Node.Data.value('local-name(.)', 'VARCHAR(20)')
    ,MonthValue = Node.Data.value('(.)[1]', 'VARCHAR(20)') 
FROM    
    @x.nodes('/ScheduleDefinition/MonthlyRecurrence/MonthsOfYear') Node(Data) 
 )
 select @resultVar = ISNULL( MAX(MonthValue),'') from cte; --where MonthValue is not null and MonthValue <> ''   ;

-- Return the result of the function
RETURN @resultVar

END
GO

Jan, Mar, Apr 是上述 xml 的预期输出

【问题讨论】:

【参考方案1】:

见https://docs.microsoft.com/en-us/sql/relational-databases/xml/add-namespaces-to-queries-with-with-xmlnamespaces?view=sql-server-2017,所以顺着思路

WITH XMLNAMESPACES ( 'http://schemas.microsoft.com/sqlserver/reporting/2010/03/01/ReportServer' as rs)

SELECT 
    [MonthName] = Node.Data.value('local-name(.)', 'VARCHAR(20)')
    ,MonthValue = Node.Data.value('string(.)', 'VARCHAR(20)') 
FROM    
    @x.nodes('/ScheduleDefinition/rs:MonthlyRecurrence/rs:MonthsOfYear/rs:*[. = "true"]') Node(Data)

【讨论】:

感谢您的解决方案和文档的网址。我学到了很多。但是,我遇到了另一个问题,我无法为之努力。由于有几个 XML 定义,我试图根据重复类型传递路径:例如:x.nodes('sql:variable("@path")') Node(data) where @path contains the different pathValues .但是,它似乎不起作用 @MadanPrabhakara,用必要的细节和相关标签(即sql-server)提出一个新问题。

以上是关于如何提取 XML 节点值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server 中使用 XML 节点传递 NULL 而不是字符串格式的“NULL”值

节点的 XML 代码更改值 - 显示的代码如何正确?

如何创建更新查询以将存储为文本的 xml 值提取到新列中

在 JAVA 中使用 SAX 解析器从 XML 文件中提取文本节点

如何获取具有相同名称的元素并根据 XSLT 中的子节点值对它们进行排序

从多个 XML 节点中提取值 [重复]