-
> sniknik © (14.06.16 15:48) [18] > > не читает ANSI файл, в котором заголовок > > <?xml version="1.0"?> > по дефолту кодировка utf-8, определяется при чтении, при > пере-присвоении в Encoding другой идет перекодировка.
А ты пойди, прочти вот так: kDocument := TXMLDocument.Create(nil);
kStringStream := TStringStream.Create(
'<?xml version=\"1.0\"?>'#13+
'<корень></корень>');
kDocument.LoadFromStream(kStringStream, xetUnknown);
Ошибку даст. А вот, если <root></root> будет, то все ОК.
-
Ты пойми, я делаю не для себя, а для разработчиков на скриптовом языке.
скриптовый тот язык позволяет создавать com? если нет, то допили. ... и забудь про вымышленные и самомсозданные проблемы с кодировками и прочим на следующие 20 своих лет
-
Интересный факт. Вот это работает и с декларацией, и без, и с кодировкой и без: Там, оказывается, два метода есть LoadFromXML перегруженных... kDocument := TXMLDocument.Create(nil);
kDocument.LoadFromXML(DOMString('<?xml version=\"1.0\"?>'#13+'<корень></корень>'));
Теперь осталось заставить читать из ansi файла без декларации или без encoding...
-
зачем тебе пролог документа, если тело его содержится в строке?
пролог с кодировкой актуален для сериализованных документов. фалов например.
-
> iop © (14.06.16 16:20) [23] > зачем тебе пролог документа, если тело его содержится в > строке?
Конкретно тут не при чем.
Мне нужно было: А) прочитать XML из ANSI-строки. Б) прочитать XML из ANSI-файла.
С п. А справился - есть две функции LoadFromXML - уникодная версия читает русский XML и с прологом и без.
Вот с п. Б борюсь - если в русском ANSI-файле есть пролог с кодировкой, то все ОК, если кодировки или пробога нет, то не читает с ошибкой.
-
пример на vbs
dim xdoc : set xdoc = CreateObject("MSXML2.DOMDocument")
if xdoc.loadXML("<куку-привет />") then MsgBox(xdoc.xml)
rem dim pi : set pi = xdoc.createProcessingInstruction("xml", "version=""1.0"" encoding=""windows-1251""") rem call xdoc.insertBefore(pi,xdoc.documentElement)
call xdoc.save("test.xml") end if
если выполнить as-is получится utf-8 файл без пролога, но валидный. если раскоментить, получится 1251 документ если раскоментить и заменить 1251 на утф получится утф с прологом.
а пока документ в памяти, то данные в нем ни в 1251 ни в утф.
итого: если хочется загрузить из строки и строка эта в среде выполнения "читаема" (русское по-русски) то грузишь просто откусив вообще любой пролог. перед сохранением добавляешь нужный пролог или ничего не делаешь и получаешь утф без пролога.
-
> iop © (14.06.16 16:30) [25]
Во! Напрямую буду брать CreateOleObject и работать. Без обертки. Я так и с ADO и c Excel работаю. И тут буду. Благо, должно быть описано хорошо в MSDN.
-
> А ты пойди, прочти вот так: а смысл? без указания кодировки как сказал (и во всех доках написано) он принимает utf-8, значит и фактически текст "тела" должен быть в utf-8.
> А вот, если <root></root> будет, то все ОК. без русских букв as is, это и есть utf-8.
зачем ты специально делаешь неправильно да еще другим говоришь "прочти вот так"? не буду даже пробовать.
-
Моя эволюция была такой.
1. DOM. Жрет много памяти. 2. SAX. Неудобно доставать инфу из глубин XML-дерева. 3. XPATH. Чтобы прописать пути, надо заранее знать структуру XML.
То есть, какой использовать - зависит от ситуации. DOM хорош для не слишком больших XML, SAX хорош для неглубоких XML-деревьев, а XPATH хорош, когда известна структура XML.
-
3. XPATH. Чтобы прописать пути, надо заранее знать структуру XML.
Ага. А чтобы пользовать sql против таблицы надо перед глазами иметь всю таблицу распечатанную в бумаге
-
> kDocument.LoadFromXML(DOMString('<?xml version="1.0"?>'#13+'<корень></корень>')); > Теперь осталось заставить читать из ansi файла без декларации или без encoding... что сложного в перекодировке? kDocument.LoadFromXML(AnsiToUtf8('<?xml version="1.0"?>'#13+'<корень></корень>')); или смене "хедера" StringList.Strings[0]{<?xml version="1.0"?>}:= '<?xml version="1.0" encoding="windows-1251"?>'; kDocument.LoadFromXML(StringList.Text); ???
-
Всем спасибо!!!
Был не прав в своих упорных желаниях сделать не правильно. В общем TXMLDocument пользуюсь. Свои маленькие локальные задачи решил.
Случай ANSI без указания encoding считаю ошибочным. Пусть передают правильно.
XPath пока не нужен. Нужен будет, разберусь.
-
тут добрая половина слабо представляет о чем говорит. но говорит. саксу типа не надо знать структуру, но неудобно когда глубоко. а xpath не заюзаешь якобы если не знаешь структуры заранее. в то время как простейшее выражение "//* | //*/@*" переберет все узлы и все атрибуты документа ничего не зная заранее о структуре дом. точно так же как и сакс но структуру якобы надо знать ...... https://www.youtube.com/watch?v=LcmBp0-fJR8
-
> iop © (14.06.16 18:29) [32] > тут добрая половина слабо представляет о чем говорит, но говорит.
Какой ты смелый)) ---- У меня была локальная задача: под свой Facade ( https://en.wikipedia.org/wiki/Facade_pattern) подсунуть другую имплементацию. Что я уже и сделал! Мне не нужно напрямую обращаться к XML: нужно открыть, перебрать теги и атрибуты, закрыть. Все. Про XPath все понятно - надо будет, разберусь. Предлагаю тему закрыть. Ибо исходно она была поднята для выяснение - может есть какой-нибудь известный (но не мне) хрестоматийный материал по использованию TXMLDocument. Оказалось, что надо копать первоисточники. Что надо - раскопал.
-
Коллеги! 1. С удивлением узнал, что TXMLDocument умеет получать XML по HTTP. Посмотрел исходники, вроде как это делается на уровне MSXML, а не довесок в компоненте TXMLDocument. 2. Все бы хорошо, но не могу понять, как обрабатывать ошибки. Например, при вызове LoadFromFile(' http://...'), когда нет соединения, выводится ошибка: System error: -2146697211.
Line: 0
Долго думал, что может значить -2146697211. Не нашел. Может имел кто-то опыт в обработке ошибок обращения по HTTP в компоненте TXMLDocument? 3. Вообще, каково мнение общественности по работе с HTTP в компоненте TXMLDocument? Или лучше через InternetOpen (WinINet) самому в поток читать и его уже скармливать LoadFromStream? Спасибо!
-
так жежь как лучше уже сказали.
-
-
Сам себе отвечу) На stackoverflow ( http://stackoverflow.com/questions/301546/whats-the-simplest-way-to-call-http-get-url-using-delphi) сильно не советуют пользоваться возможностями TXMLDocument в части получения файла из интернета. Мотивация - TXMLDocument дает упрощенный случай (в чем именно, не комментировали). Мне как раз нужно не упрощенный случай - выход в сеть будет из корпоративной сети, т.е. через прокси, коих, как известно, видов не мало. Т.к. с WinINet в одном из проектов работал, то переделал на WinINet. Он намного больше позволяет в части обработок ошибок. Всем спасибо. Звиняйте, что побеспокоил. > op © (21.06.16 20:59) [36]
За код ошибки спасибо.
-
т.е. через проксиТ.к. с WinINet в одном из проектов работал, то переделал на WinINet.есть такая категория людей, которые что-то спрашивают, но советовать им в ответ ни в коем случае ничего не следует. они все равно будут использовать методы, которые требуют ручной поддержки всех типов прокси несмотря на то, что ixmldomdocument.load(' http://......) сработает без всяких proxyoptions если только в системе прокси настроен. сам.
-
> iop © (21.06.16 22:35) [38] > т.е. через прокси > Т.к. с WinINet в одном из проектов работал, то переделал > на WinINet. > > есть такая категория людей, которые что-то спрашивают,
Тебе скучно что-ли?
|