使用 MySQL 提取值
ExtractValue with MySQL
我正在尝试从加载到数据库列 (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
您的 XML 示例格式不正确,因为它缺少结束 </soap:Envelope>
标记。
您 运行 遇到的问题是 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';
无论如何,这应该可以解决您的问题。
我也遇到了同样的问题
但是如果您不相信使用 "extracting the portion of the required xml",您可以切换到 MYSQL 服务器版本 5.6 或更高版本。 issue/bug已经在5.6及以上版本修复
这应该可以解决您的问题。
我正在尝试从加载到数据库列 (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
您的 XML 示例格式不正确,因为它缺少结束 </soap:Envelope>
标记。
您 运行 遇到的问题是 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';
无论如何,这应该可以解决您的问题。
我也遇到了同样的问题
但是如果您不相信使用 "extracting the portion of the required xml",您可以切换到 MYSQL 服务器版本 5.6 或更高版本。 issue/bug已经在5.6及以上版本修复
这应该可以解决您的问题。