Guten Tag,
ich schreibe Ihr zum ersten Mal, daher erst mal Hallo an Alle! Hoffe das meine Frage hier im richtigen Thread steht, sonst bitte verschieben. Ich stehe vor einem Problem und benötige dringend Ihre Hilfe, um in einem DOMDocument (PHP5) einem mittels XPath definiertem Ausdruck und (mit/über) zwei foreach Schleifen INDIREKT ermittelt werden soll.
Indirekt deshalb, da ich erst den Richtigen Elternknoten ermitteln muss, (mit der If-Bedingung) um die Änderung auch Tatsächlich im richtigen Kindknoten vorzunehmen!
Die XML Datei (log.xml):
Mein Vorgehen:
Ich zeige eben mein PHP5 Code, Kommentiert!
Das Problem:
Wie schon im Kommentar beschrieben wird leider nur das Kindelement "username" ersetzt, das ist eben absolut FALSCH es muss das Geschwister ELEMENT "PROFILE" ersetzt werden.
Meine Frage:
Wie kann ich "$cnode->parentNode->replaceChild($newtag, $cnode);" ändern, dass ich nun das GESCHWISTER ELEMENT => "PROFILE" ändere und NICHT das direkte KINDELEMENT vom parentNode?
Ich bin um jede Hilfe dankbar und hoffe mich einigermaßen ausgedrückt zu haben! Beste Grüße
ich schreibe Ihr zum ersten Mal, daher erst mal Hallo an Alle! Hoffe das meine Frage hier im richtigen Thread steht, sonst bitte verschieben. Ich stehe vor einem Problem und benötige dringend Ihre Hilfe, um in einem DOMDocument (PHP5) einem mittels XPath definiertem Ausdruck und (mit/über) zwei foreach Schleifen INDIREKT ermittelt werden soll.
Indirekt deshalb, da ich erst den Richtigen Elternknoten ermitteln muss, (mit der If-Bedingung) um die Änderung auch Tatsächlich im richtigen Kindknoten vorzunehmen!
Die XML Datei (log.xml):
Code:
<?xml version="1.0" encoding="ISO-8859-1"?> <users> <user id="23"> <username>mustermann</username> <profile>0</profile> <userlocked>0</userlocked> <active>1</active> </user> <user id="24"> <username>musterfrau</username> <profile>0</profile> <userlocked>0</userlocked> <active>1</active> </user> <user id="25"> <username>mustermensch</username> <profile>0</profile> <userlocked>0</userlocked> <active>1</active> </user> </users>
Mein Vorgehen:
Ich zeige eben mein PHP5 Code, Kommentiert!
PHP-Code:
$edit = 'profile'; //zu ändernder Kindknoten
$edit_content = '1'; //zu ändernder WERT
$username = 'mustermann'; //Benutzer ermitteln
$doc = new DOMDocument('1.0', 'iso-8859-1'); //Neues DOMDocument erstellen
$doc = DOMDocument::load("log.xml"); //XML Datei laden
$doc->preserveWhiteSpace = false;
$doc->formatOutput = true; //richtig ausgeben
//Anfang neuer Knoten
$newtag = $doc->createElement($edit); //neuen Knoten erstllen
$newtag_content = $doc->createTextNode($edit_content); //Textknoten anhängen
$newtag->appendChild($newtag_content); //Textknoten zuweisen
//ENDE neuer Knoten
$xp = new domxpath($doc); //XPath definieren
$titles = $xp->query('//user'); //Xpath Ausdruck beschreiben
foreach ($titles as $node)
{
foreach($node->childNodes as $cnode) //Kindknoten ermitteln
{
if($cnode->nodeName == 'username' && $cnode->nodeValue == $username) //wenn Username mit dem hinterlegten übereinstimmt
{
$cnode->parentNode->replaceChild($newtag, $cnode); //HIER LIEGT DAS Problem, denn es wird nur das Kindelement Username ersetzt, das ist leider absolut FALSCH es muss das Geschwister ELEMENT "PROFILE" ersetzt werden
echo 'ja der username stimmt überein und Ihr User Profil wurde aktiviert'; //echo wird ausgegeben, doch eben leider falscher Kindknoten ersetzt
}
}
}
echo $doc->save("log.xml"); //geänderte XML File abspeichern
Das Problem:
Wie schon im Kommentar beschrieben wird leider nur das Kindelement "username" ersetzt, das ist eben absolut FALSCH es muss das Geschwister ELEMENT "PROFILE" ersetzt werden.
Meine Frage:
Wie kann ich "$cnode->parentNode->replaceChild($newtag, $cnode);" ändern, dass ich nun das GESCHWISTER ELEMENT => "PROFILE" ändere und NICHT das direkte KINDELEMENT vom parentNode?
Ich bin um jede Hilfe dankbar und hoffe mich einigermaßen ausgedrückt zu haben! Beste Grüße
Kommentar