php循环删除xml文件中的节点,一次删除不干净?请大神教我?

云天河V 2016-09-19 05:49:55
<?xml version="1.0" encoding="UTF-8"?>
<urlset>
<url>
<loc>http://www.test.com/</loc>
</url>
<url>
<loc>http://www.test.com/Activity/enterpriseWelcome</loc>
</url>
<url>
<loc>http://www.test.com/Posts/8996532.html</loc>
</url>
<url>
<loc>http://www.test.com/Posts/8996457.html</loc>
</url>
<url>
<loc>http://www.test.com/Post/index/ci/3</loc>
</url>
<url>
<loc>http://www.test.com/Posts/8996564.html</loc>
</url>
<url>
<loc>http://www.test.com/Enterprise/lists/p/6.html</loc>
</url>
</urlset>


php 代码




public function index(){
$sitemap_path = ROOT_PATH."/test.xml";
$doc = new \DOMDocument();
$doc->load($sitemap_path);
$urlset = $doc->getElementsByTagName('urlset');
$urlset = $urlset->item(0);
$urls = $urlset->getElementsByTagName('url');
//遍历所有 url 节点
foreach ($urls as $rootdata) {
//遍历每一个 url 节点所有属性
$post_ent_id= $rootdata->getElementsByTagName('loc')->item(0)->nodeValue;
$path = pathinfo($post_ent_id);
$filename = $path['filename'];
$dirname = $path['dirname'];
$pt = strpos($dirname,'/Posts');
if($pt!==false){
$a_id = magicIdUrl($filename,'post',true);
$bool = M('account')->where(array('pkid'=>$a_id,'status'=>1,'is_delete'=>2))->getField('pkid');
if(empty($bool)){
$rootdata->parentNode->removeChild($rootdata);
}
}
}

}
...全文
220 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2016-09-20
  • 打赏
  • 举报
回复
撇开其他逻辑,只看删除这一块
echo $urls->length; //7
foreach ($urls as $k=>$rootdata) {   
  $rootdata->parentNode->removeChild($rootdata); 
}
echo $urls->length; //3
可以看到,尽管你去删除每一记录,但实际上只能删掉 4 条 因为 removeChild($rootdata) 影响了 $urls 总数 而这样
echo $urls->length; //7
$i=0; //计数器
while($i < $urls->length) {
  $rootdata = $urls->item($i);                        
  $rootdata->parentNode->removeChild($rootdata); 
}
echo $urls->length; //0
可以看到,作为计数器的 $i 的值并没有变,7 条记录却都已经被删去了 由此可知,如果是删除,记录指针是不能变的。因为删去当前,后面的就补上来了
云天河V 2016-09-20
  • 打赏
  • 举报
回复
引用 5 楼 xuzuning 的回复:
不是说了吗?
$i=0; //计数器
while($i < $urls->length) {
  $rootdata = $urls->item($i); 
  //相关操作
  if(要删除吗) {
    $rootdata->parentNode->removeChild($rootdata); 
  }else $i++;
}
删除就不移动指针
好的,谢谢版主
xuzuning 2016-09-20
  • 打赏
  • 举报
回复
不是说了吗?
$i=0; //计数器
while($i < $urls->length) {
  $rootdata = $urls->item($i); 
  //相关操作
  if(要删除吗) {
    $rootdata->parentNode->removeChild($rootdata); 
  }else $i++;
}
删除就不移动指针
云天河V 2016-09-20
  • 打赏
  • 举报
回复
引用 3 楼 xuzuning 的回复:
撇开其他逻辑,只看删除这一块
echo $urls->length; //7
foreach ($urls as $k=>$rootdata) {   
  $rootdata->parentNode->removeChild($rootdata); 
}
echo $urls->length; //3
可以看到,尽管你去删除每一记录,但实际上只能删掉 4 条 因为 removeChild($rootdata) 影响了 $urls 总数 而这样
echo $urls->length; //7
$i=0; //计数器
while($i < $urls->length) {
  $rootdata = $urls->item($i);                        
  $rootdata->parentNode->removeChild($rootdata); 
}
echo $urls->length; //0
可以看到,作为计数器的 $i 的值并没有变,7 条记录却都已经被删去了 由此可知,如果是删除,记录指针是不能变的。因为删去当前,后面的就补上来了
那怎么删除呢?
xuzuning 2016-09-19
  • 打赏
  • 举报
回复
$urls 是对象,而对象是引用传递的 所以在 foreach ($urls as $rootdata) 循环中删去某个 $rootdata 立即就会影响到 $urls,从而导致错位
傲雪星枫 2016-09-19
  • 打赏
  • 举报
回复
可以检查这部分

$bool = M('account')->where(array('pkid'=>$a_id,'status'=>1,'is_delete'=>2))->getField('pkid');                
                if(empty($bool)){     
                    $rootdata->parentNode->removeChild($rootdata);                        
                }
看看删除不成功的 $bool是什么。

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