XML PHP删除特定的Child if?

时间:2012-09-17 10:05:50

标签: php xml

我有一个xml文档,如下所示:

<?xml version="1.0" encoding="ISO-8859-1"?>
<library>
  <invites>
    <invite>
      <username>0</username>
      <userid>0</userid>
    </invite>
    <invite>
      <username>Danielle</username>
      <gameid>87808</gameid>
    </invite>
    <invite>
      <username>Petra</username>
      <userid>978</userid>
    </invite>
  </invites>
</library>

现在,我想删除与Danielle的<invite>,但我不确定如何?我现在正在使用此功能,但这只会删除第一条记录吗?

$file = 'my.xml';
$fp = fopen($file, "rb") or die("cannot open file");
$str = fread($fp, filesize($file));

$xml = new DOMDocument("1.0", "ISO-8859-1");
$xml->formatOutput = true;
$xml->preserveWhiteSpace = false;
$xml->loadXML($str) or die("Error");

$root   = $xml->documentElement;
$fnode  = $root->firstChild;

$ori    = $fnode->childNodes->item(0);

$fnode->removeChild($ori);

$xml->save($file);

我希望能够根据gameid或userid删除。我该怎么做?

提前致谢: - )

2 个答案:

答案 0 :(得分:1)

您可以使用XPath选择具有特定用户ID或gameid的所有节点:http://www.w3schools.com/xpath/default.asp

答案 1 :(得分:1)

试试这个:

使用DOM&amp; DOMXPath。

<?php
$dom = new DOMDocument( '1.0' );
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;

// load the xml file
$dom->loadXML( '<?xml version="1.0" encoding="ISO-8859-1"?>
<library>
  <invites>
    <invite>
      <username>0</username>
      <userid>0</userid>
    </invite>
    <invite>
      <username>Danielle</username>
      <gameid>87808</gameid>
    </invite>
    <invite>
      <username>Petra</username>
      <userid>978</userid>
    </invite>
  </invites>
</library>', LIBXML_NOBLANKS );
$xpath = new DOMXPath($dom);

//find all 'invite' nodes with username=Danielle and delete'em.
$node = $xpath->query("//invite[username='Danielle']");

// if found, append the new "value" node
if( $node->length ) {
    foreach ($node as $n) {
        $n->parentNode->removeChild( $n );
    }
}

header('content-type: text/xml');
echo $dom->saveXML();
?>

希望这有帮助。