Конференция "Прочее" » TXMLDocument
 
  • Тимохов Дима © (14.06.16 16:01) [20]

    > 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> будет, то все ОК.
  • iop © (14.06.16 16:04) [21]
    Ты пойми, я делаю не для себя, а для разработчиков на скриптовом языке.

    скриптовый тот язык позволяет создавать com?
    если нет, то допили.
    ... и забудь про вымышленные и самомсозданные проблемы с кодировками и прочим на следующие 20 своих лет
  • Тимохов Дима © (14.06.16 16:14) [22]
    Интересный факт.
    Вот это работает и с декларацией, и без, и с кодировкой и без:
    Там, оказывается, два метода есть LoadFromXML перегруженных...

      kDocument := TXMLDocument.Create(nil);
      kDocument.LoadFromXML(DOMString('<?xml version=\"1.0\"?>'#13+'<корень></корень>'));



    Теперь осталось заставить читать из ansi файла без декларации или без encoding...
  • iop © (14.06.16 16:20) [23]
    зачем тебе пролог документа, если тело его содержится в строке?

    пролог с кодировкой актуален для сериализованных документов. фалов например.
  • Тимохов Дима © (14.06.16 16:22) [24]

    > iop ©   (14.06.16 16:20) [23]
    > зачем тебе пролог документа, если тело его содержится в
    > строке?


    Конкретно тут не при чем.

    Мне нужно было: А) прочитать XML из ANSI-строки. Б) прочитать XML из ANSI-файла.

    С п. А справился - есть две функции LoadFromXML - уникодная версия читает русский XML и с прологом и без.

    Вот с п. Б борюсь - если в русском ANSI-файле есть пролог с кодировкой, то все ОК, если кодировки или пробога нет, то не читает с ошибкой.
  • iop © (14.06.16 16:30) [25]
    пример на 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 ни в утф.

    итого:
    если хочется загрузить из строки и строка эта в среде выполнения "читаема" (русское по-русски) то грузишь просто откусив вообще любой пролог.
    перед сохранением добавляешь нужный пролог или ничего не делаешь и получаешь утф без пролога.
  • Тимохов Дима © (14.06.16 16:52) [26]

    > iop ©   (14.06.16 16:30) [25]

    Во! Напрямую буду брать CreateOleObject и работать. Без обертки.
    Я так и с ADO и c Excel работаю. И тут буду. Благо, должно быть описано хорошо в MSDN.
  • sniknik © (14.06.16 17:31) [27]
    > А ты пойди, прочти вот так:
    а смысл? без указания кодировки как сказал (и во всех доках написано) он принимает utf-8, значит и фактически текст "тела" должен быть в utf-8.

    > А вот, если <root></root> будет, то все ОК.
    без русских букв as is, это и есть utf-8.

    зачем ты специально делаешь неправильно да еще другим говоришь "прочти вот так"? не буду даже пробовать.
  • Юрий Зотов © (14.06.16 17:34) [28]
    Моя эволюция была такой.

    1. DOM. Жрет много памяти.
    2. SAX. Неудобно доставать инфу из глубин XML-дерева.
    3. XPATH. Чтобы прописать пути, надо заранее знать структуру XML.

    То есть, какой использовать - зависит от ситуации. DOM хорош для не слишком больших XML, SAX хорош для неглубоких XML-деревьев, а XPATH хорош, когда известна структура XML.
  • iop © (14.06.16 17:37) [29]
    3. XPATH. Чтобы прописать пути, надо заранее знать структуру XML.


    Ага.
    А чтобы пользовать sql против таблицы надо перед глазами иметь всю таблицу распечатанную в бумаге
  • sniknik © (14.06.16 17:38) [30]
    > 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);
    ???
  • Тимохов Дима © (14.06.16 18:03) [31]
    Всем спасибо!!!

    Был не прав в своих упорных желаниях сделать не правильно.
    В общем TXMLDocument пользуюсь.
    Свои маленькие локальные задачи решил.

    Случай ANSI без указания encoding считаю ошибочным. Пусть передают правильно.

    XPath пока не нужен. Нужен будет, разберусь.
  • iop © (14.06.16 18:29) [32]
    тут добрая половина слабо представляет о чем говорит.
    но говорит.

    саксу типа не надо знать структуру, но неудобно когда глубоко.
    а xpath не заюзаешь якобы если не знаешь структуры заранее.

    в то время как простейшее выражение "//* | //*/@*" переберет все узлы и все атрибуты документа ничего не зная заранее о структуре дом. точно так же как и сакс

    но структуру якобы надо знать ......
    https://www.youtube.com/watch?v=LcmBp0-fJR8
  • Тимохов Дима © (14.06.16 19:13) [33]

    > iop ©   (14.06.16 18:29) [32]
    > тут добрая половина слабо представляет о чем говорит, но говорит.

    Какой ты смелый))

    ----

    У меня была локальная задача: под свой Facade (https://en.wikipedia.org/wiki/Facade_pattern) подсунуть другую имплементацию. Что я уже и сделал! Мне не нужно напрямую обращаться к XML: нужно открыть, перебрать теги и атрибуты, закрыть. Все.

    Про XPath все понятно - надо будет, разберусь.

    Предлагаю тему закрыть. Ибо исходно она была поднята для выяснение - может есть какой-нибудь известный (но не мне) хрестоматийный материал по использованию TXMLDocument. Оказалось, что надо копать первоисточники. Что надо - раскопал.
  • Тимохов Дима © (21.06.16 20:52) [34]
    Коллеги!

    1. С удивлением узнал, что TXMLDocument умеет получать XML по HTTP.
    Посмотрел исходники, вроде как это делается на уровне MSXML, а не довесок в компоненте TXMLDocument.

    2. Все бы хорошо, но не могу понять, как обрабатывать ошибки. Например,
    при вызове LoadFromFile('http://...'), когда нет соединения, выводится ошибка:
    System error: -2146697211.
    Line: 0



    Долго думал, что может значить -2146697211. Не нашел.

    Может имел кто-то опыт в обработке ошибок обращения по HTTP в компоненте TXMLDocument?

    3. Вообще, каково мнение общественности по работе с HTTP в компоненте TXMLDocument?
    Или лучше через InternetOpen (WinINet) самому в поток читать и его уже скармливать LoadFromStream?

    Спасибо!
  • iop © (21.06.16 20:55) [35]
    так жежь как лучше уже сказали.
  • iop © (21.06.16 20:59) [36]
    С удивлением узнал, что TXMLDocument умеет получать XML по HTTP

    это еще што.....

    прикинь, они выложили коды всех ошибок в инет и твою в том числе

    http://answers.microsoft.com/en-us/windows/forum/all/resolving-run-time-error-runtime-error-2146697211/35bc7487-75fa-419b-9db4-7a1649a85e6b?auth=1
  • Тимохов Дима © (21.06.16 22:13) [37]
    Сам себе отвечу)
    На 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]

    За код ошибки спасибо.
  • iop © (21.06.16 22:35) [38]
    т.е. через прокси
    Т.к. с WinINet в одном из проектов работал, то переделал на WinINet.

    есть такая категория людей, которые что-то спрашивают,
    но советовать им в ответ ни в коем случае ничего не следует.

    они все равно будут использовать методы, которые требуют ручной поддержки всех типов прокси

    несмотря на то, что
    ixmldomdocument.load('http://......)  сработает без всяких proxyoptions
    если только в системе прокси настроен.

    сам.
  • Тимохов Дима © (21.06.16 22:38) [39]

    > iop ©   (21.06.16 22:35) [38]
    > т.е. через прокси
    > Т.к. с WinINet в одном из проектов работал, то переделал
    > на WinINet.
    >
    > есть такая категория людей, которые что-то спрашивают,

    Тебе скучно что-ли?
 
Конференция "Прочее" » TXMLDocument
Есть новые Нет новых   [134433   +22][b:0][p:0.001]