2010-10-14 7 views
0

J'ai un fichier xmlSuppression d'un nœud à partir du fichier xml

<?xml version="1.0"?> 
<category> 
    <name>SWEATERS</name> 
    <name>WATCHES</name> 
    <name>PANTS</name> 
    <name>test</name> 
    <name>1</name> 
</category> 

Comment puis-je supprimer le nœud <name>test</name> en utilisant XPath, XQuery et php. J'ai utilisé ce code

$name='test; 
    $xmlfile="config/shop_categories.xml"; 
    $xml = simplexml_load_file($xmlfile); 
    $target = $xml->xpath('/category[name="'.trim($name).'"]'); 
    print_r($target[0]); 
    if($target == false) 
    return; 
    $domRef = dom_import_simplexml($target[0]); //Select position 0 in XPath array 
    $domRef->parentNode->removeChild($domRef); 
    $dom = new DOMDocument('1.0'); 
    $dom->preserveWhiteSpace = false; 
    $dom->formatOutput = true; 
    $dom->loadXML($xml->asXML()); 
    $dom->save($xmlfile); 

Mais cela ne fonctionne pas.

+1

Le principal problème est que votre requête XPath retourne le nœud 'category', plutôt que' name' comme vous le souhaitez. La réponse de Gordon ne mentionne pas cela (au moment de la rédaction) mais corrige le problème. – salathe

+0

@salathe droite, en fait je n'ai pas fait attention à ce détail parce que simplexml à dom mishmash n'avait aucun sens pour moi de toute façon. – Gordon

+1

@Gordon, pas de soucis. Maintenant, le PO a une réponse * et * une solution. :) – salathe

Répondre

1

Bien sûr que c'est un doublon, mais je suis trop paresseux pour le trouver. Ici, vous allez:

$xml = <<< XML 
<?xml version="1.0"?> 
<category> 
    <name>SWEATERS</name> 
    <name>WATCHES</name> 
    <name>PANTS</name> 
    <name>test</name> 
    <name>1</name> 
</category> 
XML; 

$dom = new DOMDocument; 
$dom->loadXML($xml); 
$xPath = new DOMXPath($dom); 
foreach($xPath->query('//name[text() = "test"]') as $node) { 
    $node->parentNode->removeChild($node); 
} 
echo $dom->saveXML(); 

Sortie:

<?xml version="1.0"?> 
<category> 
    <name>SWEATERS</name> 
    <name>WATCHES</name> 
    <name>PANTS</name> 

    <name>1</name> 
</category> 
Questions connexes