Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何更新以id“分组的子项?”;“X”;,使用simpleXML_Php_Xml_Simplexml_Updatexml - Fatal编程技术网

Php 如何更新以id“分组的子项?”;“X”;,使用simpleXML

Php 如何更新以id“分组的子项?”;“X”;,使用simpleXML,php,xml,simplexml,updatexml,Php,Xml,Simplexml,Updatexml,我是新来的simplexml所以如果我混淆了一些术语,请原谅:) 我将以下xml文件存储在:js/data.xml: <users> <user> <id>2011</id> <posX>12</posX> <posY>29</posY> <title>Senior Developer</title> </user> &l

我是新来的
simplexml
所以如果我混淆了一些术语,请原谅:)

我将以下xml文件存储在:
js/data.xml

<users>
  <user>
    <id>2011</id>
    <posX>12</posX>
    <posY>29</posY>
    <title>Senior Developer</title>
  </user>
  <user>
    <id>2022</id>
    <posX>45</posX>
    <posY>87</posY>
    <title>Test22 text</title>
  </user>
</users>
这将向文件中添加新用户。到目前为止还不错,这里没有问题

如果仔细查看代码,您将看到我要添加的新用户与xml文件中的用户具有相同的id(2022)。这是同一个人,所以在本例中,我不想添加他,而是更新他。问题就从这里开始

要更新他,我首先需要检查ID是否存在。我在谷歌上搜索了一下这个网站,找到了一个解决方案:问题是,我无法让它工作

这是我的php文件的修改代码:

$xml = simplexml_load_file("js/data.xml");

//from: https://stackoverflow.com/questions/1560827/php-simplexml-check-if-a-child-exist
if (isset($xml->user->id->2022)) { // c exists
   echo "test";
} else { //else add it
   $user = $xml->addChild('user');
   $user->addChild('id',2022);
   $user->addChild('posX',45);
   $user->addChild('posY',87);
   $user->addChild('title','Test33 text');
}
// Store new XML code in data.xml
$xml->asXML("js/data.xml");
echo $xml->asXML();
因此,这里我尝试检查id是否存在。如果是:
echo
something,否则添加此人。不幸的是,当我运行此代码时,出现以下错误:

Parse error: syntax error, unexpected T_LNUMBER, expecting T_STRING or T_VARIABLE or '{' or '$' 
有人知道我做错了什么吗

我遇到的第二个问题是,如果
id
存在,则更新子项(
posX
posY
title
)(当然,只有使用此id分组的子项)。代码的这一部分需要放在测试回音现在所在的位置。我在这个网站或谷歌上找不到使用simplexml的有效解决方案。有人知道怎么做吗

感谢您抽出时间

而是使用
xpath()
通过
选择一个

现在检查
$user
。如果XML具有上述ID,
$user
将包含
SimpleXML
元素。
否则,
$user
将为
NULL

if (!$user) {
    // create new user
} else  {
    $user->title = "updated!";
}
请注意,第3行末尾的
[NULL]
要求PHP>=5.4,如果没有,请使用:

list($user) = $xml->xpath("/users/user[id = '$id']") + array(NULL);
看到它工作了吗

有人知道我做错了什么吗

这很容易回答,错误消息的主要部分是“语法错误,意外的T_LNUMBER”

解析错误意味着PHP无法理解您编写的代码。这通常是印刷错误的标志(计算机的语法错误)。PHP然后告诉您它有什么错误:意外的T_LNUMBER,其中
T_LNUMBER
是长数字的标记名,与整数一样长,而不是特别长

// from: https://stackoverflow.com/questions/1560827/php-simplexml-check-if-a-child-exist
if (isset($xml->user->id->2022)) 
                          ^^^^
那就是这个号码。在PHP中,要访问字段,需要在该位置以a-Z或a-Z范围内的字母开头,而不是以0-9等不同范围的字母开头

您从最可能的位置复制代码太快,可能是因为您希望同时执行两件事:

$idExists = isset($xml->user->id);
$idIs2022 = $idExists && trim($xml->user->id) == 2022;
第一行代码存储在SimpleXMLElement
$XML
中解析的XML是否具有包含名为id的子元素的第一个用户元素的结果。如果根本没有用户元素,它仍将失败

第二行将该元素的修剪文本值与数值整数值2022进行比较


由于这仍然容易出错,而且有点繁琐,因此这里的说明更为优雅。

感谢您的解释这非常有效,感谢您的解释和示例。这些对理解这一切有很大帮助
Parse error: syntax error, unexpected T_LNUMBER, expecting T_STRING or T_VARIABLE or '{' or '$' 
// from: https://stackoverflow.com/questions/1560827/php-simplexml-check-if-a-child-exist
if (isset($xml->user->id->2022)) 
                          ^^^^
$idExists = isset($xml->user->id);
$idIs2022 = $idExists && trim($xml->user->id) == 2022;