Помогите распарсить xml

fonbaron

Велосипедист
Есть код который должен сначала забрать текст внутри тега phone и поменять названия телефонов на значение переменной
PHP:
<?php

$xml= <<<XML
<?xml version="1.0"?>
<goods>

 <phone>n-37</phone>

 <phone>i-12</phone>
 ...
</goods>
XML;

$xml=simplexml_load_string($xml);

$i=1;
$a=array();
foreach ($xml as $data) {
   $a=$data->phone;
   $data->phone=$i;
$i++;
 }
 

echo  $xml->asXML();

?>
помогите исправить код что бы получить правильный результат
 

fonbaron

Велосипедист
в результате работы скрипта получается на выходе вот такая ерунда
PHP:
<?xml version="1.0"?>
<goods>

 <phone>n-37<phone>1</phone></phone>

 <phone>i-12<phone>2</phone></phone>
 ...
</goods>
a надо
PHP:
<?xml version="1.0"?>
<goods>

 <phone>1</phone>

 <phone>2</phone>
 ...
</goods>
 

dadoc

Новичок
У вас $data уже элемент phone, попробуйте вот так:

PHP:
   $a=(string)$data;
   $data=$i;
 

Gremboloid

инженера Гр...
(от себя) Желательно четко прописывать имя дочерних элементов, потом проще разбираться
PHP:
foreach ($xml->phone as $data)
$data это итеративный объект в виде массива.
PHP:
foreach ($xml->phone as $data) {
    $a = $data;
    $data[0] = $i;
    $i++;
}
 

fonbaron

Велосипедист
(от себя) Желательно четко прописывать имя дочерних элементов, потом проще разбираться
PHP:
foreach ($xml->phone as $data)
$data это итеративный объект в виде массива.
PHP:
foreach ($xml->phone as $data) {
    $a = $data;
    $data[0] = $i;
    $i++;
}
Спасибо!
А что Вы имеете ввиду - Желательно четко прописывать имя дочерних элементов, потом проще разбираться.
Пример можно так как нужно?
И возникли еще вопросы
1. если <phone/> будет обернут тегом с производителем <Nokia/> или <Samsung/> и т.п. то этот пример уже не прокатывает! Или если обернется только первый так как у него добавился еще один параметр как сделать?
2. Если добавиться еще продукт допустим <tv/> то можно ли все в одном цыкле сделать или нужно тоже самое делать отдельно для <tv/>
 

Gremboloid

инженера Гр...
В процессе работы (в будущем) в товарах могут появиться не только телефоны ( например планшеты, смартфоны и т.д и т.п.), которые должна будут обрабатываться по другому.
PHP:
$xml= <<<XML
<?xml version="1.0"?>
<goods>
 <good>aaa</good>
 <phone>n-37</phone>
<good>bbb</good>
 <phone>i-12</phone>
 ...
</goods>
XML;
Но это ИМХО.

1. Правильно что не прокатывает, потому что в этом случае изменяется структура XML. Соответственно и его обработка. Если хотите, можете написать код обхода всего XML документа и для каждого элемента с именем phone выполнять свой код.

2. Как вам будет угодно, но не забывайте про полную форму цикла
PHP:
foreach ($xml as $name=>$data)
где $name имя элемента
 

fonbaron

Велосипедист
А подскажите тогда как в одном цыкле сделатьа то я не знаю
PHP:
<?php

$xml= <<<XML
<?xml version="1.0"?>
<goods>

 <nokia><phone>n-37</phone></nokia>

 <phone>i-12</phone>
 ...
</goods>
XML;

$xml=simplexml_load_string($xml);

$i=1;
$a=array();
$name='phone';
foreach ($xml as $name=>$data) {
    $a = $data;
    $data[0] = $i;
    $i++;
}
 

echo  $xml->asXML();

?>
Че то вот так сделал получил вот что:
PHP:
<?xml version="1.0"?>
<goods>

 <nokia>1</nokia>

 <phone>2</phone>
 ...
</goods>
 

Gremboloid

инженера Гр...
Наверное только перебором
опишу алгоритм словами, остальное сами:
1. Цикл по дочерним элементам
2. если имя элемениа phone, выполняем обработку
3. если имя НЕ phone, переходим к п.1 для текущего элемента

Но лучше так не делать. Лучше запихните производителя либо в атрибут элемента
PHP:
$xml= <<<XML
<?xml version="1.0"?>
<goods>
 <phone producer="nokia">n-37</phone>
 <phone producer="">i-12</phone>
 ...
</goods>
XML;
либо модифицируйте XML чтобы каждый товар содержал элемент "Производитель"

PHP:
$xml= <<<XML
<?xml version="1.0"?>
<goods>
 <phone>
	<producer>nokia</producer>
	<name>n-37</name>
 </phone>
 <phone>
	<producer />
	<name>i-12</name>
 </phone>
 ...
</goods>
XML;
 

fonbaron

Велосипедист
Можно я Вас еще помучаю, как сделать - Цикл по дочерним элементам.
Я знаю я тугодум
 
Сверху