Red Hat系统下转换SOAP XML适配MySQL LoadXML的方法咨询
解决方案:用XSLT命令行预处理适配MySQL导入
针对你遇到的SOAP XML与MySQL导入不兼容的问题,用命令行XSLT预处理是完全可行的方案,下面分别给出优先的CSV转换方案,以及MySQL LoadXML兼容的XML转换方案,彻底解决空格导致的导入问题。
一、XSLT转CSV(优先选择)
CSV是MySQL导入最稳定的格式,能完美规避空格、特殊字符的问题。Red Hat系统自带xsltproc工具(如果没有,执行yum install libxslt安装即可),可以快速完成转换。
1. 编写XSLT转换模板
假设你的SOAP XML结构类似这样(模拟常见的SOAP响应):
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <UserResponse> <UserRecord> <user_id>1</user_id> <user_name>Alice Brown</user_name> <user_email>alice@example.com</user_email> </UserRecord> <UserRecord> <user_id>2</user_id> <user_name>Bob White</user_name> <user_email>bob@example.com</user_email> </UserRecord> </UserResponse> </soap:Body> </soap:Envelope>
编写对应XSLT模板(保存为soap_to_csv.xsl),注意替换表头和节点匹配规则为你的实际表列和XML结构:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <xsl:output method="text" encoding="UTF-8"/> <!-- 输出CSV表头,对应MySQL表的列 --> <xsl:template match="/"> <xsl:text>user_id,user_name,user_email </xsl:text> <xsl:apply-templates select="//UserRecord"/> </xsl:template> <!-- 处理每个数据节点,生成CSV行,自动转义双引号 --> <xsl:template match="UserRecord"> <xsl:value-of select="concat('"', user_id, '"', ',')"/> <xsl:value-of select="concat('"', replace(user_name, '"', '""'), '"', ',')"/> <xsl:value-of select="concat('"', replace(user_email, '"', '""'), '"')"/> <xsl:text> </xsl:text> </xsl:template> </xsl:stylesheet>
2. 命令行执行转换
xsltproc soap_to_csv.xsl your_soap_input.xml > output_data.csv
3. 导入MySQL
LOAD DATA INFILE '/path/to/output_data.csv' INTO TABLE your_target_table FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES; -- 跳过CSV表头行
二、XSLT转MySQL LoadXML兼容格式
如果不想转CSV,也可以直接把SOAP XML转换成MySQL LoadXML要求的结构——根节点为表名,子节点为<row>,每个<row>下的子节点对应表列。
1. 编写XSLT转换模板
保存为soap_to_mysql_xml.xsl,替换表名和节点规则:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <xsl:output method="xml" encoding="UTF-8" indent="yes"/> <xsl:template match="/"> <!-- 替换为你的MySQL表名 --> <your_target_table> <xsl:apply-templates select="//UserRecord"/> </your_target_table> </xsl:template> <xsl:template match="UserRecord"> <row> <xsl:copy-of select="user_id"/> <xsl:copy-of select="user_name"/> <xsl:copy-of select="user_email"/> </row> </xsl:template> </xsl:stylesheet>
2. 命令行执行转换
xsltproc soap_to_mysql_xml.xsl your_soap_input.xml > mysql_compatible.xml
3. 导入MySQL
LOAD XML LOCAL INFILE '/path/to/mysql_compatible.xml' INTO TABLE your_target_table ROWS IDENTIFIED BY '<row>';
三、批量处理多个XML文件
如果有多个对应不同表的XML,可以写个shell脚本批量处理:
#!/bin/bash # 处理表1的XML xsltproc table1_transform.xsl table1_input.xml > table1_output.csv # 处理表2的XML xsltproc table2_transform.xsl table2_input.xml > table2_output.csv # 批量导入MySQL mysql -u your_username -p your_database <<EOF LOAD DATA INFILE '/path/to/table1_output.csv' INTO TABLE table1 FIELDS TERMINATED BY ',' ENCLOSED BY '"' IGNORE 1 LINES; LOAD DATA INFILE '/path/to/table2_output.csv' INTO TABLE table2 FIELDS TERMINATED BY ',' ENCLOSED BY '"' IGNORE 1 LINES; EOF
给脚本加执行权限后运行:
chmod +x batch_process.sh ./batch_process.sh
内容的提问来源于stack exchange,提问作者Danny Z
相关产品推荐
相关产品推荐

