setAttribute 不保存回 XML 页面

setAttribute not saving back to XML page

我正在从 XML 页面提取数据并尝试用一些 PHP 代码写回它。我通过使用 item(0) 和 getAttributeNode 拉取单个节点,然后保存回 nodeValue 而不是 setAttribute 来成功完成此操作。但是,我的目标是使代码与 foreach 语句一起使用,这样我就不必在添加和删除路径时返回并对其进行编辑。

如果我尝试用 setAttribute 更改它,它在任何一种情况下都不起作用(单独拉动它们或使用 foreach 语句),而且我不知道如何制作getAttributeNodenodeValue 使用 foreach 语句。我想我可能需要一个数组,但到目前为止我没有尝试过。我可以无错误地加载页面,但是当我单击提交按钮时没有任何反应。

<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<?php
$xml = new DOMDocument('1.0', 'utf-8');
$xml->formatOutput = true; 
$xml->preserveWhiteSpace = false;
$xml->load('example.xml');

$xpath = new DOMXpath($xml);

$childForm = '';
foreach ( $xpath->query("//trails/trail") as $trail )   {
  $childForm .= "<form action=''>
  <span class=\"title\">".$trail->getAttribute("name")."</span> <span class=\"title\">Status</span>
  <select name=\"asstatusform\" >
  <option selected value=".$trail->getAttribute("status").">".$trail->getAttribute("status")."</option>
  <option value=\"OPEN\">OPEN</option>
  <option value=\"CLOSED\">CLOSED</option>
  <option value=\"RACING CLOSURE\">RACING CLOSURE</option>
  </select></span>
  <br>
  </form>";
}

?>

<form action="" method="POST">
    <?php echo $childForm; ?>
    <input name="submit" type="submit" value="Save" />
</form>

<?php
if (isset($_POST['submit']))
{
  $trail->setAttribute('status', $_POST['asstatusform']);
  htmlentities($xml->save('example.xml'));
}

?>

你说你想编辑这个属性 "with a foreach statement" 但你的 setAttribute 调用在循环之外,所以你只更改了最后一项。您还在彼此嵌套表单,这是行不通的。

如果我的理解正确,您希望根据表单提交单独更新每条路径的状态。为此,您需要将一个数组提交回表单,然后遍历它。可能比较棘手的部分是将数组与 XML 的内容进行匹配。理想情况下,您有某种唯一标识符,但在这段代码中,我只是假设 XML 元素的顺序不会在显示和处理之间改变。所以第一个 POST 条目是第一个 XML 元素,等等

<?php
$xml    = new DOMDocument;
$xml    ->load('example.xml');
$xpath  = new DOMXpath($xml);
$trails = $xpath->query("//trails/trail");

if (isset($_POST["submit"])) {
    foreach ($_POST["asstatusform"] as $k=>$state) {
        $trails->item($k)->setAttribute("status", $state);
    }
    $xml->save('example.xml');
}
?>

<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<form action="" method="POST">
<?php foreach ($trails as $trail): ?>
    <span class="title"><?= htmlspecialchars($trail->getAttribute("name")) ?></span>
    <span class="title">Status</span>
        <select name="asstatusform[]">
            <option selected value="<?= htmlspecialchars($trail->getAttribute("status")) ?>">
                <?= htmlspecialchars($trail->getAttribute("status")) ?>
            </option>
            <option value="OPEN">OPEN</option>
            <option value="CLOSED">CLOSED</option>
            <option value="RACING CLOSURE">RACING CLOSURE</option>
        </select>
    </span>
    <br/>
<?php endforeach; ?>
    <input name="submit" type="submit" value="Save" />
</form>

你的内联 HTML 让我很头疼,我可以想象你把它打出来也有同样的感觉。只需突破 PHP 以获得 HTML 的长块。我使用 alternative syntax for the foreach loop, and short echo tags for output. Don't forget to always use htmlspecialchars() 将输出转义到 HTML 页。