PHP按分类生成独立XML文件及分类数据编辑保存问题
技术解决方案
方案一:仅更新当前分类数据(保留单XML文件)
- 加载并定位目标分类
使用SimpleXMLElement读取原XML,通过$_GET['cat']精准匹配目标分类节点,避免遍历全量数据:$safeCat = preg_replace('/[^a-zA-Z0-9_-]/', '', $_GET['cat']); // 过滤非法字符 $xml = new SimpleXMLElement(file_get_contents('data.xml')); $targetCategory = $xml->xpath("//category[@id='{$safeCat}']")[0]; - 处理表单更新
只更新目标分类下的条目,不触碰其他分类数据:if ($_SERVER['REQUEST_METHOD'] === 'POST') { foreach ($_POST['items'] as $itemId => $values) { $safeItemId = preg_replace('/[^a-zA-Z0-9_-]/', '', $itemId); $targetItem = $targetCategory->xpath("./item[@id='{$safeItemId}']")[0]; if ($targetItem) { $targetItem->min = $values['min']; $targetItem->nominal = $values['nominal']; } } $xml->asXML('data.xml'); // 仅写入修改后的全XML,但仅目标分类有变化 }
方案二:按分类生成独立XML文件
- 提取目标分类生成新XML
从原XML中剥离目标分类,创建独立的XML文档结构:$safeCat = preg_replace('/[^a-zA-Z0-9_-]/', '', $_GET['cat']); $originalXml = new SimpleXMLElement(file_get_contents('data.xml')); $targetCategory = $originalXml->xpath("//category[@id='{$safeCat}']")[0]; // 初始化新XML根节点 $categoryXml = new SimpleXMLElement('<category></category>'); // 导入目标分类的所有子节点(含属性) $importedNode = $categoryXml->importNode($targetCategory, true); $categoryXml->appendChild($importedNode); - 保存独立文件
提交更新时直接覆盖对应分类的独立文件,无需操作原全量XML:if ($_SERVER['REQUEST_METHOD'] === 'POST') { foreach ($_POST['items'] as $itemId => $values) { $safeItemId = preg_replace('/[^a-zA-Z0-9_-]/', '', $itemId); $targetItem = $categoryXml->xpath("./item[@id='{$safeItemId}']")[0]; if ($targetItem) { $targetItem->min = $values['min']; $targetItem->nominal = $values['nominal']; } } $categoryXml->asXML("category_{$safeCat}.xml"); }
核心注意点
- 安全过滤:必须对
$_GET['cat']和表单提交的itemId做非法字符过滤,防止XML注入攻击,示例中用正则保留合法字符。 - DOMDocument替代方案:如果XML结构复杂,使用
DOMDocument处理节点导入、修改会更灵活,比如cloneNode方法可以更精准地复制节点。
内容的提问来源于stack exchange,提问作者ChrisYates
相关产品推荐
相关产品推荐

