За последние 24 часа нас посетили 60810 программистов и 1743 робота. Сейчас ищет 951 программист ...

DOMXML и теги в кирилице

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

Статус темы:
Закрыта.
  1. sidmal

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

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

    Ест xml файл который со строгой структурой, вида:

    <?xml version="1.0" encoding="windows-1251" ?>
    <Документ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Чел>
    <ФИО>
    <Фамилия>Иванов</Фамилия>
    <Имя>Иван</Имя>
    <Отчество>Иванович</Отчество>
    </ФИО>
    <УдЛичн>
    <КодУдЛичн>21</КодУдЛичн>
    <СерНомДок>11 11 111111</СерНомДок>
    </УдЛичн>
    </Чел>
    </Документ>

    Как видно все теги в этом документе прописаны кириллицей.
    Так вот при чтение стандартным образом при помощи dom:

    <?php

    $doc = new DOMDocument;
    $doc->load('xml.xml');

    $items = $doc->getElementsByTagName('Фамилия');

    for ($i = 0; $i < $items->length; $i++) {
    echo $items->item($i)->nodeValue . "\n";
    }

    ?>

    результат нулевой, как я понимаю из-за того что теги в кириллице!

    Пробовал конвертировать название тега в разные кодировки при помощи iconv, результат опять же никакой!

    Подскажите если кто знает как можно обойти эту ситуацию?
    Варианты, типа замени теги на транслит не катят :wink: !

    Заранее всем спасибо кто откликнется!
     
  2. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    1, а какой мудак теги в русской кодировке генерирует?
    2. написать свой маленький парсер.
     
  3. Anonymous

    Anonymous Guest

    Русские символы в имени тега можно использовать лишь в случае UTF-8, с никакими другими кодировакми этого делать НЕЛЬЗЯ согласно спецификации
     
  4. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    не знал. спсибо, друг...
     
  5. sidmal

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

    С нами с:
    25 мар 2007
    Сообщения:
    30
    Симпатии:
    0
    Это к сожалению требование Налоговой инспекции, она и формат задает!
    Я думал написать, но чей то мне не придумать как распознавать теги, а писать чертову тучу if-ов меня не улыбает! :(
     
  6. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    2 функции всего

    PHP:
    1. <?
    2.  
    3.  function GetXMLFirstVal($r,$t) {
    4.          if(preg_match_all('/<('.$t.')[^>]{0,}>(.*)<\/\\1>/Usi',$r,$o)) return $o[2][0];
    5.          return '';
    6.  }
    7.  
    8.  function GetXMLAllVal($r,$t) {
    9.          if(preg_match_all('/<('.$t.')[^>]{0,}?>(.*)<\/\\1>/Usi',$r,$o)) return $o[2];
    10.          return array();
    11.  }
    12. ?>
    13.  
     
  7. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    точно мудаки...
     
  8. AlexGousev

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

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Нет, это из-за того, что вы пишите название тега в cp1251. А внутри libxml, которую использует PHP все данные хранятся в UTF-8.

    Выхода 2:
    1. Правильный: файл скрипта должен быть в UTF-8.
    2. Кривой: каждый раз делать iconv: $xml->getElementsByTagName(iconv('cp1251' ,'utf-8', 'Фамилия'))

    Олег, кинь в меня тем куском спеки, в которой говорится об ограничении символов в имени тега в зависимости от кодировки.
     
  9. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    sidmal
    1. Читаем XML файл в cp1251
    2. Конвертируем его в UTF-8, меняем заголовок.
    3. Разбираем стандартными средствами.
     
  10. AlexGousev

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

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Dagdamor
    DOMXML при загрузке сам прочитает заголовок и переконвертирует все в UTF-8 ;-)

    Горбунов Олег
    И где там хоть слово про то, что нельзя использовать символы с кодами 129-256?
     
  11. sidmal

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

    С нами с:
    25 мар 2007
    Сообщения:
    30
    Симпатии:
    0
    Извините если вопрос глупый, а как это реализовать?
     
  12. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Сохранить файл в UTF-8 :) большинство редакторов предоставляют эту опцию.
     
  13. Anonymous

    Anonymous Guest

    Согласен, жесткого запрета нет. Но:

    Character Range[2] Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */


    The mechanism for encoding character code points into bit patterns may vary from entity to entity. All XML processors MUST accept the UTF-8 and UTF-16 encodings of Unicode 3.1 [Unicode3]; the mechanisms for signaling which of the two is in use, or for bringing other encodings into play, are discussed later, in 4.3.3 Character Encoding in Entities.

    Note:

    Document authors are encouraged to avoid "compatibility characters", as defined in section 6.8 of [Unicode] (see also D21 in section 3.6 of [Unicode3]). The characters defined in the following ranges are also discouraged. They are either control characters or permanently undefined Unicode characters:

     
  14. sidmal

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

    С нами с:
    25 мар 2007
    Сообщения:
    30
    Симпатии:
    0
    Спасибо завтра попробую =)
     
  15. AlexGousev

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

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

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

    С нами с:
    25 мар 2007
    Сообщения:
    30
    Симпатии:
    0
    Спасибо разобрался!
    Отдельное спасибо за советы AlexGousev!

    Тему закрываю!
     
Статус темы:
Закрыта.