setAttribute不保存回到XML页面

时间:2019-06-21 16:54:38

标签: php xml dom domdocument

我正在从XML页面提取数据,并尝试使用一些PHP代码写回数据。通过使用item(0)和getAttributeNode拉各个节点,然后保存回nodeValue而不是使用setAttribute,我已经成功地做到了。但是,我的目标是使代码与foreach语句一起使用,这样,即使添加和删除了路径,我也不必回头对其进行编辑。

如果我尝试使用setAttribute进行更改,则在两种情况下均不起作用(单独或使用foreach语句将其拉出),而且我不知道如何制作{ {1}}和getAttributeNode使用nodeValue语句。我想我可能需要一个数组,但是到目前为止我没有尝试过。我可以加载页面而不会出现错误,但是当我单击“提交”按钮时没有任何反应。

foreach

1 个答案:

答案 0 :(得分:1)

您说要“使用foreach语句”编辑此属性,但是您在循环之外进行了uploadFile = (file, metadata) => { const pathToUpload = this.state.channel.id; const ref = this.props.messagesRef; const filePath = `chat/public/${uuidv4}.jpg`; this.setState( { uploadState: "uploading", }, () => { let uploadTask = this.state.storageRef.child(filePath).put(file, metadata); uploadTask.on( "state_changed", snap => { const percentUploaded = Math.round( (snap.bytesTransferred / snap.totalBytes) * 100 ); this.setState({ percentUploaded }); }, err => { console.error(err); this.setState({ errors: [...errors, err], uploadState: "error", }); }, () => { console.log(uploadTask); uploadTask.snapshot.ref .getDownloadURL() .then(downloadUrl => { this.sendFileMessage(downloadUrl, ref, pathToUpload); }) .catch(err => { console.error(err); this.setState({ errors: [...this.state.errors, err], uploadState: "error", }); }); } ); } ); }; 调用,因此您仅更改最后一项。您还将表单相互嵌套,这是行不通的。

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

setAttribute

您的内联HTML令我头疼,我可以想像您在键入内容时也有同样的感觉。只需打破PHP即可获得一长段HTML。我已将alternative syntax用于<?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> 循环,并将short echo tags用于输出。不要忘记总是使用htmlspecialchars()来将输出转义为HTML页面。