我的程序如下:<?php header('Content-Type: text/xml');
  $url="http://open.client.lashou.com/list/api/";
  $xml_str=file_get_contents($url);
  $doc = new DOMDocument();
  $doc->loadXML($xml_str);
  
  $urllist = $doc->documentElement->getElementsByTagName( 'url');
  $listcity=$doc->documentElement->getElementsByTagName("city");
  $length=$urllist->length;
  for($i=0;$i< $length; $i++)   
  { 
    $tmpcity=$listcity->item($i)->nodeValue;
    if($tmpcity != "全国" && $tmpcity != "西安")
    {
       $urllist->item($i)->parentNode->removeChild($urllist->item($i));
    }
  }
  echo $str=$doc->saveXML();
  $f=fopen("f.xml","w");
  fwrite($f,$str);
  fclose($f);
?>程序的目的是要删除city不为全国和西安的节点所在的url节点,现在运行会提示“XML 文档只能有一个顶层元素”之类的错误。为了测试,我将xml保存在本地,删掉其中绝大部分,只剩下三个url节点。这时测试结果是:三个url节点中,如果只有一个的city为全国和西安以外的,运行可以顺利成功,但只要需要删除的url节点多于一个,就会出现错误,提示“XML 文档只能有一个顶层元素”。
请问下这是什么原因导致的,谢谢了

解决方案 »

  1.   

    你只需注释掉 header('Content-Type: text/xml');
    就会有
    Fatal error: Call to a member function removeChild() on a non-object 
    这就是原因
      

  2.   

    注释掉header('Content-Type: text/xml');出错肯定没问题啊,问题只是程序的问题,跟人家的XML应该没有什么关系
      

  3.   

    $urllist->item($i)->parentNode->removeChild($urllist->item($i));这个有效果么?remove似乎就是节点本身?
      

  4.   

    本帖最后由 xuzuning 于 2011-05-09 12:40:37 编辑
      

  5.   

    echo $str=$doc->saveXML();能正常输出吗?
      

  6.   

    输出结果是这样吗?  <?xml version="1.0" encoding="UTF-8" ?> 
      <urlset /> 
      

  7.   

    他那个xml是utf-8编码的
    你在gbk编码的环境下当然就不对了
    要这样改
    $tmpcity = $listcity->item($i)->nodeValue;
    改为
    $tmpcity = iconv('utf-8', 'gbk', $listcity->item($i)->nodeValue);
      

  8.   

    改成gbk后会报多个顶层元素的错误!
    将head()这一行删除后能显示很多条,但是都是乱码!
      

  9.   

    你在开玩笑吧?
    原程序中有
        $tmpcity = $listcity->item($i)->nodeValue;
        if($tmpcity != "全国" && $tmpcity != "西安")
    如果程序文件是utf-8编码的就不会有问题
    如果程序文件是gbk编码的就得
        $tmpcity = iconv('utf-8', 'gbk', $listcity->item($i)->nodeValue);
        if($tmpcity != "全国" && $tmpcity != "西安")
    否则下面的条件总是成立,也就将全部节点都删除了
      

  10.   

    您好,你是和我说的吗?我觉得这段程序的问题是出在每次删除后,xml字符串会发生变化,所以在下一次操作时就发生了错误,这就是为啥只能删除一个的情况
    还没有验证