2015-01-15 2 views
0

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

+1

Это работает отлично. Может быть, у вас есть другой код, чем в вопросе? http://sandbox.onlinephpfunctions.com/code/d928e46b2dbb29eef9f53f6e40447ba4440c40e5 – Justinas

ответ

2

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 
+0

Итак, о чем вы говорите? Как решить проблему? –

+0

Почему вы «отменили» переменную? Не отключайте, сохраняйте значение VALUE перед снятием, ... – ThW

+1

Покажите мне, как !!! –