Уважаемые господа, может кто знает у меня такая проблема! Ест 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: ! Заранее всем спасибо кто откликнется!
Русские символы в имени тега можно использовать лишь в случае UTF-8, с никакими другими кодировакми этого делать НЕЛЬЗЯ согласно спецификации
Это к сожалению требование Налоговой инспекции, она и формат задает! Я думал написать, но чей то мне не придумать как распознавать теги, а писать чертову тучу if-ов меня не улыбает!
2 функции всего PHP: <? function GetXMLFirstVal($r,$t) { if(preg_match_all('/<('.$t.')[^>]{0,}>(.*)<\/\\1>/Usi',$r,$o)) return $o[2][0]; return ''; } function GetXMLAllVal($r,$t) { if(preg_match_all('/<('.$t.')[^>]{0,}?>(.*)<\/\\1>/Usi',$r,$o)) return $o[2]; return array(); } ?>
Нет, это из-за того, что вы пишите название тега в cp1251. А внутри libxml, которую использует PHP все данные хранятся в UTF-8. Выхода 2: 1. Правильный: файл скрипта должен быть в UTF-8. 2. Кривой: каждый раз делать iconv: $xml->getElementsByTagName(iconv('cp1251' ,'utf-8', 'Фамилия')) Олег, кинь в меня тем куском спеки, в которой говорится об ограничении символов в имени тега в зависимости от кодировки.
sidmal 1. Читаем XML файл в cp1251 2. Конвертируем его в UTF-8, меняем заголовок. 3. Разбираем стандартными средствами.
Dagdamor DOMXML при загрузке сам прочитает заголовок и переконвертирует все в UTF-8 ;-) Горбунов Олег И где там хоть слово про то, что нельзя использовать символы с кодами 129-256?
Согласен, жесткого запрета нет. Но: 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:
Горбунов Олег PHP: <?php echo dechex(ord('А')).'-'.dechex(ord('Я')).' '.dechex(ord('а')).'-'.dechex(ord('я')); ?> Код (Text): c0-df e0-ff