Разбор xml

 
0
 
PHP
ava
MrDmitry | 19.03.2013, 03:13
Есть xml файл следуещего вида



<?xml version="1.0" encoding="UTF-8"?>
<books>
 <book>
  <character> 
    <object id="1">
     </object>
  </charackter>
 </book>
</books>


Нужно в родителя <book> добовлять новый  <object > при этом увеличивая id

Попытался сделать так



    $pars = simplexml_load_file('books.xml');
     foreach ($pars->character as $objects)
      $objects_id++;                 
       $new_objects= $pars->book->character->addChild('objects');
       $new_objects->addAttribute('id', $objects_id.'1'); 
       $pars->asXML('books.xml'); 



Но у меня возникло несколько сложностей.

Во первых. Новый элемент добовляется в одну строчку. Во вторых не закрытым. Тоесть получается xml


<?xml version="1.0" encoding="UTF-8"?>
<books>
 <book>
  <character> 
    <objects id="1">
     </objects>
   <objects id="1"/><objects id="1"/><objects id="1"/><objects id="1"/>
  </charackter>
 </book>
</books>


А во вторых счетчик $objects_id не увеличывается. Что я делаю не так? (


Comments (7)
ava
Sanchezzz | 19.03.2013, 06:06 #
<objects id="1"/> А разве "/>" Это не означает что тег закрыт.
Попробуйте указать  2 параметр у addChild


$new_objects = $pars->book->character->addChild('objects',' ');
 
ava
krypt3r | 19.03.2013, 06:50 #
Что-то типа такого кода.

<?php
$xml = <<< XML
<books>
    <book>
        <character>
            <object id="1"></object>
            <object id="4"></object>
            <object id="2"></object>
            <object id="3"></object>
        </character>
    </book>
</books>
XML;
$sim = simplexml_load_string ($xml);
//print_r ($sim);
$chars = $sim->book->character;
foreach ($chars as $ch)
{
    // определение максимального object[@id]
    $ids = array ();
    $objs = $ch->object;
    foreach ($objs as $ob)
        $ids[] = (int) $ob->attributes()->id;
    sort ($ids);
    $object_id = max ($ids) + 1;
    
    // кол-во вставляемых элементов
    $count = 3;
    for ($i = 0; $i < $count; $i++)
    {
        $new_obj = $ch->addChild ('object');
        $new_obj->addAttribute ('id', $object_id++);
    }
}
echo $sim->asXML ();
?>

Цитата
Во первых. Новый элемент добовляется в одну строчку. Во вторых не закрытым.

XML вы неважно знаете. Он может быть вообще в одну строку, главное - чтобы был валидным. А якобы незакрытый тэг

<object id="1"/>

это более краткая запись пустого тэга

<object id="1"></object>

ava
MrDmitry | 20.03.2013, 12:56 #
Ок. Спасибо. Вы правы xml я знаю не достаточно хорошо.
ava
MrDmitry | 13.10.2013, 05:04 #
Извиняюсь что поднимаю старую тему но появился вопрос.

А как посчитать id если не ограничено кол-во вложенных элементов?



<?xml version="1.0" encoding="UTF-8"?>
<books>
 <book>
  <character> 
    <objects id="1">
     </objects>
   <objects id="1"/>
   <objects id="2"><objects id="3"></objects><objects id="4"></objects><objects id="5"><objects id="6">
 <objects id="7"></objects></objects></objects></objects>
  <objects id="8"><objects id="9"></objects></objects>
<objects id="10"/>
  </charackter>
 </book>
</books>
ava
Sanchezzz | 13.10.2013, 17:18 #
Рекурсией от родителя.
ava
MrDmitry | 13.10.2013, 23:38 #
Облазил google не нашел стоящей темы как сделать рекурсия xml на php (
Можно код или хорошую ссылку на эту тему?
ava
Sanchezzz | 14.10.2013, 20:58 #
Рекурсия это метод, который вызывает сам себя пока не упрется в препятствие...



function recursion_simple_xml($xml){    
    foreach($xml as $item){
    
        // delaem s elementom chto nado
    
        if(isset($item->objects)){
            // zapusk rekirsii
            recursion_simple_xml($item->objects);
        }
    }
}




$xml_string = '<?xml version="1.0" encoding="UTF-8"?>
<books>
 <book>
  <character> 
    <objects id="1"/>
   
  <objects id="2"><objects id="3"></objects></objects>
 <objects id="4"><objects id="5"><objects id="6"><objects id="7"></objects></objects></objects></objects>
  <objects id="8"><objects id="9"></objects></objects>
<objects id="10"/>
  </character>
 </book>
</books>';

$xml = simplexml_load_string ($xml_string);
$xml = $xml->book->character;

recursion_simple_xml($xml);

Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
Similar
advanced
Submit