You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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 );
        }
    }
}

关键修改点说明

  1. 获取当前分组的已有字符串:通过XPath查询当前HighwayRoutingData节点下的所有destinationSymbols/string,把它们的文本值存入$existingCodes数组。
  2. 正确的重复检测:用!in_array(urldecode($code), $existingCodes)判断提交的字符串是否已经在当前分组存在(因为之前用了FILTER_SANITIZE_ENCODED,所以要解码后再比较)。
  3. 变量名修正:把原来的$symbol变量名改成$newSymbol,避免和循环的$symbol数组重名,造成变量覆盖问题。

额外小修复

你HTML表单里的隐藏域fileName变量名有个小问题:<?=$filename;?>应该改成<?=$file;?>,因为你上面定义的是$file='RouteSymbol.xml';,不然会出现未定义变量的警告。

效果验证

比如你的XML里@I80分组已经有HER,当用户再次提交HER到@I80时,代码会检测到重复,不会追加;但如果提交HER到@SR24分组,因为该分组没有这个值,就会正常添加。

内容的提问来源于stack exchange,提问作者David

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 06:53:01