На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: ANDLL
  
> XML парсер
    Помогите, нужно прочитать XML файл в массив, структура такая:

    1) Попроще
    ExpandedWrap disabled
      <?xml version="1.0" encoding="UTF-8"?>
      <operator>
      <item>UMC</item>
      <item>O2</item>
      <item>Beeline</item>
      </operator>

    Нужно сделать массив item. Я смог сделать псевдо-парсер, для случая когда каждый тэг в еденичном числе, а когда их много?

    2) Сложнее
    ExpandedWrap disabled
      <?xml version="1.0" encoding="UTF-8"?>
      <england>
      <item>London</item>
      <item>Chelsea</item>
      </england>
      <france>
      <item>Paris</item>
      <item>Tylysa</item>
      </france>

    Нужно сделать ассоциативный массив страна=>город.

    Помогите плиз :wall:
      В PHP имеются достаточно хорошие встроенные средства (XMLDOM, PEAR::XML для PHP4, родные функции обработки XML в PHP 5) — они просто _очень_ хорошо описаны на сайте php.net, так вот, просьба ознакомиться и использовать в дальнейшем.
        А кто то реально может помочь, а не давать ссылки на мануалы? Там разбиратся не одну неделю.
          Используй miniXML - один из самых простых и быстрых разборщиков XML.
          Функционал позволяет получать DOM-дерево, а затем и обходить его.

          PS: никто не будет тратить свое время и выкладывать готовое решение - гораздо эфективнее Вам будет разобраться самому (тем более с miniXML это отнимает у Вас от силы час). На сайте описаны все методы. Если что не будет понятно, спрашивайте здесь - обязательно помогут.

          Добавлено
          У Вас не совсем правильно построена структура документа. Вернее будет сделать так:
          ExpandedWrap disabled
            <?xml version="1.0" encoding="UTF-8"?>
              <list>
                <england>
                  <item>London</item>
                  <item>Chelsea</item>
                </england>
                <france>
                  <item>Paris</item>
                  <item>Tylysa</item>
                </france>
              </list>


          Весь смысл в получении корня xml-документа (list), который является объектом класса MiniXMLElement, у которого, в свою очередь, имеются потомки, которые можно получить через getAllChildren().

          Устроя цикл, вроде:
          ExpandedWrap disabled
            $xml = new MiniXMLDoc();
             
            $xml->fromFile('');
            // или $xml->fromString('');
             
            $root = $xml->getRoot('list');
            if ($root) {  
              $children = $root->getAllChildren();
              if (sizeof($children) > 0) {
                foreach ($children as $child) {
                  // $child - тоже объект класса MiniXMLElement
                  ....
                }
              }  
            }


          Еще одним решением может стать изменение структуры xml-документа:
          ExpandedWrap disabled
              <list>
                <country name='england'>
                  .....
                </country>
                <country name='france'>
                  .....
                </country>
              </list>


          Тогда обработать такой универсализированный документ гораздо проще
            Цитата Суть Зла @
            ще одним решением может стать изменение структуры xml-документа:
            Да, думаю так лучше будет :yes:

            Спасибо, посмотрю.

            Добавлено
            Вроде все нормально, но появился вопрос, вот такая структура xml документа:
            ExpandedWrap disabled
              <?xml version="1.0" encoding="UTF-8"?>
              <list>
                  <operator>
                      <item>O2</item>
                  </operator>
                  <operator>
                      <item>Alltel</item>
                  </operator>
                  <operator>
                      <item>Sprint</item>
                  </operator>
              </list>


            Код такой, как в примере:
            ExpandedWrap disabled
              <?php
              header('Content-type: text/plain');
               
              require_once('minixml.inc.php');
               
              $xmlDoc = new MiniXMLDoc();
               
              $xmlDoc->fromFile('./product.xml');
               
              print_r($xmlDoc->toArray());
               
              ?>


            Выдает чего то такой результат:
            ExpandedWrap disabled
              Array
              (
                  [list] => Array
                      (
                          [operator] => Array
                              (
                                  [0] => Array
                                      (
                                          [item] => O2
                                      )
               
                                  [1] => Array
                                      (
                                          [item] => Alltel
                                      )
               
                                  [_num] => 3         - откуда это берется???
                                  [2] => Array
                                      (
                                          [item] => Sprint
                                      )
               
                              )
               
                      )
               
              )


            В чем может быть проблема?
              А тот код xml, что Вы предоставили - это и есть product.xml?

              Попробуйте посмотерть, что возвращается Вам в файле - возможно, следует открыть файл xml через file() и считать его построчно - какое содержание будет на выходе.
              Хотя еще лучше будет залезть в метод fromFile библиотеки miniXML и постараться достать получаемый код скриптом оттуда.

              Добавлено
              Настоятельно реккомендую сделать для отладки так:
              1) открывать файл через file()
              2) скачивать его содержимое построчно в переменную $str,
              3) открывать структуру не через fromFile(), а через fromString($str)

              Увидим, есть ли различие.
                Все равно появляется та хрень, уже делаю так:
                ExpandedWrap disabled
                  <?
                  header('Content-type: text/plain');
                   
                  require_once('minixml.inc.php');
                   
                  $xmlDoc = new MiniXMLDoc();
                   
                  $str = implode('', file('./product.xml'));
                   
                  $xmlDoc->fromString($str);
                   
                  print_r($xmlDoc->toArray());
                  ?>
                  А что в $str?
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0368 ]   [ 15 queries used ]   [ Generated: 27.04.24, 19:12 GMT ]