This is my XML-file:
<todos>
<todo>
<titel>sasd</titel>
<erstellt>2012-04-30 17:19:21</erstellt>
<erledigen_bis>2012-05-03</erledigen_bis>
<erledigt>Nein</erledigt>
<thingstodo>sffsdfdf</thingstodo>
</todo>
</todos>
Now I want to change the value inside of the <erledigt> tag to 'Ja'.
I tried this with the following code:
<?php
$filename = 'xml/todos.xml';
$xmlDoc = new DOMDocument();
$xmlDoc->load('xml/todos.xml');
$todos = $xmlDoc->getElementsByTagName('todo');
foreach ($todos as $todo) {
$titel = $todo->getElementsByTagName('titel');
$actualTitel = $titel->item(0)->nodeValue;
$paramTitel = $_GET["titel"];
$erstellt = $todo->getElementsByTagName('erstellt');
$actualTimestamp = $erstellt->item(0)->nodeValue;
$paramTimestamp = $_GET["timestamp"];
if ($paramTitel == $actualTitel && $paramTimestamp == $actualTimestamp) {
$todo->erledigt= 'Ja';
}
}
$xmlDoc->save($filename);
header('Location: todo.php');
?>
Please help me, I searched for about 5 hours on the web and couldn't find any solution for my problem.
$todo->erledigt doesn't work in DOMDocument, only SimpleXML can do that. You need to use getElementsByTagName again.
You also need to use nodeValue to get/set the value of the element.
if ($paramTitel == $actualTitel && $paramTimestamp == $actualTimestamp) {
$todo->getElementsByTagName('erledigt')->item(0)->nodeValue = 'Ja';
}
DEMO: http://codepad.org/xJbQmO2u
As you are looking for specific elements inside the document, I suggest highly you locate them by using xpath:
$xp = new DOMXPath($doc);
$expression = sprintf('//todo[titel = "%s" and erstellt = "%s"]/erledigt', $_GET["titel"], $_GET["timestamp"]);
$result = $xp->query($expression);
foreach ($result as $node) {
$node->nodeValue = 'Ja';
}
This results into the following (exemplary) xpath expression:
//todo[titel = "sasd" and erstellt = "2012-04-30 17:19:21"]/erledigt
Which will select all erledigt nodes that are part of a todo node that have the titel and erstellt node values as specified.
You can then easily change it. Additionally you're looking for erledigt nodes that aren't "erledigt" yet, but the current variant already doesn't hurt.
Demo/Full Code Example:
<?php
/**
* @link http://stackoverflow.com/q/10388661/367456
*/
$_GET["titel"] = 'sasd';
$_GET["timestamp"] = '2012-04-30 17:19:21';
$xml = '<todos>
<todo>
<titel>sasd</titel>
<erstellt>2012-04-30 17:19:21</erstellt>
<erledigen_bis>2012-05-03</erledigen_bis>
<erledigt>Nein</erledigt>
<thingstodo>sffsdfdf</thingstodo>
</todo>
</todos>';
$doc = new DOMDocument();
$doc->loadXML($xml);
$xp = new DOMXPath($doc);
$expression = sprintf('//todo[titel = "%s" and erstellt = "%s"]/erledigt', $_GET["titel"], $_GET["timestamp"]);
$result = $xp->query($expression);
foreach ($result as $node) {
$node->nodeValue = 'Ja';
}
echo $doc->saveXML();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With