这是我的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>
现在我想将<erledigt>
标签内的值更改为'Ja'。
我用以下代码尝试了这个:
<?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');
?>
请帮助我,我在网上搜索了大约5个小时,找不到解决问题的方法。
答案 0 :(得分:3)
$todo->erledigt
在DOMDocument中不起作用,只有SimpleXML才能这样做。您需要再次使用getElementsByTagName
。
您还需要使用nodeValue
来获取/设置元素的值。
if ($paramTitel == $actualTitel && $paramTimestamp == $actualTimestamp) {
$todo->getElementsByTagName('erledigt')->item(0)->nodeValue = 'Ja';
}
答案 1 :(得分:3)
您需要使用DOM方法和属性来编辑<erledigt>
元素以进行访问。看起来你把它与SimpleXML混淆了。
$todo->getElementsByTagName('erledigt')->item(0)->nodeValue = 'Ja';
如果你想看一下使用SimpleXML,那么整个代码看起来就像是。
<?php
$paramTitel = $_GET["titel"];
$paramTimestamp = $_GET["timestamp"];
$todos = simplexml_load_file('xml/todos.xml');
foreach ($todos->todo as $todo) {
if ($paramTitel == (string) $todo->titel
&& $paramTimestamp == (string) $todo->erstellt
) {
$todo->erledigt = 'Ja';
}
}
$todos->asXML($filename); // Where does $filename come from?
header('Location: todo.php');
?>
读:
答案 2 :(得分:3)
当您在文档中查找特定元素时,我建议您使用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';
}
这导致以下(示例性)xpath表达式:
//todo[titel = "sasd" and erstellt = "2012-04-30 17:19:21"]/erledigt
将选择属于erledigt
节点的所有todo
个节点,这些节点具有指定的titel
和erstellt
节点值。
然后您可以轻松更改它。此外,您正在寻找尚未“错误”的erledigt
个节点,但当前的变体已经没有受到伤害。
<?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();