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>どうすればよいですか? 現在これを使用していますが、これは最初のレコードのみを削除しますか?

$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のどちらかで削除できるようにしたいです。どうすればいいですか?

前もって感謝します :-)

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 に答える