0

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 '$' 

有人知道我在这里做错了什么吗?

我遇到的第二个问题是如果存在则更新孩子(posXposYtitleid当然只有与此 ID 分组的孩子)。这部分代码需要位于测试回显的位置。我在此站点或使用 simplexml 的 google 上找不到有效的解决方案。有谁知道如何做到这一点?

感谢您的时间

4

2 回答 2

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!";
}

请注意,第[NULL]3 行末尾的 需要 PHP >= 5.4,如果没有,请使用:

list($user) = $xml->xpath("/users/user[id = '$id']") + array(NULL);

看到它工作:https ://eval.in/236618

于 2014-12-18T23:49:55.947 回答
1
Parse error: syntax error, unexpected T_LNUMBER, expecting T_STRING or T_VARIABLE or '{' or '$' 

有人知道我在这里做错了什么吗?

这很容易回答,错误消息的主要部分是"syntax error, unexpected T_LNUMBER"

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

// from: https://stackoverflow.com/questions/1560827/php-simplexml-check-if-a-child-exist
if (isset($xml->user->id->2022)) 
                          ^^^^

那就是那里的这个数字。在 PHP 中,要访问一个字段,它需要以该位置的 AZ 或 az 范围内的字母开头,而不是像您那里那样以 0-9 等不同范围内的字母开头。

您从那里的现有答案中复制代码太快了,很可能是因为您想一次做两件事:

$idExists = isset($xml->user->id);
$idIs2022 = $idExists && trim($xml->user->id) == 2022;

第一行代码存储在SimpleXMLElement中解析的 XML 是否具有包含名为 id的子元素$xml的第一个用户元素的结果。如果根本没有用户元素,它仍然会失败。

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

由于这仍然容易出错且有点乏味,因此使用 michi 建议的 XPath在这里更加优雅。

于 2014-12-19T15:24:22.923 回答