0

我有一个看起来像这样的 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>

现在,我想<invite>和 Danielle 一起删除,但我不知道怎么做?我现在正在使用它,但这只会删除第一条记录?

$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);

我希望能够根据游戏 ID 或用户 ID 删除。我该怎么做?

提前致谢 :-)

4

2 回答 2

1

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

于 2012-09-17T10:10:19.380 回答
1

尝试这个:

使用 DOM 和 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();
?>

希望这可以帮助。

于 2012-09-17T11:04:11.343 回答