php - setAttribute 不保存回 XML 页面
问题描述
我正在从 XML 页面中提取数据,并尝试使用一些 PHP 代码将其写回。我已经通过使用 item(0) 和 拉动单个节点成功地做到了这一点getAttributeNode
,然后保存回nodeValue
而不是使用setAttribute
。但是,我的目标是使代码与foreach
语句一起工作,这样如果添加和删除了路径,我就不必返回并编辑它。
如果我尝试用setAttribute
它来改变它在任何一种情况下都不起作用(单独或使用foreach
语句拉动它们),我无法弄清楚如何制作getAttributeNode
和nodeValue
使用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'));
}
?>
解决方案
您说您想“使用 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 块。我为循环使用了替代语法,并为输出使用了短回显标签。不要忘记始终使用将输出转义到 HTML 页面。foreach
htmlspecialchars()
推荐阅读
- typescript - 使用打字稿检查 GraphQLObjectType 中的字段
- graphql - 使用 ariadne 服务器时如何合并多个 graphql 模式文件?
- python - 复制文件。缺少 1 个必需的位置参数
- python - 向所有类实例添加常量变量
- go - Golang 类型嵌入工具
- spi - Zephyr RTOS问题中的QSPI片选管脚控制与配置
- python - Django forms.DateTimeField 更改输入类型
- django - 如何使用ajax提交带有输入文件的表单
- c# - C# - 如何将 GetFromJsonAsync 的结果分配给变量,并在不重复调用 GET 请求的情况下使用它?
- django - 具有多个模型的外键?