За последние 24 часа нас посетили 68246 программистов и 1644 робота. Сейчас ищут 996 программистов ...

xml simpleXML

Тема в разделе "PHP для новичков", создана пользователем PetrOFF, 29 июл 2009.

  1. PetrOFF

    PetrOFF Активный пользователь

    С нами с:
    13 май 2009
    Сообщения:
    102
    Симпатии:
    0
    Код (Text):
    1. $str=<<<XML
    2. <?xml version='1.0' standalone='yes'?>
    3. <root>
    4.      <module_file>
    5.         <folder name="template"><file>news.tpl</file></folder>
    6.  
    7.  
    8.         <file>news.class.php</file>
    9.  
    10.     </module_file>
    11.  
    12.     </root>
    13. XML;
    14.  
    15. function parser($xml){
    16.     foreach( $xml->module_file as $m_f){
    17.         if ($m_f->type=="folder") {
    18.             echo $m_f->folder;
    19.             parser($m_f);
    20.          }else{
    21.           echo $m_f->file;
    22.             };
    23.     }
    24.  
    25. $xml = new SimpleXMLElement($str);
    26.  
    27.  parser($xml);
    Что-то я запутался, каким образом пройтись по вложеным папкам? Я так понимаю рекурсией?
     
  2. neverlose

    neverlose Активный пользователь

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    Это самый верный способ.
     
  3. alexeurodnepr

    alexeurodnepr Активный пользователь

    С нами с:
    18 июл 2008
    Сообщения:
    244
    Симпатии:
    0
    PetrOFF

    юзай xpath - круче, понятней, удобней, имхо

    для твоего задания рекурсия не нужна

    пример:

    PHP:
    1.  
    2. <?php
    3. $str=<<<XML
    4. <?xml version='1.0' standalone='yes'?>
    5. <root>
    6.      <module_file>
    7.        <folder name="template"><file>news1.tpl</file></folder>
    8.        <folder name="template"><file>news2.tpl</file></folder>
    9.        <folder name="template"><file>news3.tpl</file></folder>
    10.        <folder name="template"><file>news4.tpl</file></folder>
    11.        
    12.  
    13.        <file>news.class.php</file>
    14.        
    15.  
    16.    </module_file>
    17.  
    18.    </root>
    19. XML;
    20.  
    21. $xml = simplexml_load_string($str);
    22. $result = $xml->xpath('//folder');
    23.  
    24. var_dump($result);
     
  4. PetrOFF

    PetrOFF Активный пользователь

    С нами с:
    13 май 2009
    Сообщения:
    102
    Симпатии:
    0
    Код (Text):
    1. $xml = simplexml_load_string($str);
    2.   $result = $xml->xpath('//module_file');
    3.   foreach($xml->xpath('//module_file') as $d_f){
    4.    echo $d_f->file;
    5.    echo $d_f->folder['name'];
    6.  
    7.   }
    Однако выводит только тэги первого уровня.... Каким способом пробежатся по $result ??
     
  5. alexeurodnepr

    alexeurodnepr Активный пользователь

    С нами с:
    18 июл 2008
    Сообщения:
    244
    Симпатии:
    0
    так, у меня такое подозрение, что это ...
    Код (Text):
    1.  
    2. $str=<<<XML
    3. <?xml version='1.0' standalone='yes'?>
    4. <root>
    5.      <module_file>
    6.        <folder name="template"><file>news.tpl</file></folder>
    7.  
    8.  
    9.        <file>news.class.php</file>
    10.  
    11.    </module_file>
    12.  
    13.    </root>
    14. XML;
    ... далеко не полный пример...

    выложи на рапиаде или где те удобней полный пример xml и напиши детальней че ты хочешь с него иметь в результате

    по поводу тегов... оно будет отображать то шо первое стоит если ты хочешь пробежать по ним то тебе нужно воспользоваться функцией/методу attributes() а точнее мануалом :) ну если ты дашь full xml and ask me questions i will do it to you:)
     
  6. PetrOFF

    PetrOFF Активный пользователь

    С нами с:
    13 май 2009
    Сообщения:
    102
    Симпатии:
    0
    PHP:
    1. # <?php
    2. #  $str=<<<XML
    3. #  <?xml version='1.0' standalone='yes'?>
    4. #  <root>
    5. #      <module_file>
    6. #        <folder name="template"><file>news1.tpl</file></folder>
    7. #        <folder name="template"><file>news2.tpl</file></folder>
    8. #        <folder name="template"><file>news3.tpl</file></folder>
    9.            
    10.           //Здесь может быть любой уровень вложености
    11. #        <folder name="template"><folfer name="template1"><file>news4.tpl</file></folder></folder>
    12. #        
    13. #  
    14. #        <file>news.class.php</file>
    15. #      
    16. #  
    17. #    </module_file>
    18. #  
    19. #    </root>
    20. #  XML;
    21. #  
    22. #  $xml = simplexml_load_string($str);
    23. #  $result = $xml->xpath('//folder');
    24. #  
    25. #  var_dump($result);
    Интересует каким образом можно пройтись по всей ветки <module_file> если она может содержать любое количество вложености?
     
  7. alexeurodnepr

    alexeurodnepr Активный пользователь

    С нами с:
    18 июл 2008
    Сообщения:
    244
    Симпатии:
    0
    хм, помое-му это бредово..., скажи зачем такая задача нужна? а лучше скажи где ты такой xml взял то.... вообще-то рекурсивно такую фишку можно проделать но по-моему это не правильно так делать
    я представляю чет типа этого - вложенность...

    <folder id="1" parentid="0"><file>Родитель 1</file></folder>
    <folder id="2" parentid="1"><file>Дите 1 родителя 1</file></folder>
    <folder id="3" parentid="1"><file>Дите 2 родителя 1</file></folder>


    такое устраивает?
     
  8. PetrOFF

    PetrOFF Активный пользователь

    С нами с:
    13 май 2009
    Сообщения:
    102
    Симпатии:
    0
    В принципе я так и сделал как ты указал. Мне надо указать путь до файла и я думал что удобней было бы сделать вложением папка\папка\....\файл. Но все равно спасибо за подсказки
     
  9. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    Блин... все это здоров и весело.... но вот что делать - если XML имеет такую структуру
    HTML:
    1.  
    2. - <Владелец>
    3.   <Ид>50af76d0-82f0-11db-9c4c-505054503030</Ид>
    4.   <Наименование>ЗАО "Спецстрой-Петербург"</Наименование>
    5.   <ОфициальноеНаименование>Закрытое акционерное общество "Спецстрой-Петербург"</ОфициальноеНаименование>
    6. - <ЮридическийАдрес>
    7.   <Представление>195196, Санкт-Петербург г, Рижская ул, дом № 3, оф.206</Представление>
    8. - <АдресноеПоле>
    9.   <Тип>Почтовый индекс</Тип>
    10.   <Значение>195196</Значение>
    11.   </АдресноеПоле>
    12.  
    13.  
    то есть теги - на кирилице