PHP XML: rimozione dell'elemento e tutti i bambini in base al valore del nodo?
-
12-12-2019 - |
Domanda
Ciao!
Ho un problema, sto cercando di rimuovere l'elemento (con Childs) secondo un valore figlio: Ecco il campione XML:
<?xml version="1.0" encoding="UTF-8"?>
<Businesses>
<Business NAME="busin1">
<CHILD ID="30"><title>child Title</title>
<description>Child Description</description>
<urlToSite>http://www.MySite.co.il</urlToSite>
<endtime>20120720103000</endtime>
<starttime>20120710191500</starttime>
</CHILD>
<CHILD>...</CHILD>
<CHILD>...</CHILD>
</Business>
</Businesses>
.
Ora ho bisogno di rimuovere tutto lo specifico elemento "Child" (incluso i bambini) che il suo valore "endtime" è più vecchio allora ora (o semplicemente "endtime" è uguale a valore specifico)
"Endtime" è una data con il formato: yyyymmddhhmms
Ecco il mio primo tentativo (senza successo):
$doc = new DOMDocument;
$doc->load('MyXML.xml'); //The XML Above
$thedocument = $doc->documentElement;
//this gives you a list of the childs
$list = $thedocument->getElementsByTagName('CHILD');
//figure out which ones you want -- assign it to a variable (ie: $nodeToRemove )
$nodeToRemove = null;
$time=date("YmdHis",time ());
foreach ($list as $domElement){
$attrValue = $domElement->childNodes->item('endtime')->nodeValue; //not Sure about this!!
if ($attrValue > $time) {
$nodeToRemove = $domElement;
}
}
//Now remove it.
if ($nodeToRemove != null)
$thedocument->removeChild($nodeToRemove);
echo $doc->saveXML();
.
Grazie mille!
Soluzione 2
Ciao di nuovo!
Dopo una giornata intera di ricerca .. Finalmente ho trovato il problema ..
PRIMO GRAZIE MICHAEL PER IL TUO AIUTO.
Ecco il codice finale e di lavoro:
<?php
$doc = new DOMDocument;
$doc->load('MyXML.xml');
$maxTime = date("YmdHis", time());
$xpath = new DOMXPath($doc);
$q = "/Businesses/Bisiness/CHILD/endtime[. < {$maxTime}]";
foreach ($xpath->query($q) as $node) {
$businessNode = $node->parentNode;
$businessesNode = $businessNode->parentNode;
$businessesNode->removeChild($businessNode);
}
// inserting to variable ONLY
$last = $doc->saveXml();
// IMPORTANT!! - we have to rewrite to XML the Results back!!
file_put_contents('MyXML.xml', $last)
?>
.
Non l'ho trovato da nessuna parte, quindi spero che questo ti aiuterà .. :)
Altri suggerimenti
Utilizzare XPath per query per i nodi di documenti.Prova questo:
$maxTime = date("YmdHis", time());
$doc = new DOMDocument();
$doc->load("MyXML.xml");
$xpath = new DOMXPath($doc);
$q = "/Businesses/Bisiness/CHILD/endtime[. > {$maxTime}]";
foreach ($xpath->query($q) as $node) {
$businessNode = $node->parentNode;
$businessesNode = $businessNode->parentNode;
$businessesNode->removeChild($businessNode);
}
.
Ecco Una bella pagina con esempi XPath.