domdocument はどこにも (SO を含めて) 十分に文書化されていないため、ここで質問すると思いました。私は PHP/XML ブログを持っており、ブロガーが一度に複数のブログ投稿を削除できるようにしたいと考えています。次のコードは、2 つの投稿 ID が順不同であるか、互いに一致していない場合に機能します。
例 - 投稿 ID 1 と投稿 ID 4 が選択されると、両方が削除されます。ただし、投稿 1 と投稿 2 を選択すると、2 のみが削除されます。動作は毎回一貫しています。誰かがこれに遭遇したことがありますか、または私のコードでこれを引き起こす何かを見ましたか?
疑似 XML:
<root>
<blog id=1><copy>Some copy</copy></blog>
<blog id=2><copy>Another block of copy</copy></blog>
<blog id=3><copy>Last chance copy</copy></blog>
</root>
ブログ投稿を削除する PHP コード (より大きなクラスのフラグメント):
/**
* method usage: $objVar->deletePost($param)
* delete client selected xml[blog] entries
* @param array, $params : assign $_POST array as argument
* @return string, XML
*/
public function deletePost($params) {
foreach ($params as $value){ // assign $param['delete[n]'] to array
$pid=$value; // array[n][id]
}
$xml = new DOMDocument(); // instance of current xml
$xml->load($this->fp); // path to file
$xml->preserveWhiteSpace = false;
//define xpath object, called with query() line 273
$xpath = new DOMXpath($xml);
//create temporary DOM xml
$tempxml = $xml->documentElement;
$pnode = $xml->getElementsByTagName('blog');
foreach($pnode as $key){ //outter loop thru parent nodes
foreach($pid as $v){ //inner loop thru pid array
if ($key->getAttribute('id')==$v){ //if pid matches blog[id=n]
$path = "//root/blog[@id=".$v."]";
$nodelist = $xpath->query($path);
$removenode = $nodelist->item(0);
//remove the parent/children for matching ids
$oldxml = $tempxml->removeChild($removenode);
}
}
}
echo $xml->saveXML();
}
いつものように、事前に感謝します