如何为DOMDocument XML的每个元素添加引号并存入MySQL数据库
嘿,别担心英语的问题,完全懂你的需求!你现在已经能把XML里的元素存入MySQL了,就差给每个元素值加上双引号对吧?下面给你几个实用的解决方案,看哪种更适合你的场景:
方法1:在读取XML的代码里直接加双引号
假设你用Python处理(其他语言逻辑类似),可以在提取元素文本的时候,直接把文本用双引号包裹起来——记得先去掉文本前后多余的空格哦:
import xml.etree.ElementTree as ET import mysql.connector # 解析你的XML文件 tree = ET.parse('tu_archivo.xml') root = tree.getroot() # 连接MySQL数据库(替换成你的配置) conn = mysql.connector.connect( host='localhost', user='tu_usuario', password='tu_contraseña', database='tu_base_datos' ) cursor = conn.cursor() # 处理<encabezado>部分 fecha_reporte = f'"{root.find("encabezado/fecha_reporte").text.strip()}"' fecha_esperada = f'"{root.find("encabezado/fecha_esperada").text.strip()}"' # 插入数据(根据你的表结构调整字段和表名) cursor.execute( "INSERT INTO encabezado (fecha_reporte, fecha_esperada) VALUES (%s, %s)", (fecha_reporte, fecha_esperada) ) # 处理<detalle>部分(如果有多个detalle节点就用循环) for detalle in root.findall("detalle"): matricula = f'"{detalle.find("matricula").text.strip()}"' nombre = f'"{detalle.find("nombre").text.strip()}"' creditos_costo = f'"{detalle.find("creditos_costo").text.strip()}"' creditos_cursar = f'"{detalle.find("creditos_cursar").text.strip()}"' creditos_monto = f'"{detalle.find("creditos_monto").text.strip()}"' cursor.execute( "INSERT INTO detalle (matricula, nombre, creditos_costo, creditos_cursar, creditos_monto) VALUES (%s, %s, %s, %s, %s)", (matricula, nombre, creditos_costo, creditos_cursar, creditos_monto) ) # 提交更改并关闭连接 conn.commit() cursor.close() conn.close()
方法2:用XSLT预先转换XML
如果你想先把整个XML里的元素值都加上双引号,再用原来的流程存入数据库,可以用XSLT做一次转换:
先创建一个转换模板文件add_quotes.xsl:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes" encoding="UTF-8"/> <!-- 处理所有文本节点:去掉空格+加双引号 --> <xsl:template match="text()"> <xsl:text>"</xsl:text> <xsl:value-of select="normalize-space(.)"/> <xsl:text>"</xsl:text> </xsl:template> <!-- 保留原XML的所有标签结构 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
然后用命令行工具xsltproc执行转换(也可以用其他支持XSLT的工具):
xsltproc add_quotes.xsl tu_archivo.xml > xml_con_comillas.xml
转换后的XML里,每个元素的文本都会变成带双引号的样子,比如:
<fecha_reporte>"2017-01-31"</fecha_reporte>
之后你直接用这个转换后的XML去存入MySQL就可以了,不用改原来的代码。
方法3:在MySQL插入语句里拼接双引号
如果不想修改读取XML的逻辑,也可以在写INSERT语句的时候,用MySQL的CONCAT函数给值加上双引号:
比如插入<encabezado>的语句可以写成这样:
INSERT INTO encabezado (fecha_reporte, fecha_esperada) VALUES (CONCAT('"', TRIM(%s), '"'), CONCAT('"', TRIM(%s), '"'));
这里TRIM用来去掉文本前后的空格,CONCAT把双引号和文本拼接在一起,这样存入数据库的值就自动带双引号了。
小提醒:如果你的MySQL字段是数值类型(比如INT),加双引号后MySQL会自动转换,但如果开启了严格模式可能会报错,所以要确保字段类型和你存入的内容匹配哦~
内容的提问来源于stack exchange,提问作者I. Valera




