Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Кодировка в XML (движок msxml)   Найти похожие ветки 

 
ES   (2012-10-18 17:46) [0]

Ничего не понимаю. Создаю:

FEngine := CreateOLEObject("MSXML2.DOMDocument") as IXMLDOMDocument;
 FEngine.Async := false ;

 FEngine.loadXML(XMLCode);

 if FEngine.parseError.errorCode <> 0 then
   raise Exception.Create( FEngine.parseError.reason );


XMLCode такой

<?xml version="1.0" encoding="windows-1251"?>
<root>
 <val>Строка</val>
</root>


Когда считываю значение ноды Val:

TextNode := selectSingleNode("text()") as IXMLDOMText ;
ShowMessage(TextNode.data);


Получаем кодировку Windows-1251.

А если xml такой:

<?xml version="1.0" encoding="utf-8"?>
<root>
 <val>привет</val>
</root>


то получаем абракадабру. Такое ощущение, что msxml вообще игнорирует указание кодировку в xml-файле. Почему он корректно не преобразует любую указанную кодировку к своему WideString (utf-16), откуда я бы уже считывал всегда также корректно?

И что делать в этой ситуации, я ведь хочу уметь обрабатывать как XML с windows-1251, так и с utf-8...


 
брат Птибурдукова   (2012-10-18 17:51) [1]


> то получаем абракадабру
гм... garbage in, garbage out? открой свою иксемельку чем-то кроме своей проги и проверь, мусор там или нужная строка.


 
Игорь Шевченко ©   (2012-10-18 18:02) [2]


> Такое ощущение, что msxml вообще игнорирует указание кодировку
> в xml-файле


http://msdn.microsoft.com/en-us/library/windows/desktop/ms757065(v=vs.85).aspx


 
ES   (2012-10-18 18:23) [3]


> гм... garbage in, garbage out? открой свою иксемельку чем-
> то кроме своей проги и проверь, мусор там или нужная строка.

всё ок там с кодировкой.

Но я заметил ужасную странность... Если сохранить текст в файл и загрузить файл методом load, то все очень замечательно.

А вот если как я написал выше - динамически с помощью метода loadXML - то с кодировкой проблемы... Что за штука. Теперь ощущение, что msxml плюет на указание кодировки при ДИНАМИЧЕСКОЙ загрузке xml"я...

Игорь Шевченко, к чему ваша ссылка?


 
Игорь Шевченко ©   (2012-10-18 18:29) [4]


> Игорь Шевченко, к чему ваша ссылка?


к кодировкам, с которыми работает MSXML и к тому, что внутреннее представление у него Unicode.


 
ES   (2012-10-18 18:41) [5]

Игорь Шевченко, ну а что толку, если при указании кодировки: utf-8 в заголовке XML при ДИНАМИЧЕСКОЙ загрузке - движок не преобразовывает его в верный формат?

Точнее, как я понимаю, при динамической загрузке XML движок просто плюет на указание кодировки и считает её windows-1251 (что вообще расходится со стандартом, по которому дефолтная кодировка XML это utf-8). И соответствующим образом преобразует в unicode, но поскольку предположение об изначальной кодировке неверное - получаем фигню.

Вопрос - что делать то блин.


 
Игорь Шевченко ©   (2012-10-18 20:11) [6]


> Точнее, как я понимаю, при динамической загрузке XML движок
> просто плюет на указание кодировки и считает её windows-
> 1251


вот еще одна ссылка:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms754585(v=vs.85).aspx

The loadXML() method will work only with UTF-16 or UCS-2 encodings


 
Dimka Maslov ©   (2012-10-18 22:19) [7]

Давно пора уже забыть про Windows-1251. А то можно будет 866 кодовую страницу приплести. Или того хуже КОИ-7. Это всё прошлый век.


 
ES   (2012-10-18 22:51) [8]


> The loadXML() method will work only with UTF-16 or UCS-2
> encodings

опа, действительно...
Блин глупость какая. Интересно, чем обосновано...

Дело в том, что XML я получаю по сети, мне бы его распарсить удобно с помощью msxml, а тут такая подстава.

