За последние 24 часа нас посетили 54478 программистов и 1709 роботов. Сейчас ищут 1752 программиста ...

Помогите что-то туплю с DOMElement->getElementsByTagName(

Тема в разделе "PHP для новичков", создана пользователем sidmal, 3 фев 2008.

  1. sidmal

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

    С нами с:
    25 мар 2007
    Сообщения:
    30
    Симпатии:
    0
    Уважаемые господа подскажите, что-то меня застопорило!

    Пытаюсь парсить xml при помощи DOM.
    Делаю элементарно следующее:

    $xmlfile = 'xml.xml';

    $doc = new DOMDocument;
    $doc->Load($xmlfile);

    $spravka = $doc->getElementsByTagName(iconv('cp1251', 'utf-8', 'Справка'));

    А потом хочу внутри полученного узла смотреть дочерние теги и делаю следующее (помятуя о том, что у DOMElement есть метод getElementsByTagName):
    $fam = $spravka->item(1)->getElementsByTagName(iconv('cp1251', 'utf-8', 'Фамилия'));
    $fam_ = $fam->item(1)->NodeValue;
    }

    В итоге значение в $fam_ = NULL а не нужная мне фамилия!

    xml-на которую пытаюсь разобрать выглядит вот так:

    <Справка>
    <ОбщСвИЧ>
    <ФИО><Фамилия>АБРОСИМОВ</Фамилия>
    <Имя>ЛЕОНИД</Имя>
    <Отчество>ЕВГЕНЬЕВИЧ</Отчество>
    </ФИО>
    <Статус>1</Статус>
    <АдрМЖРФ><Индекс>188512</Индекс>
    <КодРегион>78</КодРегион>
    <Район/>
    <Город>хххх</Город>
    <НасПункт/>
    <Улица>хххх</Улица>
    <Дом>ххх</Дом>
    <Корпус/>
    <Кварт>ххх</Кварт>
    </АдрМЖРФ>
    </ПолучДох>
    </Справка>

    Подскажите что я делаю не правильно?
    Может это делается как-то по другому? Мне в конечном итоге хотелось бы получать элемент xml-ки справка и уже ходить по ее элементам!
    Вариант с childNode не рассматриваю по причине того что в нутри тэга <Справка> может быть разное количество дочерних тэгов!
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    А разметка правильная?
    <Справка>
    <ОбщСвИЧ>
    <ФИО><Фамилия>АБРОСИМОВ</Фамилия>
    <Имя>ЛЕОНИД</Имя>
    <Отчество>ЕВГЕНЬЕВИЧ</Отчество>
    </ФИО>
    <Статус>1</Статус>
    <АдрМЖРФ><Индекс>188512</Индекс>
    <КодРегион>78</КодРегион>
    <Район/>
    <Город>хххх</Город>
    <НасПункт/>
    <Улица>хххх</Улица>
    <Дом>ххх</Дом>
    <Корпус/>
    <Кварт>ххх</Кварт>
    </АдрМЖРФ>
    </ПолучДох>
    </Справка>
     
  3. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    > xml-на которую пытаюсь разобрать выглядит вот так:

    это не xml
     
  4. sidmal

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

    С нами с:
    25 мар 2007
    Сообщения:
    30
    Симпатии:
    0
    Это именно xml. Формат установлен Минфином.
     
  5. sidmal

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

    С нами с:
    25 мар 2007
    Сообщения:
    30
    Симпатии:
    0
    Разметка в самом xml правильная, просто видимо я вставил не совсем удачный курок xml
     
  6. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    приведённый код xml-ем не является, что бы там не говорил минфин.

    > Разметка в самом xml правильная, просто видимо я вставил не совсем удачный курок xml

    что ещё ты забыл нам рассказать?
     
  7. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    бугога, минфин жжот..

    HTML:
    1. <?xml version="1.0" encoding="windows-1251"?>
    2. <НДФЛ2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ВерсФорм="4.00001" ВерсПрог="4.214" ИдФайл="ДОХОД_2НДФЛ_1111_1111111111111111111_20070115_1">
    и так далее

    для тех кто не в курсе: это не является "правильно составленным" xml-ем и должно отвергаться любым вменяемым xml парсером.
     
  8. md5

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

    С нами с:
    29 янв 2007
    Сообщения:
    250
    Симпатии:
    0
    а почему Минфин устанавливает формат xml? o_O
     
  9. sidmal

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

    С нами с:
    25 мар 2007
    Сообщения:
    30
    Симпатии:
    0
    Ну это как-то же парсится другими прогами!
    Почему на php эту xml-ну почему php не может ее парсить?
     
  10. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    хз почему. предположу, что libxml предназначен для парсинга именно xml, а не yaml, bbcode или "формата минфина" :)
     
  11. AlexGousev

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

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    sidmal
    С кодировками точно все правильно? Ну и правильней было бы применять xpath


    dark-demon
    Мы с Олегом уже спорили на тему допустимости кириллицы в именах тегов и атрибутов. В спецификации запрета на использование символов кириллицы я не нашел. libxml тоже не против: все прекрасно работает.

    ЗЫ: с минфином я никак не связан и, в общем-то, против использования кириллицы в именах тегов и иной кодировки, нежели utf-8.

    ЗЫЫ: Зачем они устанавливают namespace, который ни разу не используется - мне тоже непонятно.
     
  12. sidmal

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

    С нами с:
    25 мар 2007
    Сообщения:
    30
    Симпатии:
    0
    С кодировками точно все правильно (спасибо вашим советам).
    А подскажите, пожалуйста, как можно использовать xpath, чтобы получать доступ к любому тегу внутри <справка>
     
  13. Anonymous

    Anonymous Guest

    Мы не спорили, а вели дискуссию. ;)

    Тут скорее всего зависит от типа парсера - может expat поможет?
     
  14. AlexGousev

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

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    :)

    Да нормально все работает

    PHP:
    1. <?php
    2.  
    3. $x = new DOMDocument();
    4. $x->load('xml.xml');
    5. $xp = new DOMXPath($x);
    6.  
    7. $fs = $xp->query('/НДФЛ2/Справка/ПолучДох/ФИО/Фамилия');
    8. foreach ($fs as $f)
    9.     echo $f;
    10.  
    11. ?>
     
  15. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    [посыпаю голову пеплом]