XML и кириллица

Работа с файлами и базами данных
Ответить
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 127 раз
Контактная информация:

XML и кириллица

Сообщение dadreamer »

Мне тут недавно потребовалось распарсить небольшой файлик, имеющий XML-структуру, но такая весьма тривиальная задача обернулась странными проблемами. Дело в том, что :labview: не хочет воспринимать русские символы и злостно на них ругается.
Например, берём XML вот такого содержания:

Код: Выделить всё

<OTIMSG>
<NP_Cmd>NP_Cmd_Get_File_List</NP_Cmd>
<TG>C:\Documents and Settings\</TG>
<TF>43003A005C0044006F00630075006D0065006E0074007300200061006E0064002000530065007400740069006E00670073005C00100434043C0438043D043804410442044004300442043E0440045C002004300431043E044704380439042000410442043E043B04</TF>
</OTIMSG>
Обрабатываем его с помощью следующего кода:
XML1.jpg
Выставляем XPath expression равным TG, получаем в Array один элемент со значением C:\Documents and Settings\, то есть, всё вроде нормально. Но если в XML-файле будет строка вот такого вида:

Код: Выделить всё

<TG>C:\Documents and Settings\Администратор</TG>
то :labview: споткнётся и выдаст ошибку:
XMLerror.jpg
XMLerror.jpg (52.71 КБ) 4064 просмотра
Я пробовал воспользоваться инструментами Escape / Unescape XML, чтобы заменить все ASCII-символы с кодами 128-255 на их HTML-представления (&#[код_символа];). Однако на выходе получается совсем не то, что хотелось бы:

Код: Выделить всё

C:\Documents and Settings\Aaieieno?aoi?
По-видимому, парсер Xerces пытается перекодировать эти символы обратно и выбирает неверную кодировку. Я подумал, что может это особенность лишь Xerces, решил использовать MSXML через .NET.
XML2.jpg
Если в TG нет кириллицы, то всё работает замечательно. Стоит только появиться русским буквам, выскакивает такое вот окно:
XMLerror2.jpg
XMLerror2.jpg (106.56 КБ) 4064 просмотра
При использовании Escape / Unescape вместо русских символов на выходе одни знаки вопроса... Вопрос: как всё-таки распарсить этот текст, не используя работу со строками? Структура файла, кстати, может слегка меняться, скажем, TG может не быть, а есть TJ, а затем TK. И по идее нужно извлечь значение каждого элемента каждой ветви. Есть ли нормальный парсер, которого не будет смущать присутствие "иностранных" символов? Хочу ещё попробовать продукт JKI, но он платный, да и скорее всего в нём тоже есть такой баг.
Спасибо читающим ! :)
Аватара пользователя
Sergey Ivanov

Activity Professionalism Gold Автор
expert
expert
Сообщения: 1217
Зарегистрирован: 01 мар 2009, 20:54
Награды: 5
Версия LabVIEW: 2018
Откуда: Санкт-Петербург, Кронштадт
Благодарил (а): 11 раз
Поблагодарили: 1 раз
Контактная информация:

Re: XML и кириллица

Сообщение Sergey Ivanov »

Иван (IvanLis) писал статью про парсинг XML файлов. Я не могу сказать, работает он (парсер) с кирилицей или нет. Сам никогда такое не делал. Вот статья: http://www.labviewportal.org/ru/sovetyi ... -xml-parse
Добро пожаловать на http://rk-stud.ru/
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 127 раз
Контактная информация:

Re: XML и кириллица

Сообщение dadreamer »

Sergey Ivanov, его статья посвящена всё тому же :labview: 'шному Xerces 2.7, который я опробовал в первую очередь. Есть ещё одна статья о регулярных выражениях, но она не оформлена до конца, хотя наверное здесь будет сложно обойтись одной регуляркой. Попробовал EasyXML от JKI, там всего 4 инструмента, видимо остальное - в платной версии. И работает по схеме, что в моем случае не совсем уместно, т.к. я сам толком не знаю структуру элементов.
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5463
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 87 раз

Re: XML и кириллица

Сообщение IvanLis »

К сожалению, статью по парсингу используя регулярные выражения доделать.. все руки не доходят.
Хотя, по личным наблюдениям, работает реально быстрее чем стандартный парсер.

Задача была решена, ушел в другую стезю... буду надеяться, что пересилю свою лень и дооформлю урок.

Теперь к Вашей проблеме...
"Правильный" XML в заголовке:
<?xml version="1.0" encoding="UTF-8"?>
имеет данные о кодировке.

Отсюда и необходимо плясать.
Если разобрать файл требуется именно в :labview: , чего я в принципе не советую делать.
Пытался парсить программу TV (XMLTV), скачанную с teleguide.info. Уходит на это ооочень много времени, даже не стану писать, сколько часов :cry: . По этому, к сожалению, сделал для себя вывод, что он не годится для решения нормальных задач.

Немного отвлекся...
Можно написать скрипт, который будет перекодировать в другую кодировку, понятную для :labview: .
А самый производительный, но не самый простой... Это сторонняя библиотека с использованием нормально парсера. А потом передача данных в :labview: .
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 127 раз
Контактная информация:

Re: XML и кириллица

Сообщение dadreamer »

IvanLis

Спасибо за ответ. Попробую присобачить заголовок к XML-строке, посмотрим, что из этого выйдет. Не хотелось бы лишний раз завязываться со сторонними библиотеками. Ну, если не получится, то попробую.
Всё-таки EasyXML работает, причём выдаёт строку в нормальном виде.
EasyXML.jpg
EasyXML.jpg (44.83 КБ) 4036 просмотров
Но необходимо знать имена ветвей в XML-строке, так что этот инструмент не совсем удобен.
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 127 раз
Контактная информация:

Re: XML и кириллица

Сообщение dadreamer »

Итак, встроенный в LabVIEW парсер заработал с заголовоком <?xml version="1.0" encoding="windows-1251"?>. Также удалось заставить работать и MSXML, причём даже без заголовка, а просто методом LoadXml (String xml) вместо Load (String filename). Что само по себе странно, т.к. в MSDN написано: "The loadXML() method will work only with UTF-16 or UCS-2 encodings." Ну да ладно, три варианта работают, и то хорошо Изображение
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Сохранение данных»