За последние 24 часа нас посетили 50987 программистов и 1803 робота. Сейчас ищут 734 программиста ...

XML парсер

Тема в разделе "Прочие вопросы по PHP", создана пользователем Gopher, 17 май 2016.

  1. Gopher

    Gopher Новичок

    С нами с:
    17 май 2016
    Сообщения:
    2
    Симпатии:
    0
    Доброго времени суток. Потребовалось распарсить xml файл. В мане нашел прекрасную функцию simplexml_load_file(). Сначала она возвращала пустой объект. Нагуглил что у нее проблема с
    Namespace, ну и там же было решение. Корень получить удалось. Но меня интересует v8msg:Body и то что у него внутри. А вот при попытке получить детенышей получаю:
    Код (Text):
    1. Notice: Trying to get property of non-object
    var_dump() говорит что Body - объект. Я пробовал к нему обращаться и как к объекту и как к массиву. Толко предупреждения меняются. Подскажите где косячу.
    Структура файла:
    Код (Text):
    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <v8msg:Message xmlns:v8msg="http://v8.1c.ru/messages">
    3.     <v8msg:Header>
    4.         <v8msg:ExchangePlan>ОбменССайтом</v8msg:ExchangePlan>
    5.         <v8msg:To>WW</v8msg:To>
    6.         <v8msg:From>T1</v8msg:From>
    7.         <v8msg:MessageNo>17</v8msg:MessageNo>
    8.         <v8msg:ReceivedNo>0</v8msg:ReceivedNo>
    9.     </v8msg:Header>
    10.     <v8msg:Body xmlns:v8="http://v8.1c.ru/data" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    11.         <TableVoz>
    12.             <Row>
    13.                 <ID xsi:type="xsd:string">f54099e4-e27e-11df-9fba-6cf0496cdd01</ID>
    14.                 <Month xsi:type="xsd:dateTime">2016-04-01T00:00:00</Month>
    15.                 <Status xsi:type="xsd:decimal">0</Status>
    16.                 <Price xsi:type="xsd:decimal">0</Price>
    17.                 <PriceAgent xsi:type="xsd:decimal">0</PriceAgent>
    18.             </Row>
    19.             <Row>
    20.                 <ID xsi:type="xsd:string">f54099e4-e27e-11df-9fba-6cf0496cdd01</ID>
    21.                 <Month xsi:type="xsd:dateTime">2016-04-02T00:00:00</Month>
    22.                 <Status xsi:type="xsd:decimal">0</Status>
    23.                 <Price xsi:type="xsd:decimal">0</Price>
    24.                 <PriceAgent xsi:type="xsd:decimal">0</PriceAgent>
    25.             </Row>
    26.             <Row>
    27.                 <ID xsi:type="xsd:string">f54099e4-e27e-11df-9fba-6cf0496cdd01</ID>
    28.                 <Month xsi:type="xsd:dateTime">2016-04-03T00:00:00</Month>
    29.                 <Status xsi:type="xsd:decimal">0</Status>
    30.                 <Price xsi:type="xsd:decimal">0</Price>
    31.                 <PriceAgent xsi:type="xsd:decimal">0</PriceAgent>
    32.             </Row>
    33.         </TableVoz>
    34.     </v8msg:Body>
    35. </v8msg:Message>
    Код получения XML:

    PHP:
    1. $xml = simplexml_load_file('import.xml');
    2.     $ploschadki = $xml->getNamespaces();
    3.  
    4.     $hz = $xml->children($ploschadki['v8msg']);
    5.     $hz2 = $hz->Body;
    6.     $hz21 = $hz2->getNamespaces();
    7.     $hz3 = $hz2->children($hz21->TableVoz);
    8.  
    9.     var_dump($hz3);
     
  2. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    А почему бы xpath не использовать?
    PHP:
    1. <?php
    2. $xml = simplexml_load_file('import.xml');
    3. $rows = $xml->xpath('//v8msg:Body/TableVoz');
    4. var_dump($rows);
     
    Gopher нравится это.
  3. Gopher

    Gopher Новичок

    С нами с:
    17 май 2016
    Сообщения:
    2
    Симпатии:
    0
    Вы гений! Спасибо большое! Я просто впервые столкнулся с парсингом xml и на xpath не натыкался!))
    Все корректно работает!)