使用MySQL ExtractValue

时间:2015-10-28 15:58:19

标签: mysql sql xml extract-value

我正在尝试从加载到数据库列(file_output)的XML输出中提取用户名值。我的查询返回一个空值而不是按照我的预期执行。感谢您的帮助。

XML输出:

    <soap:Envelope xmlns:ones="http://onesource.gmtorque.com" xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
      <soap:Header>
        <wsse:Security>
          <wsse:UsernameToken>
            <wsse:Username>username_prod</wsse:Username>
            <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">password</wsse:Password>
          </wsse:UsernameToken>
        </wsse:Security>
      </soap:Header>
</soap:Envelope>

查询:

SELECT DISTINCT 
RR.file_output
ExtractValue (file_output, '/soap:Envelope/soap:Header/wsse:Security/wsse:UsernameToken/wsse:Username') AS"Username"
FROM schema.Records
WHERE create_DTM >'2015-10-25';

预期值为username_prod

3 个答案:

答案 0 :(得分:0)

您拥有的XML示例格式错误,因为它缺少结束</soap:Envelope>标记。

SQL Fiddle

答案 1 :(得分:0)

您遇到的问题是MySQL的错误。您尝试解析的XML很可能太长。我很确定它与这个错误相关:https://bugs.mysql.com/bug.php?id=62429。要解决此错误,您只需提取您尝试导航的XML部分,或者只使用其他方法来提取您正在寻找的值。无论如何,我选择的解决方案是提取您尝试通过XPath导航的XML,并使用您提供的XPath查询来提取结果。

SELECT DISTINCT RR.consumer_ID
    , RR.file_output
    , RR.response_message
    , RR.external_ID
    , RR.create_DTM
    , E.client_license_ID
    , ExtractValue(CONCAT(LEFT(RR.file_output, (INSTR(LEFT(RR.file_output,1000), "</soap:Header>") + 14)),"</soap:Envelope>"), '//wsse:Security/wsse:UsernameToken/wsse:Username') AS Username
FROM kettle_data_transfer.Records RR
    JOIN kettle_data_transfer.Event_Mappings EM ON RR.event_mapping_ID = EM.event_mapping_ID AND RR.data_transfer_ID = EM.data_transfer_ID
    JOIN efn.Events E on EM.event_ID = E.event_ID
WHERE 0=0
    AND RR.data_transfer_ID = 43
    AND RR.failure_code = 0
    AND RR.mode = 'production'
    AND RR.`ignore` = 0
    AND RR.create_DTM > '2015-10-25';

无论如何,这应该可以解决你的问题。

答案 2 :(得分:0)

即使我遇到了同样的问题。

但如果您不相信使用“提取所需xml的部分”,则可以转到MYSQL Server 5.6或更高版本。该问题/错误已在5.6及更高版本中得到修复。

这应该可以解决你的问题。