我是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>
我有一个包含工作代码的php文件,可以添加更多用户:
$xml = simplexml_load_file("js/data.xml");
$user = $xml->addChild('user');
$user->addChild('id',2022);
$user->addChild('posX',34);
$user->addChild('posY',67);
$user->addChild('title','Test33 text');
// Store new XML code in data.xml
$xml->asXML("js/data.xml");
echo $xml->asXML();
这会将新用户添加到文件中。到目前为止这么好,这里没问题。
如果您仔细查看代码,您会看到我要添加的这个新用户与xml文件中的用户具有相同的ID(2022)。这是同一个人,所以在这种情况下我不想加他,但更新他。这就是问题的出发点。
要更新他,我首先需要检查ID是否存在。我做了一些google-ing并搜索了这个网站并找到了一个解决方案:php SimpleXML check if a child exists问题是,我无法让它工作。
这是我的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
某事,否则添加该人。不幸的是,当我运行此代码时,我收到以下错误:
Parse error: syntax error, unexpected T_LNUMBER, expecting T_STRING or T_VARIABLE or '{' or '$'
任何人都知道我在这里做错了什么?
我遇到的第二个问题是更新孩子(posX
,posY
和title
),如果id
存在(仅限于使用此ID分组的孩子)。代码的那部分需要是测试回声现在的位置。我无法在此网站上找到有效的解决方案,也无法使用simplexml找到谷歌。有没有人知道如何做到这一点?
感谢您的时间
答案 0 :(得分:1)
而是使用xpath()
按<user>
选择<id>
:
$xml = simplexml_load_string($x); // assume XML in $x
$id = "2022";
list($user) = $xml->xpath("/users/user[id = '$id']") + [NULL];
现在检查$user
。如果您的XML具有上述ID,则$user
将包含SimpleXML
元素
如果没有,$user
将为NULL
。
if (!$user) {
// create new user
} else {
$user->title = "updated!";
}
请注意,第3行末尾的[NULL]
需要PHP&gt; = 5.4,如果您没有,请使用:
list($user) = $xml->xpath("/users/user[id = '$id']") + array(NULL);
看到它有效:https://eval.in/236618
答案 1 :(得分:1)
Parse error: syntax error, unexpected T_LNUMBER, expecting T_STRING or T_VARIABLE or '{' or '$'
任何人都知道我在这里做错了什么?
回答非常简单,错误消息的主要部分是“语法错误,意外的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那样使用不同范围的字母。
您最有可能从existing answer over there快速复制代码,因为您想要同时执行两项操作:
$idExists = isset($xml->user->id);
$idIs2022 = $idExists && trim($xml->user->id) == 2022;
第一行代码存储了在 SimpleXMLElement $xml
中解析的XML是否具有包含子元素的第一个 user 元素的结果命名为 id 。如果根本没有 user 元素,它仍然会失败。
第二行将该元素的修剪文本值与数字整数值2022进行比较。
由于这仍然容易出错并且有点乏味,using XPath as michi suggests在这里更优雅。