Как я могу обновить потомков, сгруппированных с идентификатором & quot; X & quot ;, используя simpleXML

Я новичок в 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();

Это добавит нового пользователя в файл. Пока все хорошо, здесь нет проблем.

Если вы внимательно посмотрите на код, то увидите, что этот новый пользователь, которого я хочу добавить, имеет тот же идентификатор (2022), что и пользователь в XML-файле. Это тот же человек, поэтому в этом случае я не хочу добавлять его, но обновлять его. Здесь начинаются проблемы.

Чтобы обновить его, мне сначала нужно проверить, существует ли идентификатор. Я сделал несколько поисков в Google и искал этот сайт и нашел решение, приведенное здесь: Проверка php SimpleXML, если ребенок существует Проблема в том, что я не могу заставить его работать.

Это модифицированный код моего 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();

Поэтому здесь я пытаюсь проверить, существует ли идентификатор. Если так: echo что-то еще добавить человека. К сожалению, когда я запускаю этот код, я получаю следующую ошибку:

Parse error: syntax error, unexpected T_LNUMBER, expecting T_STRING or T_VARIABLE or '{' or '$'

У кого-нибудь есть идея, что я здесь делаю неправильно?

Вторая проблема, которую я имею, обновляет детей (posX, posY а также title) если id существует (конечно, ТОЛЬКО дети, сгруппированные с этим идентификатором). Эта часть кода должна быть там, где сейчас находится тестовое эхо. Я не мог найти рабочее решение на этом сайте или в Google, используя simplexml. У кого-нибудь есть идеи как это сделать?

Спасибо за ваше время

0

Решение

Скорее использовать 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 имеет вышеуказанный идентификатор, $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

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, как у вас там есть.

Вы скопировали код слишком быстро из существующий ответ там скорее всего потому, что вы хотите сделать две вещи одновременно:

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

В первой строке кода хранится результат того, проанализирован ли XML в SimpleXMLElement $xml имеет первый пользователь элемент, содержащий дочерний элемент с именем Я бы. Все равно не получится, если нет пользователь стихия вообще.

Вторая строка сравнивает усеченное текстовое значение этого элемента с числовым целочисленным значением 2022.

Поскольку это все еще подвержено ошибкам и немного утомительно, используя XPath, как подсказывает Мичи здесь более элегантно

1

По вопросам рекламы [email protected]