php 版本 php-5.2.6
Apache 版本 Apache2
XML文件:books.xml
  <?xml version="1.0" ?> 
- <store>
- <books>
- <book id="1">
  <author>Jack Herrington</author> 
  <title>PHP Hacks</title> 
  <publisher>O'Reilly</publisher> 
  </book>
- <book id="2">
  <author>Jack Herrington</author> 
  <title>Podcasting Hacks</title> 
  <publisher>O'Reilly</publisher> 
  </book>
  </books>
  </store>php文件:rm.php
<?php
$doc = new DOMDocument;
$doc->load('books.xml');
$book = $doc->documentElement;
$chapters = $book->getElementsByTagName('book');
foreach($chapters as $ch)
{
echo $ch->getAttribute('id').'<br>';if($ch->getAttribute('id')=="1")
{$book->removeChild($ch);$doc->save("books3.xml");}
}
?> 调试过程:
在apache2 中运行rm.php,报错如下:Fatal error: Uncaught exception 'DOMException' with message 'Not Found Error' in F:\ampwww\rm.php:14 Stack trace: #0 F:\ampwww\rm.php(14): DOMNode->removeChild(Object(DOMElement)) #1 {main} thrown in F:\ampwww\rm.php on line 14
调整XML文件格式如下:
<?xml version="1.0" ?> 
- <books>
- <book id="1">
  <author>Jack Herrington</author> 
  <title>PHP Hacks</title> 
  <publisher>O'Reilly</publisher> 
  </book>
- <book id="2">
  <author>Jack Herrington</author> 
  <title>Podcasting Hacks</title> 
  <publisher>O'Reilly</publisher> 
  </book>
  </books>则执行rm.php,删除节点成功。请教:这种有XML文件如何删除其一个节点?初涉PHP,先谢了。

解决方案 »

  1.   

    $book->removeChild($ch->item(0)); 
      

  2.   

    Fatal error: Call to undefined method DOMElement::item() in /usr/local/apache2/htdocs/nagios/rm2.php on line 14不行。
      

  3.   

    http://phpbuilder.com/manual/en/domnode.removechild.php
    看看手册吧.
    另外一楼和你遇到的问题差不多,可以查看一下他解决的办法.
      

  4.   

    $chapters ->removeChild($ch);
    改成这样看看。
      

  5.   

    XML文件:books.xml 
      <?xml version="1.0" ?> 
    - <store> 
    - <books> 
    - <book id="1"> 
      <author>Jack Herrington </author> 
      <title>PHP Hacks </title> 
      <publisher>O'Reilly </publisher> 
      </book> 
    - <book id="2"> 
      <author>Jack Herrington </author> 
      <title>Podcasting Hacks </title> 
      <publisher>O'Reilly </publisher> 
      </book> 
      </books> 
      </store> 
    books.xml文件修改成
      <?xml version="1.0" ?> 
    - <books> 
    - <book id="1"> 
      <author>Jack Herrington </author> 
      <title>PHP Hacks </title> 
      <publisher>O'Reilly </publisher> 
      </book> 
    - <book id="2"> 
      <author>Jack Herrington </author> 
      <title>Podcasting Hacks </title> 
      <publisher>O'Reilly </publisher> 
      </book> 
      </books> 
    我原来的php可以正常删除一个节点。
    但是,在加了一层嵌套后就不能执行了。
    没接触XML和PHP过,多谢各位指点。
      

  6.   

    我用的方法和网上查到都一样的。<?php$doc = new DOMDocument;
    $doc->load('book.xml');$book = $doc->documentElement;// we retrieve the chapter and remove it from the book
    $chapter = $book->getElementsByTagName('chapter')->item(0);
    $oldchapter = $book->removeChild($chapter);echo $doc->saveXML();
    ?>The above example will output:<?xml version="1.0" encoding="iso-8859-1"?>
    <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" 
              "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd">
    <book id="listing">
     <title>My lists</title>
     
    </book>这个在增加一层嵌套后不知道能不能执行?
      

  7.   


    <?php 
    $doc = new DOMDocument; 
    $doc->load('book.xml'); 
    $book = $doc->documentElement; 
    $obook = $book->getElementsByTagName('books')->item(0); 
    $chapters = $book->getElementsByTagName('book');foreach($chapters as $ch) 

    echo $ch->getAttribute('id');
    if($ch->getAttribute('id')=="1") 

    $obook->removeChild($ch); 
    $doc->save("books1.xml"); 


    ?>
      

  8.   


    <?php 
    $doc = new DOMDocument; 
    $doc->load('book.xml'); 
    $chapters = $doc->documentElement->getElementsByTagName('book');foreach($chapters as $ch) 

    if($ch->getAttribute('id')=="1") 

    $ch->parentNode->removeChild($ch);
    $doc->save("books1.xml"); 


    ?>简化版.通过获取父节点来删除自己
      

  9.   

    jakey9826 ,谢谢你。
    问题搞定!
      

  10.   

    $node = $dom->documentElement->getElementsByTagName("book")->item(0);
    $node->parentNode->removeChild($node);
    这样写也可以,少一个判断