如何在XML追加字符串时避免同标签分组内出现重复条目
解决XML分组内重复字符串的问题
我发现你代码里的重复检测逻辑有个关键问题:你用了!in_array($code, $symbol),但这里的$symbol是用户POST提交的新字符串数组,不是当前XML标签分组里已有的字符串集合,所以完全起不到检测当前分组重复的作用。
要实现「同一标签分组内不能重复,不同分组可以重复」的需求,我们需要先获取当前HighwayRoutingData节点下所有已存在的string文本值,再检查提交的code是否在这个集合里。
修改后的核心代码片段
把你标记的那段逻辑替换成下面的代码:
foreach( $symbol as $index => $code ){ $loc=urldecode( $location[ $index ] ); $expr=sprintf( '//HighwayRoutingData/tag[ contains( text(), "%s") ]', urldecode( $loc ) ); $col=$xp->query( $expr ); if( $col && $col->length > 0 && !empty( $code ) ){ // 获取当前HighwayRoutingData节点 $parentNode = $col->item(0)->parentNode; // 查询该节点下所有已有的string值 $existingStrings = $xp->query('destinationSymbols/string', $parentNode); $existingCodes = []; foreach($existingStrings as $strNode){ $existingCodes[] = $strNode->nodeValue; } // 检查当前提交的code是否已存在于该分组 if(!in_array(urldecode($code), $existingCodes)){ $newSymbol=$dom->createElement( 'string', urldecode($code) ); $dest=$xp->query( 'destinationSymbols', $parentNode )->item(0); $dest->appendChild( $newSymbol ); } } }
关键修改点说明
- 获取当前分组的已有字符串:通过XPath查询当前
HighwayRoutingData节点下的所有destinationSymbols/string,把它们的文本值存入$existingCodes数组。 - 正确的重复检测:用
!in_array(urldecode($code), $existingCodes)判断提交的字符串是否已经在当前分组存在(因为之前用了FILTER_SANITIZE_ENCODED,所以要解码后再比较)。 - 变量名修正:把原来的
$symbol变量名改成$newSymbol,避免和循环的$symbol数组重名,造成变量覆盖问题。
额外小修复
你HTML表单里的隐藏域fileName变量名有个小问题:<?=$filename;?>应该改成<?=$file;?>,因为你上面定义的是$file='RouteSymbol.xml';,不然会出现未定义变量的警告。
效果验证
比如你的XML里@I80分组已经有HER,当用户再次提交HER到@I80时,代码会检测到重复,不会追加;但如果提交HER到@SR24分组,因为该分组没有这个值,就会正常添加。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

