XML, если неустановленный узел не может получить значение переменной

Поэтому я сбрасываю каждый элемент из строки 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 значение переменной?

0

Решение

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
2

Другие решения

Других решений пока нет …

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