使用PHP脚本导入XML到MySQL失败,求适配特定XML结构的方案
XML数据无法导入MySQL数据库的修复方案
你的问题核心是原代码的XML节点/属性读取逻辑和实际XML结构完全不匹配,导致无法获取有效数据,自然无法插入数据库。以下是针对性的修复步骤和完整代码:
XML结构分析
你的XML中:
- 根节点是
<STOREITEMS>,直接子节点是多个<PRODUCT> - SKU(sku-xx)是
<PRODUCT>的ITEM属性,产品名称是NAME属性 - 库存状态是
<PRODUCT>下的<STOCK>子节点内容
原代码问题
原代码中$row->product和$row->stock是尝试读取子节点,但你的结构里根本没有这些节点,所以获取到的是空值,插入语句无效。
修复后的完整代码
<?php // 数据库连接(注意:请根据实际密码修改,原代码的"empty"可能不符合你的配置) $conn = mysqli_connect("localhost", "root", "", "xmldata"); if (!$conn) { die("数据库连接失败: " . mysqli_connect_error()); } $affectedRow = 0; $error_message = ""; // 加载XML文件 $xml = simplexml_load_file("xmltest.xml") or die("Error: 无法加载XML文件"); // 遍历所有PRODUCT节点 foreach ($xml->PRODUCT as $product) { // 获取属性值,转成字符串避免SimpleXML对象问题 $sku = (string)$product['ITEM']; $productName = (string)$product['NAME']; // 获取库存值,trim去掉XML中的换行和多余空格 $stock = trim((string)$product->STOCK); // 使用预处理语句防止SQL注入,替代原代码的字符串拼接(安全隐患) $sql = "INSERT INTO xtrader(SKU, product_name, stock) VALUES (?, ?, ?)"; $stmt = mysqli_prepare($conn, $sql); mysqli_stmt_bind_param($stmt, "sss", $sku, $productName, $stock); if (mysqli_stmt_execute($stmt)) { $affectedRow++; } else { $error_message .= "插入失败: " . mysqli_stmt_error($stmt) . "\n"; } mysqli_stmt_close($stmt); } mysqli_close($conn); ?> <center><h2>XML数据导入结果</h2></center> <center><h1>XML Data Storing in Database</h1></center> <?php $message = $affectedRow > 0 ? $affectedRow . " 条记录插入成功" : "没有记录被插入"; ?> <style> body { max-width:550px; font-family: Arial; } .affected-row { background: #cae4ca; padding: 10px; margin-bottom: 20px; border: #bdd6bd 1px solid; border-radius: 2px; color: #6e716e; } .error-message { background: #eac0c0; padding: 10px; margin-bottom: 20px; border: #dab2b2 1px solid; border-radius: 2px; color: #5d5b5b; } </style> <div class="affected-row"> <?php echo $message; ?> </div> <?php if (!empty($error_message)) { ?> <div class="error-message"> <?php echo nl2br($error_message); ?> </div> <?php } ?>
关键修改点说明
- 节点遍历逻辑:直接遍历
$xml->PRODUCT,因为<PRODUCT>是根节点的直接子节点 - 属性读取:用
$product['ITEM']获取<PRODUCT>的属性值,必须转成字符串((string))才能正常使用 - 库存值处理:用
trim()清理XML中<STOCK>节点里的换行和空格,避免插入无效空白内容 - SQL安全优化:替换原代码的字符串拼接为预处理语句,彻底避免SQL注入风险
- 错误处理增强:增加了数据库连接失败的判断,以及每条插入语句的错误捕获
额外注意事项
- 确保
xtrader表包含SKU、product_name(若需存储产品名称)、stock字段,字段类型要匹配(比如SKU用VARCHAR,stock用VARCHAR或TEXT) - 确认
xmltest.xml文件路径正确且有读取权限 - 数据库连接密码请根据实际MySQL配置修改(原代码的"empty"为示例值,实际为空可直接写"")
内容的提问来源于stack exchange,提问作者Argie
相关产品推荐
相关产品推荐

