xml - 如何使用 XQuery/T-SQL 解析包含嵌套默认命名空间的客户 xml

标签 xml t-sql soap xquery xml-namespaces

我有一位客户正在使用我们开发的平台,该平台允许客户 Web 服务返回数据由 MSSQL 中的存储过程进行解析。我们有一位客户发回 xml,其中包含针对不同 URI 位置的嵌套 xmlns="xxxxxx"声明。首先这有效吗?其次是否可以使用 XQuery 进行解析?我尝试过使用 t-sql xml 数据类型的 .value 和 .query 功能来尝试解决该问题,但“第二个默认命名空间”发挥作用的点似乎是一个几乎不可能跨越的边界我所知道的技术。下面是一个 xml 响应示例:

    <?xml version="1.0" encoding="UTF-8"?>
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
     <soapenv:Body>
      <FF_LOG_RSPD_CONT xmlns="http://xmlns.oracle.com/Enterprise/Tools/schemas/X.V1">
       <FF_LOGIN_WSDL_RSPD>
        <FF_PYIVR_RS_DER xmlns="http://xmlns.oracle.com/Enterprise/Tools/schemas/Y.V1">
         <EMPLID>111111</EMPLID>
         <PIN>2222</PIN>
         <NEW_PIN_FLAG>N</NEW_PIN_FLAG>
         <REVOKE_FLAG>N</REVOKE_FLAG>
         <LAST_4_OF_SSN></LAST_4_OF_SSN>
         <WSDL_SUCCESS_FLAG>Y</WSDL_SUCCESS_FLAG>
        </FF_PYIVR_RS_DER>
       </FF_LOGIN_WSDL_RSPD>
      </FF_LOG_RSPD_CONT>
     </soapenv:Body>
    </soapenv:Envelope>

最佳答案

您可以尝试显式调用 namespace 吗?

declare @theXml XML = '<?xml version="1.0" encoding="UTF-8"?>
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
     <soapenv:Body>
      <FF_LOG_RSPD_CONT xmlns="http://xmlns.oracle.com/Enterprise/Tools/schemas/X.V1">
       <FF_LOGIN_WSDL_RSPD>
        <FF_PYIVR_RS_DER xmlns="http://xmlns.oracle.com/Enterprise/Tools/schemas/Y.V1">
         <EMPLID>111111</EMPLID>
         <PIN>2222</PIN>
         <NEW_PIN_FLAG>N</NEW_PIN_FLAG>
         <REVOKE_FLAG>N</REVOKE_FLAG>
         <LAST_4_OF_SSN></LAST_4_OF_SSN>
         <WSDL_SUCCESS_FLAG>Y</WSDL_SUCCESS_FLAG>
        </FF_PYIVR_RS_DER>
       </FF_LOGIN_WSDL_RSPD>
      </FF_LOG_RSPD_CONT>
     </soapenv:Body>
    </soapenv:Envelope>'

SELECT
    @theXml.value('
        declare namespace ns1="http://schemas.xmlsoap.org/soap/envelope/";
        declare namespace ns2="http://xmlns.oracle.com/Enterprise/Tools/schemas/X.V1";
        declare namespace ns3="http://xmlns.oracle.com/Enterprise/Tools/schemas/Y.V1";
        (/ns1:Envelope/ns1:Body/ns2:FF_LOG_RSPD_CONT/ns2:FF_LOGIN_WSDL_RSPD/ns3:FF_PYIVR_RS_DER/ns3:EMPLID)[1]', 
        'nvarchar(max)') as result

结果:

111111

关于xml - 如何使用 XQuery/T-SQL 解析包含嵌套默认命名空间的客户 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20056208/

相关文章:

asp.net - 在时间紧迫的情况下添加更多硬件 v/s 重构代码

T-SQL,将字符串切割成35个字符的 block 而不切割单词

sql - 嵌套选择 - 多部分标识符未绑定(bind)错误

sql-server - 窗口函数在子查询/CTE 中的行为不同?

java - WSIT/Metro 不理解安全 SOAP header

c# - Linq XML to Object,其中 xml 节点具有嵌套元素

xml - R XML getNodeset 找不到节点

Android:在 XML 中调整 ImageView 的大小

java - CXF 未将父类(super class)添加到生成的类中

java - 无法使用 SAXFilter 删除 SOAP 响应的命名空间