Поэтому я сбрасываю каждый элемент из строки XML
$xml = <<< XML
<?xml version="1.0" encoding="UTF-8"?>
<xml>
<cars>
<car_id>26395593</car_id>
<standart>0</standart>
<model>2</model>
</cars>
</xml>
XML;
// Загрузить XML в переменную;
$concerts = simplexml_load_string($xml);
foreach ($concerts->xpath('/*/cars/*') as $child) {
$chil = $child;
echo "Before= " .$chil ."\n";
unset( $child[0] );
echo "After= " .$chil ."\n";
}
Теперь результат таков
Before= 26395593
After=
Before= 0
After=
Before= 2
After=
Зачем $chil
переменная тоже не сбрасывается? Как сохранить $child
значение переменной?
SimpleXML — это абстракция для DOM. $ child и $ child [0] являются отдельными объектами SimpleXMLElement, но имеют доступ к одному и тому же узлу DOM. Функция unset () не только удаляет объект SimpleXMLElement, но и удаляет узел из DOM.
Поэтому после этого второй объект SimpleXMLElement ссылается на удаленный узел DOM.
С небольшими изменениями в вашем примере вы можете получить предупреждение за него:
$concerts = simplexml_load_string($xml);
foreach ($concerts->xpath('/*/cars/*') as $child) {
echo "Before= " .$child->asXml() ."\n";
unset( $child[0] );
echo "After= " .$child->asXml() ."\n";
}
Выход:
Before= <car_id>26395593</car_id>
Warning: SimpleXMLElement::asXML(): Node no longer exists in /tmp/e... on line 19
After=
Before= <standart>0</standart>
Warning: SimpleXMLElement::asXML(): Node no longer exists in /tmp/e... on line 19
After=
Before= <model>2</model>
Warning: SimpleXMLElement::asXML(): Node no longer exists in /tmp/e... on line 19
After=
Вы должны избегать сброса объектов SimpleXMLElement. Сохраните исходный документ таким же, считайте значения из него и создайте новый XML-документ, если вам нужно сохранить данные в другом формате.
Чтобы «отключить» значение от узла XML, приведите объект SimpleXMLElement в скаляр:
$concerts = simplexml_load_string($xml);
foreach ($concerts->xpath('/*/cars/*') as $child) {
$value = (string)$child;
echo "Before= " .$value."\n";
unset( $child[0] );
echo "After= " .$value ."\n";
}
Выход:
Before= 26395593
After= 26395593
Before= 0
After= 0
Before= 2
After= 2
Других решений пока нет …