我有一位客户正在使用我们开发的平台,该平台允许客户 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/