【问题标题】:PHP XML saving changes to individual itemsPHP XML 保存对单个项目的更改
【发布时间】:2021-04-15 22:09:28
【问题描述】:

我正在尝试创建一个带有按钮更新的简单网页。按钮的状态会显示给用户,但我不想为这么小的东西使用数据库。我正在尝试使用 XML 解析。我非常接近做到这一点,但它似乎没有将我的更改保存到 xml 文件中。我一直在使用 var dump 并且得到了我期望的输出。我不是最好的 php,即使有朋友帮助我,我们也迷路了。

jQuery

$( ".switch" ).click(function() {
            var id =$(this).attr("id");
            if( $(this).hasClass("on")){
                    $(this).removeClass("on");
                    $(this).addClass("off");
                    $.get("API.php?"+ id + "=off");
            }else if( $(this).hasClass("off")){
                    $(this).removeClass("off");
                    $(this).addClass("on");
                    $.get("API.php?"+ id + "=on");
            }
});

XML 数据.xml

<switches>
        <switch>
                <name>Phase Two Side Door</name>
                <id>phasetwosidedoor</id>
                <state>on</state>
        </switch>
        <switch>

                <name>WIFI</name>
                <id>wifi</id>
                <state>on</state>
                <timestamp> </timestamp>
        </switch>

</switches>

PHP API.php

<?php
/*
get from jq asks for this info
finds the item and returns value
*/

$switches = simplexml_load_file('data.xml');

//var_dump($switches);
echo $switches->count();
for( $i = 0; $i < $switches->count(); $i++){

        $item = $switches->switch[$i];
        //var_dump($item->id == "wifi" && isset($_GET["wifi"]));
        //var_dump($item->id == "phasetwosidedoor" && isset($_GET["phasetwosidedoor"]));
        //var_dump( $switches->switch[$i]);
        echo $i;

        if($item->id == "wifi" && isset($_GET["wifi"])){

                $item->state = $_GET["wifi"];
                //var_dump($_GET["wifi"]);
        }
        else if($item->id == "phasetwosidedoor" && isset($_GET["phasetwosidedoor"])){
                 $item->state = $_GET["phasetwosidedoor"];

        }else{

                echo "data error :(";
        }
}
$switches->asXML("data.xml");

/*
loading xml
changing xml
saving xml
*/`enter code here`


?>

没有 500 错误,我所有的调试都是正确的。我需要用简单的 xml 保存。

【问题讨论】:

  • 更改代码以输出更改的 XML 而不是将其保存到文件似乎工作正常:3v4l.org/vPctH 可能文件的权限错误,脚本无法覆盖它?使用file_put_contents 进行测试,并尝试写入不同的文件或目录。
  • 我刚刚运行了这个准确的 PHP 代码,包括读取和写入文件,它运行良好。所以还有其他问题 - 要么是权限错误,您没有查看正确的日志文件,要么它实际上正在保存文件,但您有多个文件副本并且正在查看错误一。

标签: php jquery xml simplexml saving-data


【解决方案1】:

它可能不会让你感到惊讶。但是你不能用简单的 xml 来写文件。简单 XML 是只读 API。以下解决方案可能更有效一些,因为您不必遍历找到的元素的节点列表。

<?php
// contains the state of the switch (on/off)
$state = $_GET['state'];

// contains the id of the switch
$id = $_GET['id'];

$doc = new DOMDocument();
$doc->load('switches.xml');

$xpath = new DOMXPath($doc);
$elements = $xpath->query('switch[id/text()="' . $name . '"]/state');

if ($elements->length > 0) {
    $elements->item(0)->nodeValue = $state;
}

$string = $doc->save('switches.xml');

xml 文件使用DOMDocument 类加载。之后,我使用 DOMXpath 类通过其 id 查询请求的开关。如果在 xml 中找到开关,我们设置新状态并再次将其保存为文件。更少的代码。更有效。

如您所见,我使用了两个 GET 参数。参数id 定义了请求的开关。参数state 定义了请求开关的新状态。

【讨论】:

  • 这个答案的第二句话是完全错误的; SimpleXML 可能没有非常丰富的 功能来写入 XML,但它绝对不是只读的。事实上,问题中的代码似乎正确地使用了该功能。
  • @IMSoP 你知道出了什么问题吗?如果我保存正确,为什么我的程序不知道什么
  • 好吧@IMSoP ...启发我们。向我们展示如何使用 PHP SimpleXML API 将 XML 数据保存回文件中。
  • 当然,您可以使用asXML 方法将SimpleXMLElement 写入文件。在这一点上你是绝对正确的。但这不会解决原来的问题。无论如何,最好使用完整的 DOM 可能性。正如您在代码示例中看到的那样,对于不那么精通的程序员来说,代码示例更短,甚至更容易理解。
  • 使用 SimpleXML 保存到文件的方法是...使用问题中的确切代码。正如我在上面的评论中所说,代码工作正常,所以在其他地方存在一些问题 - 可能是写入文件的权限错误,或者对正在写入的文件感到困惑。更改代码以使用一组不同的库函数不会有任何区别。此外,您的代码更短只是因为您已将其重写为使用 XPath,但您也可以使用 SimpleXML 做到这一点,而且它会更短
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多