无法使用PHP更改xml值

时间:2012-04-30 18:27:43

标签: php xml dom

这是我的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个小时,找不到解决问题的方法。

3 个答案:

答案 0 :(得分:3)

$todo->erledigt在DOMDocument中不起作用,只有SimpleXML才能这样做。您需要再次使用getElementsByTagName

您还需要使用nodeValue来获取/设置元素的值。

if ($paramTitel == $actualTitel && $paramTimestamp == $actualTimestamp) {
    $todo->getElementsByTagName('erledigt')->item(0)->nodeValue = 'Ja';
}

DEMO:http://codepad.org/xJbQmO2u

答案 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个节点,这些节点具有指定的titelerstellt节点值。

然后您可以轻松更改它。此外,您正在寻找尚未“错误”的erledigt个节点,但当前的变体已经没有受到伤害。

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();