Я новичок в 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. У кого-нибудь есть идеи как это сделать?
Спасибо за ваше время
Скорее использовать 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
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, как подсказывает Мичи здесь более элегантно