Форум: "Прочее";
Текущий архив: 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.056 c