如何使用simpleXML更新ID为“X”的子项

时间:2014-12-18 22:32:54

标签: 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>
  <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 '$' 

任何人都知道我在这里做错了什么?

我遇到的第二个问题是更新孩子(posXposYtitle),如果id存在(仅限于使用此ID分组的孩子)。代码的那部分需要是测试回声现在的位置。我无法在此网站上找到有效的解决方案,也无法使用simplexml找到谷歌。有没有人知道如何做到这一点?

感谢您的时间

2 个答案:

答案 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在这里更优雅。