setAttribute 不保存回 XML 页面
Posted
技术标签:
【中文标题】setAttribute 不保存回 XML 页面【英文标题】:setAttribute not saving back to XML page 【发布时间】:2019-11-04 13:14:30 【问题描述】:我正在从 XML 页面中提取数据,并尝试使用一些 php 代码将其写回。我通过使用 item(0) 和 getAttributeNode
拉动单个节点,然后保存回 nodeValue
而不是使用 setAttribute
成功地做到了这一点。然而,我的目标是让代码与 foreach
语句一起工作,这样在添加和删除路径时我不必返回并编辑它。
如果我尝试使用 setAttribute
更改它,它在任何一种情况下都不起作用(单独拉动它们或使用 foreach
语句),我不知道如何制作 getAttributeNode
和 @ 987654328@ 使用 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'));
?>
【问题讨论】:
如果这仍然是个问题,您能否提供一个<trail>
元素的样例?
<trail name="Trail1" status="CLOSED" difficulty="novice"/>
【参考方案1】:
您说您想“使用 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>
你的内联 HTML 让我头疼,我可以想象你在输入它时也有同样的感觉。只需跳出 PHP 来获取长的 HTML 块。我将alternative syntax 用于foreach
循环,将short echo tags 用于输出。不要忘记始终使用htmlspecialchars()
将输出转义到 HTML 页面。
【讨论】:
嘿,Miken - 是的,你是对的,因为顺序没有改变。我使用唯一标识符进行此操作,但我的想法是,如果我使用 foreach 执行此操作,则不必为项目单独创建相同的选项/选择/等。感谢您的回复-您已经在这里教了我几件事。我会尝试一下,看看效果如何。 我所说的唯一 ID 的意思是,如果您的 XML 看起来像<trail id="2342" name="Trail1" status="CLOSED" difficulty="novice"/>
,那么您可以在您的 foreach
循环中使用 2342 来以 100% 的准确率识别该元素。
如何在循环中工作?我可以在其中添加一个 ID - 它们是增量值吗?
它们可以是你想要的任何东西。然后将表单元素命名为 asstatusform[<?=$trail->getAttribute("id")?>]
而不仅仅是 asstatusform[]
。当您循环访问$_POST["asstatusform"]
时,$k
将成为 ID,您可以使用它来更准确地匹配要更新的 XML 元素。
当您将[]
放在表单输入名称的末尾时,您是在告诉 PHP 构建一个数组,但它只是基于从浏览器获取输入的顺序。如果您在其中输入一个值,例如[value]
,那么数组将由这些值索引。以上是关于setAttribute 不保存回 XML 页面的主要内容,如果未能解决你的问题,请参考以下文章
在网页上编辑 XML 文件并使用 PHP 保存回 XML 文件
从 xml 加载对象,在动态 UI 中编辑值并保存回 xml
request.getSession().setAttribute("user", userName);啥意思???