Кодиране в XML (msxml двигател)
Нищо не разбирам. Аз създавам:
FEngine := CreateOLEObject("MSXML2.DOMDocument") като IXMLDOMDocument; FEngine.Async := false ;
ако FEngine.parseError.errorCode <> 0 след това повдигнете Exception.Create( FEngine.parseError.reason);
Когато прочета стойността на възела Val:
TextNode := selectSingleNode("text()") като IXMLDOMText ; ShowMessage(TextNode.data);
Получаваме Windows-1251 кодиране.
И ако xml е така:
тогава получаваме абракадабра. Изглежда, че msxml обикновено игнорира кодирането в xml файла. Защо не преобразува правилно всяко посочено кодиране в своя WideString (utf-16), откъдето винаги бих го прочел също правилно?
И какво да направя в тази ситуация, защото искам да мога да обработвам и XML с windows-1251 и utf-8.
> тогава получаваме абракадабрахм. боклук вътре, боклук вън? отвори си иксемелката с нещо различно от твоята програма и провери дали има боклук или правилния ред.
> Изглежда, че msxml обикновено игнорира кодирането > в xml файл
> хм боклук вътре, боклук вън? отворете своя xemel с - > след това освен твоята програма провери дали има боклук или желания низ.там всичко е наред с кодирането.
Но забелязах една ужасна странност. Ако запишете текста във файл и заредите файла, като използвате метода за зареждане, тогава всичко е много наред.
Но ако, както писах по-горе - динамично чрез метода loadXML - тогава има проблем с кодирането. Какво нещо. Сега усещането, че msxml плюе върху уточняването на кодирането при ДИНАМИЧНО зареждане на xml "i.
на кодировките, с които MSXML работи, и на факта, че вътрешното му представяне е Unicode.
Игор Шевченко, но какъв е смисълът, ако при посочване на кодирането: utf-8 в заглавката на XMLДИНАМИЧНО зареждане - двигателят не го конвертира в правилния формат?
По-точно, както разбирам, при динамично зареждане на XML, двигателят просто плюе върху спецификацията на кодирането и я счита за windows-1251 (което като цяло не е в съответствие със стандарта, според който XML кодирането по подразбиране е utf-8). И съответно се преобразува в уникод, но тъй като предположението за оригиналното кодиране е неправилно, получаваме боклук.
Въпросът е какво да направя палачинката.
> По-точно, както разбирам, при динамично зареждане на XML, > просто плюе върху кодирането и го чете windows- > 1251
Методът loadXML() ще работи само с UTF-16 или UCS-2 кодировки
Крайно време е да забравите за Windows-1251. И тогава ще бъде възможно да плъзнете кодовата страница 866. Или по-лошо, KOI-7. Всичко е минало.
> Методът loadXML() ще работи само с UTF-16 или UCS-2 > кодировкиопа, наистина. По дяволите, каква глупост. Интересно каква е обосновката.
Факт е, че получавам XML по мрежата, би било удобно за мен да го анализирам с помощта на msxml, но тук такава настройка.
Има ли друг валиден начин, освен записването на XML във временната директория всеки път и настройването на msxml двигателя върху него? (
> Има ли друг валиден начин, освен писането на всеки > веднъж XML във временната директория и задайте > msxml двигател? (
Ако има известно UTF-8 кодиране, след това преобразувайте в UTF-16, като използвате стандартното повикване Utf8ToUnicode, например
> > Ако има добре познато кодиране UTF-8, фактът е, че искате универсализация и стандартизация.
Така че няма значение как отдалечената услуга е дала отговора, но той винаги е бил анализиран правилно. Всъщност сега се случва илиutf-8 или windows-1251. И аз искам да стандартизирам според правилата на XML, тоест, ако кодирането не е посочено, тогава това е utf-8 по подразбиране. Отново MS изобрети палачинката за велосипеди.
Разбира се, можете да прикрепите патерици, за да изолирате сами етикета за кодиране, след това да конвертирате XML кода и едва след това да го подадете към msxml двигателя, но по някаква причина тази опция също не ми харесва (
зареждане от поток (IStream), а не чрез loadXml(), тогава кодирането ще бъде взето предвид.
procedure TForm1.Button1Click(Sender: TObject); const s=" "+ " "+ " String "+ " "; var FEngine:variant; begin FEngine := CreateOLEObject("MSXML2.DOMDocument") като IDispatch; FEngine.Async := false ; FEngine.load(TStreamAdapter.Create(TStringStream.Create(s),soOwned) as IStream); ако FEngine.parseError.errorCode <> 0 след това повдигнете Exception.Create( FEngine.parseError.reason); end;
> Отново MS изобрети палачинката за велосипеди.Отново липсва MS. Бих използвал не MSXML2.DOMDocument, а някой друг обект, ако смятате, че ще има по-добра палачинка.
Кодирането в пролога засяга сериализирания документ. Докато това не е така, изобщо не е нужно да се занимавате с кодирането в пролога. Това, което беше записано във възела, беше отчетено
var xdoc ,xdoc1: IXMLDOMDocument2; begin xdoc := CoDOMDocument.Create; xdoc1 := CoDOMDocument.Create; xdoc.loadXML(" "); ShowMessage(xdoc.xml);//кодирането, посочено в пролога, е изчезнало xdoc1.loadXML(xdoc.xml); //все още работи ShowMessage(xdoc1.xml);
ако xdoc е записан във файл, кодирането ще се появи в пролога. Но ако запишете във файл само xdoc.xml.text, файлът няма да се зареди.
Или още по-добре така:
ShowMessage(xdoc.xml);//кодиране, посочено впрологът го няма
> Факт е, че получавам XML по мрежата, би било удобно за мен да го анализирам с помощта на msxml, но тук такава настройка. > Има ли друг валиден начин, освен записването на XML във временната директория всеки път и настройването на msxml двигателя върху него? ( просто заредете(. ) с URL адрес „офлайн“?
Слим, супер, нарани се. Благодаря ти