setAttribute 不保存回 XML 页面
setAttribute not saving back to XML page
我正在从 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'));
}
?>
你说你想编辑这个属性 "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 页。
我正在从 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'));
}
?>
你说你想编辑这个属性 "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 页。