XML转SQL需先规范结构:确保平铺记录节点、合法字段名、清洗特殊字符;推荐xsltproc+XSLT或Python ElementTree,注意字符集、NULL处理及BOM清理。
XML转SQL Insert语句:先确认结构是否规整
直接拿原始XML去生成Insert,大概率失败——
、
这类工具只认“表结构明确”的XML。比如每条记录是
或
,字段用子节点或属性表示;如果嵌套三层、混合文本和属性、还有CDATA块,工具会丢字段或报错
。
实操建议:
用浏览器或
先看缩进是否一致,确认根节点下是平铺的同级记录节点
字段名必须是合法SQL列名:避免空格、中文、以数字开头(如
要重命名)
如果XML里有
这种带符号的值,得提前清洗,否则生成的
会语法错误
命令行快速生成:用xsltproc + XSLT模板
比在线工具更可控,尤其适合批量处理或CI中调用。核心是写一个XSLT模板把每个
转成
,再用系统自带的
执行。
常见错误现象:
——通常因为XSLT版本写错(用
,别写2.0)、或
里用了不支持的XPath函数(如
)。
示例(假设XML中每条记录为
):
执行命令:
Python脚本替代方案:用xml.etree.ElementTree更稳
在线工具常对大文件(>10MB)超时或截断,
在内存里解析,可控性高,还能加清洗逻辑。
容易踩的坑:
后没检查
是否符合预期,导致
循环为空
字段含单引号(如
)直接拼SQL会崩,必须用
或参数化占位(但Insert语句本身不支持预编译,只能转义)
数值字段用
取出来是字符串,插入前要
或
,否则生成的SQL里带引号变成字符串字面量
关键片段示意:
生成的SQL怎么用:注意字符集和NULL处理
生成的
直接
可能报错
——XML默认是UTF-8,但MySQL连接或表字符集可能是
。
实操要点:
导出前确认目标表用
:运行
,看
是否在建表语句里
XML中空字段(
或
)默认生成
,但数据库期望
,得在脚本里判断
然后输出
避免一次导入几万条:MySQL默认
,大文件拆成每500条一个事务,加
/
包裹
最麻烦的其实是XML里混着HTML片段、换行符、BOM头——这些不会报错,但会让生成的SQL执行失败,且错误位置难定位。处理前先
看有没有
(BOM),有就用
清理。
xml2sqlxsldoc|
Invalid token at line Xxmllint --format input.xml<2nd_value>¥199.00 INSERTrowINSERT INTO ... VALUES (...)xsltprocxsltproc: failed to parse stylesheet.xslversion="1.0"replace()
INSERT INTO users (id, name) VALUES ( , ' ');
xsltproc template.xsl data.xml > insert.sqlElementTreetree.getroot()root.tagfor child in root:O'Connorvalue.replace("'", "''")child.textint()float()import xml.etree.ElementTree as ET
tree = ET.parse('data.xml')
root = tree.getroot()
for row in root.findall('row'):
id_val = row.find('id').text.strip()
name_val = row.find('name').text.replace("'", "''")
print(f"INSERT INTO t VALUES ({id_val}, '{name_val}');")insert.sqlmysql -u user db < insert.sqlIncorrect string valuelatin1utf8mb4SHOW CREATE TABLE users;CHARSET=utf8mb4VALUES ('')NULLif elem.text is None or elem.text.strip() == ''NULLmax_allowed_packet=4MBEGIN;COMMIT;head -c 100 data.xml | hexdump -Cef bb bfsed -i '1s/^\xEF\xBB\xBF//' data.xml