Utilisation DOM et XPath pour supprimer un nœud d'un fichier sitemap
Je suis en train de développer une fonction qui supprime certaines URL nœuds à partir de mon fichier sitemap. Voici ce que j'ai jusqu'à présent.
$xpath = new DOMXpath($DOMfile);
$elements = $xpath->query("/urlset/url/loc[contains(.,'$pageUrl')]");
echo count($elements);
foreach($elements as $element){
//this is where I want to delete the URL
echo $element;
echo "here".$element->nodeValue;
}
Les sorties qui "111111". Je ne sais pas pourquoi je ne peux pas l'écho d'une chaîne dans une boucle foreach, si l' $éléments de comptage est "1".
Jusqu'à maintenant, j'ai fait
$urls = $dom->getElementsByTagName( "url" );
foreach( $urls as $url ){
$locs = $url->getElementsByTagName( "loc" );
$loc = $locs->item(0)->nodeValue;
echo $loc;
if($loc == $fullPageUrl){
$removeUrl = $dom->removeChild($url);
}
}
Qui marcherait bien si mon sitemap n'était pas si grand. Il temps maintenant, donc je suis en espérant l'aide de requêtes xpath sera plus rapide.
Après Gordon commentaire, j'ai essayé:
$xpath = new DOMXpath($DOMfile);
$query = sprintf('/urlset/url[./loc = "%d"]', $pageUrl);
foreach($xpath->query($query) as $element) {
//this is where I want to delete the URL
echo $element;
echo "here".$element->nodeValue;
}
Et ce n'est pas de retourner quoi que ce soit.
J'ai essayé d'aller un peu plus loin et utilisé codepad, à l'aide de ce qui a été utilisé dans l'autre post mentionné, et cela a fait:
<?php error_reporting(-1);
$xml = <<< XML <?xml version="1.0"
encoding="UTF-8" ?> <url>
<loc>professional_services</loc>
<loc>5professional_services</loc>
<loc>6professional_services</loc>
</url> XML;
$id = '5professional_services';
$dom = new DOMDocument; $dom->loadXML($xml);
$xpath = new DOMXPath($dom); $query = sprintf('/url/[loc = $id]');
foreach($xpath->query($query) as $record) {
$record->parentNode->removeChild($record);
}
echo $dom->saveXml();
et que je suis un "Avertissement: DOMXPath::query(): Invalid expression" à la boucle foreach ligne. Merci pour le commentaire sur les urlset, je vais vous assurer d'inclure le double slash dans mon code, essayé et ça n'a rien retourné.
- double possible de supprimer le nœud enfant dans le fichier xml avec php
$url
est unDOMNodelist
pas unDOMElement
? Et la liste ne peut pas être supprimé, peut-être vous avez besoin d'itérer sur la liste et supprimer chaque élément?- Je ne comprends pas jakenoble. Pensez-vous que le code que j'avais avant, qui a couru à travers le XML et contre tous loc nœuds de la variable php est la bonne façon de faire? J'ai peut-être défectueux code dans la façon dont il est maintenant?
- la raison que je vous ai cité que l'autre question, c'est parce qu'il montre comment, en fait, retirer le nœud. Cette partie est absent de votre exemple. Elle n'était pas destinée à suggérer de changer votre XPath. Nous ne pouvons pas vous dire si votre XPath est correct sans voir votre XML.
- regarder mon nouveau édité réponse.
- Je suis d'accord. Conceptuellement, c'est un double disriggarding l'espace de noms problème.
Vous devez vous connecter pour publier un commentaire.
XML à partir d'un plan de site doit être :
Depuis, c'est devenu un espace de noms, la requête est un peu plus compliqué que ma réponse précédente :
je suis en train d'écrire de mémoire juste avant d'aller au lit. Si cela ne fonctionne pas je vais aller faire le test demain matin. (Et oui, je suis consciente qu'il pouvait apporter certains downvotes)Si vous ne disposez pas d'un espace de noms (vous devriez, mais ce n'est pas une obligation soupir)
Vous avez un exemple concret qu'il travaille ici : http://codepad.org/vuGl1MAc