А есть другой валидный способ, окромя записывать каждый раз XML в темповую директорию и натравливать уже на него движок msxml? (


 
Игорь Шевченко ©   (2012-10-18 23:42) [9]


> А есть другой валидный способ, окромя записывать каждый
> раз XML в темповую директорию и натравливать уже на него
> движок msxml? (


Если у него известная кодировка UTF-8, то преобразовывать в UTF-16 стандартным вызовом Utf8ToUnicode, например


 
ES   (2012-10-19 00:43) [10]


>
> Если у него известная кодировка UTF-8

так в том и дело, что хочется универсализации и стандартизации.

Чтобы не важно, как отдавал ответ удаленный сервис, а парсилось всегда верно. По факту сейчас бывает или utf-8, или windows-1251.
Причем хочется стандартизации по правилам XML, то есть если кодировка не указана - значит, она дефолтная utf-8. Опять MS изобрели свой велосипед блин...

Конечно, можно костыли приделывать, чтобы самому вычленять тег кодировки, далее преобразовывать код XML и уже потом скармливать его движку msxml, но данный вариант меня тоже почему-то не радует (


 
RWolf ©   (2012-10-19 01:49) [11]

загружай из потока (IStream), а не через loadXml(), тогда кодировка будет учитываться.


 
ES   (2012-10-19 01:58) [12]

примерчик можно?


 
Slym ©   (2012-10-19 06:21) [13]

procedure TForm1.Button1Click(Sender: TObject);
const s="<?xml version="1.0" encoding="windows-1251"?>"+
"<root>"+
"<val>Строка</val>"+
"</root>";
var FEngine:variant;
begin
 FEngine := CreateOLEObject("MSXML2.DOMDocument") as IDispatch;
 FEngine.Async := false ;
 FEngine.load(TStreamAdapter.Create(TStringStream.Create(s),soOwned) as IStream);
if FEngine.parseError.errorCode <> 0 then
  raise Exception.Create( FEngine.parseError.reason );
end;


 
брат Птибурдукова   (2012-10-19 07:51) [14]


> Опять MS изобрели свой велосипед блин...
Опять MS виновато блин... Пользовался бы не MSXML2.DOMDocument, а каким-нибудь другим объектом, если ты думаешь, что там будет лучше блин.


 
Медвежонок Пятачок ©   (2012-10-19 08:45) [15]

Кодировка в прологе влияет на сериализированный документ.
Пока этого нет, с кодировкой в прологе можно вообще не заморачиваться.
Что в узел записали, то и считали


 
Медвежонок Пятачок ©   (2012-10-19 09:05) [16]

Простая иллюстрация

var xdoc ,xdoc1: IXMLDOMDocument2;
begin
xdoc  := CoDOMDocument.Create;
xdoc1 := CoDOMDocument.Create;
xdoc.loadXML("<?xml version="1.0" encoding="windows-1251"?><root/>");
ShowMessage(xdoc.xml);//кодировка указанная в прологе пропала
xdoc1.loadXML(xdoc.xml);
//тем не менее оно работает
ShowMessage(xdoc1.xml);

если xdoc сохранить в файл, кодировка в прологе появится.
Но если сохранить в файл просто xdoc.xml.текст , то файл не загрузится.


 
Медвежонок Пятачок ©   (2012-10-19 09:14) [17]

Или лучше даже так:

xdoc.loadXML("<?xml version="1.0" encoding="windows-1251"?><root name="Вася"/>");

ShowMessage(xdoc.xml);//кодировка указанная в прологе пропала

xdoc1.loadXML(xdoc.xml);
.........


 
sniknik ©   (2012-10-19 09:31) [18]

> Дело в том, что XML я получаю по сети, мне бы его распарсить удобно с помощью msxml, а тут такая подстава.
> А есть другой валидный способ, окромя записывать каждый раз XML в темповую директорию и натравливать уже на него движок msxml? (
просто load(...) с указанием url "из сети"?


 
ES   (2012-10-19 13:22) [19]

Slym, супер, зашибись. Спасибо



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.209 c
2-1337284179
Vasia
2012-05-17 23:49
2013.03.22
Как прописать путь к файлу что бы он отображался...


2-1330951925
leklerk
2012-03-05 16:52
2013.03.22
Как изменить подсвойство dgEditing у свойства Options у DBGrid?


2-1330436797
brother
2012-02-28 17:46
2013.03.22
сохранение published в ini


2-1342699186
vasa777
2012-07-19 15:59
2013.03.22
правое меню


11-1243713103
igg
2009-05-30 23:51
2013.03.22
KOL + FPC для WinCE: Ошибка при компиляции