4

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

4

3 回答 3

3

$todo->erledigt在 DOMDocument 中不起作用,只有 SimpleXML 可以做到。您需要getElementsByTagName再次使用。

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

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

演示:http ://codepad.org/xJbQmO2u

于 2012-04-30T18:39:36.217 回答
3

您需要<erledigt>使用 DOM 方法和属性来编辑元素以访问它。看起来您将它与 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');

?>

阅读:

于 2012-04-30T18:44:16.183 回答
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还不是“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();
于 2012-04-30T18:47:18.100 回答