Мне тут недавно потребовалось распарсить небольшой файлик, имеющий XML-структуру, но такая весьма тривиальная задача обернулась странными проблемами. Дело в том, что
не хочет воспринимать русские символы и злостно на них ругается.
Например, берём XML вот такого содержания:
Код: Выделить всё
<OTIMSG>
<NP_Cmd>NP_Cmd_Get_File_List</NP_Cmd>
<TG>C:\Documents and Settings\</TG>
<TF>43003A005C0044006F00630075006D0065006E0074007300200061006E0064002000530065007400740069006E00670073005C00100434043C0438043D043804410442044004300442043E0440045C002004300431043E044704380439042000410442043E043B04</TF>
</OTIMSG>
Обрабатываем его с помощью следующего кода:
Выставляем XPath expression равным TG, получаем в Array один элемент со значением C:\Documents and Settings\, то есть, всё вроде нормально. Но если в XML-файле будет строка вот такого вида:
Код: Выделить всё
<TG>C:\Documents and Settings\Администратор</TG>
то
споткнётся и выдаст ошибку:
- XMLerror.jpg (52.71 КБ) 4072 просмотра
Я пробовал воспользоваться инструментами Escape / Unescape XML, чтобы заменить все ASCII-символы с кодами 128-255 на их HTML-представления (&#[код_символа];). Однако на выходе получается совсем не то, что хотелось бы:
По-видимому, парсер Xerces пытается перекодировать эти символы обратно и выбирает неверную кодировку. Я подумал, что может это особенность лишь Xerces, решил использовать MSXML через .NET.
Если в TG нет кириллицы, то всё работает замечательно. Стоит только появиться русским буквам, выскакивает такое вот окно:
- XMLerror2.jpg (106.56 КБ) 4072 просмотра
При использовании Escape / Unescape вместо русских символов на выходе одни знаки вопроса... Вопрос: как всё-таки распарсить этот текст, не используя работу со строками? Структура файла, кстати, может слегка меняться, скажем, TG может не быть, а есть TJ, а затем TK. И по идее нужно извлечь значение каждого элемента каждой ветви. Есть ли нормальный парсер, которого не будет смущать присутствие "иностранных" символов? Хочу ещё попробовать продукт JKI, но он платный, да и скорее всего в нём тоже есть такой баг.
Спасибо читающим ! :)