Php setAttribute未保存回XML页

Php setAttribute未保存回XML页,php,xml,dom,domdocument,Php,Xml,Dom,Domdocument,我正在从XML页面中提取数据,并尝试使用一些PHP代码将其写回。我通过使用项(0)和getAttributeNode拉取单个节点,然后将其保存回nodeValue,而不是使用setAttribute,成功地完成了此操作。然而,我的目标是使代码与foreach语句一起工作,这样,如果添加和删除了跟踪,我就不必返回并编辑它 如果我尝试使用setAttribute对其进行更改,则在这两种情况下都不起作用(单独拉动它们或使用foreach语句),并且我不知道如何使getAttributeNode和nod

我正在从XML页面中提取数据,并尝试使用一些PHP代码将其写回。我通过使用项(0)和
getAttributeNode
拉取单个节点,然后将其保存回
nodeValue
,而不是使用
setAttribute
,成功地完成了此操作。然而,我的目标是使代码与
foreach
语句一起工作,这样,如果添加和删除了跟踪,我就不必返回并编辑它

如果我尝试使用
setAttribute
对其进行更改,则在这两种情况下都不起作用(单独拉动它们或使用
foreach
语句),并且我不知道如何使
getAttributeNode
nodeValue
foreach
语句一起工作。我想我可能需要一个数组,但到目前为止,我所尝试的都没有效果。我可以在没有错误的情况下加载页面,但是当我单击submit按钮时什么也没有发生



你说你想“用foreach语句”编辑这个属性,但是你的
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>

地位

如果这仍然是一个问题,您能提供一个
元素的示例吗?
嘿,Miken-是的,您是正确的,顺序没有改变。我使用了唯一标识符,但是我的想法是,如果我使用foreach,我就不必为项目单独创建相同的选项/select/etc。谢谢你的回复,你已经教会了我一些东西。我将尝试一下,看看它是如何运行的。我所说的唯一ID的意思是,如果XML看起来像
,那么您可以在
foreach
循环中使用2342来100%准确地识别该元素。这在循环中是如何工作的?我可以在中添加一个ID-它们是增量值吗?它们可以是任何你想要的。然后将表单元素命名为
asstatusform[]
,而不仅仅是
asstatusform[]
。当您在
$\u POST[“asstatusform”]
中循环时,
$k
将是ID,您可以使用它更精确地匹配要更新的XML元素。当您将
[]
放在表单输入名称的末尾时,您告诉PHP构建一个数组,但它只是根据从浏览器获取输入的顺序进行排序。如果像
[value]
那样在数组中放入一个值,那么数组将被这些值索引。