【问题标题】:Mssql How to get the desired XML tag with "OPENXML"?Mssql 如何使用“OPENXML”获取所需的 XML 标记?
【发布时间】:2020-06-24 00:27:45
【问题描述】:

我正在使用 Microsoft Sql 2012 Express

使用“Soap Service”中的“sp_OAGetProperty”,我得到一个“nvarchar (max)”值,如下所示。

--uuid:ec76ddb3-a0ef-4e4d-980d-2dcddd967e44+id=343  Content-ID: 
<http://tempuri.org/0>  Content-Transfer-Encoding: 8bit  Content-Type: application/xop+xml;charset=utf-8;type="application/soap+xml"    
    <s:Envelope
        xmlns:s="http://www.w3.org/2003/05/soap-envelope">
        <s:Body
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <LoginResponse
                xmlns="http://tempuri.org/">
                <LoginResult>true</LoginResult>
                <sessionID>eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiIwZmIxNTVhMi0wOTgwLTQwMGQtODdkOC1kYTQ4MzZiMTk1YzEiLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9zaWQiOiI5IiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvbmFtZSI6IlVCTDJAVEVTVC5DT00jghjghU</sessionID>
            </LoginResponse>
        </s:Body>
    </s:Envelope>
--uuid:ec76ddb3-a0ef-4e4d-980d-2dcddd967e44+id=343--  

我正在尝试使用代码从这个 XML 中获取 LoginResult、sessionID 值。

我也将使用此编码延续。示例我将启动另一个“soapService”并发送 sessionID。

EXEC sp_xml_preparedocument @Yanit OUTPUT,
                            @XML
SELECT LoginResult,
       sessionID
FROM OPENXML(@XML, 's:Envelope/s:Body/LoginResponse')
WITH
(
LoginResult [varchar](500) 'LoginResult',
sessionID [varchar](500) 'sessionID'
)

EXEC sp_xml_removedocument @Yanit

这是我上次尝试的代码,但它返回错误消息给我。

消息 225,级别 16,状态 12,行 193 为函数“OpenXML”提供的参数无效。

【问题讨论】:

    标签: sql-server soap openxml


    【解决方案1】:

    您可以使用 .value 来获取 xml 内容。

    我已经稍微修改了 XML 以适应(因为我没有时间),但这应该可以让你稍微调整一下

    declare @raw_xml xml = '<Envelope >
      <Body >
                <LoginResponse >
                    <LoginResult>true</LoginResult>
                    <sessionID>eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiIwZmIxNTVhMi0wOTgwLTQwMGQtODdkOC1kYTQ4MzZiMTk1YzEiLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9zaWQiOiI5IiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvbmFtZSI6IlVCTDJAVEVTVC5DT00jghjghU</sessionID>
                </LoginResponse>
            </Body>
        </Envelope>'
    
        select @raw_xml
        
        
        ,@raw_xml.value('(Envelope/Body/LoginResponse/LoginResult/text())[1]', 'varchar(10)') login_result
        ,@raw_xml.value('(Envelope/Body/LoginResponse/sessionID/text())[1]', 'varchar(max)') login_result
    

    【讨论】:

      【解决方案2】:

      我知道这个问题很老,但如果有人有同样的问题,请考虑以下问题:

      1. 错误信息告诉你参数错误 - 调用时 您需要为 DOM 表示传递引用的 OpenXML 函数 在内存中,作为 OUTPUT 参数给出 sp_xml_preparedocument 过程(变量 @Yanit 在你的情况下);

      2. 文档:https://docs.microsoft.com/en-us/sql/t-sql/functions/openxml-transact-sql?view=sql-server-ver15

      3. 使用值为 2 的参数 flag 告诉函数在 's:Envelope/s:Body/LoginResponse' 中获取 elements (LoginResult, sessionID):

        FROM OPENXML(@XML, 's:Envelope/s:Body/LoginResponse', 2)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        相关资源
        最近更新 更多