如何使用PHP将XML中<Quantity>元素移动到对应<WarehouseLine>节点内
问题原因
- 原代码仅读取了第一个
<WarehouseHeader>下的第一个<Quantity>值作为全局变量,没有遍历所有<Quantity>节点 - 原代码仅对每个
<WarehouseHeader>下的第一个<WarehouseLine>添加子节点,没有处理一个Header下存在多个Line的情况 - 没有删除原有
<Quantity>节点,导致原始节点残留
解决代码
$xml = simplexml_load_string($output); // 定位所有WarehouseHeader下的Quantity节点 $quantities = $xml->xpath('//WarehouseHeader/Quantity'); foreach ($quantities as $qtyNode) { // 转为DOM节点操作,获取紧邻的下一个兄弟元素 $domQty = dom_import_simplexml($qtyNode); $nextSibling = $domQty->nextSibling; // 跳过XML默认的空白文本节点,找到目标WarehouseLine while ($nextSibling && $nextSibling->nodeType != XML_ELEMENT_NODE) { $nextSibling = $nextSibling->nextSibling; } if ($nextSibling && $nextSibling->tagName == 'WarehouseLine') { // 转回SimpleXML节点添加Quantity子节点 $lineNode = simplexml_import_dom($nextSibling); $lineNode->addChild('Quantity', (string)$qtyNode); // 删除原有Quantity节点 $domQty->parentNode->removeChild($domQty); } } echo $xml->asXML();
代码说明
- 用XPath语法
//WarehouseHeader/Quantity直接匹配所有符合要求的Quantity节点,避免嵌套遍历遗漏 - 兼容XML结构中可能存在的空白文本节点,确保准确找到Quantity后面紧邻的WarehouseLine节点
- 添加完子节点后直接删除原有Quantity节点,完全符合输出要求
内容的提问来源于stack exchange,提问作者RSp
相关产品推荐
相关产品推荐

