Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

Кодировка в 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.078 c
15-1342691121
AV
2012-07-19 13:45
2013.03.22
Помните, в перестройку Лысенков некий Телемаркет рекламировал?


15-1328771976
CleriC
2012-02-09 11:19
2013.03.22
Можно ли установить CnWizards (CnPack) для двух версий Delphi?


1-1300638375
maxstels
2011-03-20 19:26
2013.03.22
Автоматические заполнение заготовок процедур


15-1340637636
Artem
2012-06-25 19:20
2013.03.22
Покупки с VISA через Интернет (Андроид маркет)


15-1340596830
ArchValentin
2012-06-25 08:00
2013.03.22
Обучение





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский