Модератор: Модераторы
Re: Работа с xml. С чего начать и куда двигаться?
Где бы раздобыть какую-нибудь документацию по данному вопросу, хотябы на буржуйском. Туториалы это конечно круто для начала работы, но далее возникает туева хуча вопросов, найти ответ на которые можно только ковыряя исходники, а это ой как долго.
Может от Делфей чего-нибудь можно почитать, или по человечески описанный DOM — какие там структуры данных и какие операции над ними можно выполнять??? Все что я по этому поводу находил из серии: «Использование DOM, для чтения RSS на PHP» и так далее, т.е. примеры кода для непонятного (мне) применения на неудобоваримых (для меня) языках, а общая структура нигде не описана.
-
alek111 - новенький
- Сообщения: 20
- Зарегистрирован: 20.06.2006 16:17:50
Re: Работа с xml. С чего начать и куда двигаться?
Sergei I. Gorelkin » 10.02.2009 22:26:57
Ну если на буржуйском, то спецификация DOM Level 2, которой стремится соответствовать модуль DOM, находится здесь:
http://www.w3.org/TR/DOM-Level-2-Core/
Информация от Дельфей большей частью относится к MSXML, который хоть и похож, но, как это всегда бывает у M$, несколько другой. Вот эта ссылка
http://xml.nsu.ru/dom/dom_home.xml
тоже MSXML-специфична, зато на русском.
Спецификация DOM определяет только интерфейсы, без указания структур данных. Модуль DOM писался в дремучие времена, когда нормальной поддержки интерфейсов в компиляторе не было, поэтому вместо интерфейсов использует обычные классы.
-
Sergei I. Gorelkin - энтузиаст
- Сообщения: 1407
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
-
- Профиль
- ICQ
Re: Работа с xml. С чего начать и куда двигаться?
Ustas » 30.11.2009 14:46:52
…Остановлюсь на это ветке… У меня вопрос, озаглавивший эту ветку форума, остался.
Просмотрев весь форум по теме XML, пришел к выводу, что генеральной линии по работе с XML-файлами нет. Может, конечно я чего и упустил.
Мне нужно прочитать XML-файл, в заголовке которого стоит <?xml version=»1.0″ encoding=»windows-1251″?>. Функция ReadXMLFile сразу говорить, что не поддерживает этот формат. Так, с чего начать?..
- Ustas
- постоялец
- Сообщения: 153
- Зарегистрирован: 19.10.2009 14:58:10
- Откуда: г.Муром
Re: Работа с xml. С чего начать и куда двигаться?
Climber » 30.11.2009 15:20:11
Могу скинуть два класса, которые я написал для себя месяц назад. Кривовато (как и все остальное, что я делаю руками ), зато работает и написано на паскале.
Классы могут:
1) распарсить xml-файл
2) найти узел по названию
3) сохранить свою структуру в виде xml-файла (мне этого достаточно, чтобы генерировать вордовские документы).
Написано за 4-5 часов. Документации нет, комментариев в коде тоже почти нет.
- Climber
- постоялец
- Сообщения: 415
- Зарегистрирован: 03.06.2007 20:09:57
- Откуда: Москва
Re: Работа с xml. С чего начать и куда двигаться?
Sergei I. Gorelkin » 30.11.2009 15:48:44
Ustas писал(а):Мне нужно прочитать XML-файл, в заголовке которого стоит <?xml version=»1.0″ encoding=»windows-1251″?>. Функция ReadXMLFile сразу говорить, что не поддерживает этот формат. Так, с чего начать?..
Вариант 1: подключить к проекту модуль xmliconv (для не-windows платформ), либо xmliconv_windows и положить рядом библиотеку iconv.dll. Тогда ReadXMLFile будет понимать все форматы.
Вариант 2: написать свой декодер только для windows-1251 — по сути, две функции. Как это сделать, написано тут:
http://wiki.freepascal.org/XML_Decoders
.
-
Sergei I. Gorelkin - энтузиаст
- Сообщения: 1407
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
-
- Профиль
- ICQ
Re: Работа с xml. С чего начать и куда двигаться?
Ustas » 30.11.2009 16:49:10
Sergei I. Gorelkin писал(а):
Вариант 1: подключить к проекту модуль xmliconv (для не-windows платформ), либо xmliconv_windows и положить рядом библиотеку iconv.dll. Тогда ReadXMLFile будет понимать все форматы.
Вариант 2: написать свой декодер только для windows-1251 — по сути, две функции. Как это сделать, написано тут:http://wiki.freepascal.org/XML_Decoders
.
Не совсем понял, точнее совсем не понял. А по правде сказать… Ладно…
Эти два варианта подразумевают использование iconv.dll?
- Ustas
- постоялец
- Сообщения: 153
- Зарегистрирован: 19.10.2009 14:58:10
- Откуда: г.Муром
Re: Работа с xml. С чего начать и куда двигаться?
Mr.Smart » 30.11.2009 16:50:46
Первый да, а второй нет!
- Mr.Smart
- долгожитель
- Сообщения: 1796
- Зарегистрирован: 29.03.2008 01:01:11
- Откуда: из леса!
Re: Работа с xml. С чего начать и куда двигаться?
Odyssey » 30.11.2009 17:51:48
Я в своё время нашел отличную библиотеку для Delphi, не требующую никаких DLL — SimpleXML Михаила Власова. Портировал её на FreePascal и немного дополнил, только вот выложить всё никак не собрался. Пока прикладываю архив к сообщению. Лицензия у неё нестандартная, но чем-то похожа на BSD.
В зависимости от опций компиляции, библиотека работает либо с AnsiString либо с WideString. Есть ограничение — после портирования она перестала поддерживать нелатинские символы в именах тегов и атрибутов. Зато если использовать в именах тегов/атрибутов только латиницу, можно прозрачно без перекодировки работать со значениями тегов/атрибутов в UTF-8.
Внешний интерфейс библиотеки — не DOM-API, а, насколько я понял, совместимый с MSXML. По скорости библиотека уступает FPC-шной, и добавляет достаточно много к объёму исполняемого файла (из-за использования интерфейсов, на которых целиком построен её API). Но для меня всё решили два её свойства — возможность работы и с cp1251, и с utf-8, и простой исходный код.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- Odyssey
- энтузиаст
- Сообщения: 580
- Зарегистрирован: 29.11.2007 17:32:24
Re: Работа с xml. С чего начать и куда двигаться?
Ustas » 01.12.2009 12:17:37
Спасибо за ответы. SimpleXML — модуль занимательный, но у меня кругом латиница. Из всего предложенного попробую с
Вариант 2: написать свой декодер только для windows-1251 — по сути, две функции.
Только с
у мня возникли проблемы, не написанием процедур (пока… ), а где они буду заменены. Судя по описанию, то в xmliconv_windows. Что-то я его нигде найти не могу… Можете описать организацию этого вопроса, что и где взять, куда поместить и т.д.?
- Ustas
- постоялец
- Сообщения: 153
- Зарегистрирован: 19.10.2009 14:58:10
- Откуда: г.Муром
Re: Работа с xml. С чего начать и куда двигаться?
Sergei I. Gorelkin » 01.12.2009 12:39:18
xmliconv_windows лежит рядом с dom и xmlread. Только FPC нужно брать свежий, из транка или 2.4.0rc1.
Заменять ничего не надо, надо написать свой маленький модуль и подключить его к проекту. Заготовка ниже:
- Код: Выделить всё
unit conv1251;
interface
implementation
uses
xmlread;function Win1251_Decode(Context: Pointer; InBuf: PChar; var InCnt: Cardinal; OutBuf: PWideChar; var OutCnt: Cardinal): Integer; stdcall;
begin
// здесь делается перекодировка из Windows-1251 в utf-16
end;function GetMyDecoder(const AEncoding: string; out Decoder: TDecoder): Boolean; stdcall;
begin
if SameText(AEncoding, 'Windows-1251') then
begin
Decoder.Decode := @Win1251_Decode;
Result := True;
end
else
Result := False;
end;initialization
RegisterDecoder(@GetMyDecoder);end.
-
Sergei I. Gorelkin - энтузиаст
- Сообщения: 1407
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
-
- Профиль
- ICQ
Re: Работа с xml. С чего начать и куда двигаться?
inSaNE » 21.11.2013 15:34:45
Sergei I. Gorelkin писал(а):подключить к проекту модуль xmliconv (для не-windows платформ), либо xmliconv_windows и положить рядом библиотеку iconv.dll. Тогда ReadXMLFile будет понимать все форматы.
Sergei I. Gorelkin Сергей, подскажите, пожалуйста! xmliconv_windows в uses добавил, iconv.dll положил. ReadXMLFile всё равно выдает «Encoding windows-1251 is not supported» Может еще что-то нужно?
- inSaNE
- незнакомец
- Сообщения: 3
- Зарегистрирован: 21.11.2013 14:55:09
Re: Работа с xml. С чего начать и куда двигаться?
Sergei I. Gorelkin » 21.11.2013 16:01:44
У меня не получается воспроизвести — все работает:
- Код: Выделить всё
uses
xmliconv_windows,dom,xmlread;var
doc: TXMLDocument;
begin
ReadXMLFile(doc, '1251.xml');
writeln(doc.documentelement.nodename);
doc.free;
end.
Файл 1251.xml:
- Код: Выделить всё
<?xml version="1.0" encoding="windows-1251" ?>
<по-русски/>
-
Sergei I. Gorelkin - энтузиаст
- Сообщения: 1407
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
-
- Профиль
- ICQ
Re: Работа с xml. С чего начать и куда двигаться?
inSaNE » 21.11.2013 16:49:54
Sergei I. Gorelkin Спасибо! К сожалению, у меня с вашим кодом и вашим же файлом тот же результат. Может у меня iconv.dll неправильная? Откуда её нужно взять?
lazarus: 1.0.10 от 06-09-2013
fpc: 2.6.2
Добавлено спустя 13 минут 8 секунд:
Sergei I. Gorelkin Дело, действительно, оказалось в «плохой» dll.
Взял отсюда:
http://www.gnupg.org/download/iconv.en.html
И всё удалось!
Сергей, спасибо большое за помощь!
- inSaNE
- незнакомец
- Сообщения: 3
- Зарегистрирован: 21.11.2013 14:55:09
Re: Работа с xml. С чего начать и куда двигаться?
inSaNE » 22.11.2013 09:09:39
Sergei I. Gorelkin Эх, следующие грабли не заставили долго ждать. Я открываю xml с encoding = windows-1251, меняю некоторые значения и затем мне нужно сохранить его опять же в windows-1251. Как это сделать?
WriteXMLFile, получается, пишет все равно в utf-8, вот беда. В XML Tutorial на wiki это подтверждается Как же быть? Может быть можно как-то конвертировать потом файл в windows-1251, а encoding = windows-1251 залезть в файл и заменить как строку?
- inSaNE
- незнакомец
- Сообщения: 3
- Зарегистрирован: 21.11.2013 14:55:09
Вернуться в Lazarus
Кто сейчас на конференции
Сейчас этот форум просматривают: Google [Bot], Yandex [Bot] и гости: 12
Provide feedback
Saved searches
Use saved searches to filter your results more quickly
Sign up
Трансферное обучение с предобученными моделями в Keras с Python
AI_Generated 06.05.2025
Суть трансферного обучения проста: взять модель, которая уже научилась решать одну задачу, и адаптировать её для решения другой, похожей задачи. Мозг человека работает по схожему принципу. Изучив. . .
Циклические зависимости в C#: методы управления и устранения
stackOverflow 06.05.2025
Если вы хоть раз работали над не самым тривиальным проектом на C#, то наверняка сталкивались с той ситуацией, когда компилятор вдруг начинает сыпать странными ошибками о невозможности разрешить. . .
Как перейти от Waterfall к Agile
EggHead 06.05.2025
Каскадная модель разработки Waterfall — классический пример того, как благие намерения превращаются в организационный кошмар. Изначально созданная для упорядочивания хаоса и внесения предсказуемости. . .
Оптимизация SQL запросов — Продвинутые техники
Codd 06.05.2025
Интересно наблюдать эволюцию подходов к оптимизации. Двадцать лет назад всё сводилось к нескольким простым правилам: «Избегайте SELECT *», «Используйте индексы», «Не джойните слишком много таблиц». . . .
Создание микросервисов с gRPC и Protobuf в C++
bytestream 06.05.2025
Монолитные приложения, которые ещё недавно считались стандартом индустрии, уступают место микросервисной архитектуре — подходу, при котором система разбивается на небольшие автономные сервисы, каждый. . .
Многопоточность и параллелизм в Python: потоки, процессы и гринлеты
py-thonny 06.05.2025
Параллелизм и конкурентность — две стороны многопоточной медали, которые постоянно путают даже бывалые разработчики.
Конкурентность (concurrency) — это когда ваша программа умеет жонглировать. . .
Распределенное обучение с TensorFlow и Python
AI_Generated 05.05.2025
В машинном обучении размер имеет значение. С ростом сложности моделей и объема данных одиночный процессор или даже мощная видеокарта уже не справляются с задачей обучения за разумное время. Когда. . .
CRUD API на C# и GraphQL
stackOverflow 05.05.2025
В бэкенд-разработке постоянно возникают новые технологии, призванные решить актуальные проблемы и упростить жизнь программистам. Одной из таких технологий стал GraphQL — язык запросов для API,. . .
Распознавание голоса и речи на C#
UnmanagedCoder 05.05.2025
Интеграция голосового управления в приложения на C# стала намного доступнее благодаря развитию специализированных библиотек и API. При этом многие разработчики до сих пор считают голосовое управление. . .
Реализация своих итераторов в C++
NullReferenced 05.05.2025
Итераторы в C++ — это абстракция, которая связывает весь экосистему Стандартной Библиотеки Шаблонов (STL) в единое целое, позволяя алгоритмам работать с разнородными структурами данных без знания их. . .
-
XML
-
Delphi
-
Кодировка символов
Добавляю кодировку в XML документ, но она игнорируется:
LDocument := NewXMLDocument;
LDocument.Active := True;
LDocument.Version := '1.0';
LDocument.Encoding := 'WINDOWS-1251';
…
LDocument.SaveToFile(ExtractFilePath(Application.ExeName)+'Reports\'+ xmlname +'.xml');
Создает:
<?xml version="1.0"?>
Версию проставляет в атрибут а кодировку игнорит. Как решить?
-
Вопрос задан
-
368 просмотров
2
комментария
Подписаться
1
Простой
2
комментария
Решения вопроса 1
@HemulGM Куратор тега Delphi
Delphi Developer, сис. админ
LDocument.Encoding := 'WINDOWS-1251';
Потому что эта строка меняет только текст в заголовке xml, поле. (док)
-
А, вот как… А как тогда получить в итоговом документе: <?xml version=»1.0″ encoding=»WINDOWS-1251″ ?>
-
freeeeez, тут и поменяет. Только кодировка файла остается по факту utf-8
-
Hemul GM, нет, не меняет, XML-файл создается <?xml version=»1.0″?>…. так. Кодировка файла мне без разницы, мне надо чтобы был аттрибут encoding=»WINDOWS-1251″
-
-
-
реально, работает, если пустой файл создать…
у меня похоже что то дальше по коду перезаписывает <?xml тег и убирает кодировку, буду разбираться спасибо -
Hemul GM, вот этот код если убрать то encoding подставляется в <?xml:
LDocument.XML.Text := XMLDoc.FormatXMLData(LDocument.XML.Text);//форматирование отступов и переносов
LDocument.Active := True;Но без него весь XML идет одной сплошной строкой….
-
Что бы форматировался текст в LDocument.Options -> отметить флажок doNodeAutoIndent
Пригласить эксперта
Ваш ответ на вопрос
Войдите, чтобы написать ответ
Похожие вопросы
-
Показать ещё
Загружается…
Минуточку внимания
Войдите на сайт
Чтобы задать вопрос и получить на него квалифицированный ответ.
Реклама
Здравствуйте, господа!
Честно говоря, не знаю, кому может пригодиться …
Мне надо было генерировать (для заказчика) и читать (от заказчика) XML в кодовой таблице Window-1251.
1. Опишем русскую кодировку в CPXML.Inc
Код: Выделить всё
XMLEnc EQUATE(STRING)
XMLEnc:UTF8 EQUATE('UTF-8')
XMLEnc:UTF16 EQUATE('UTF-16')
XMLEnc:ISO88591 EQUATE('ISO-8859-1')
XMLEnc:WIN1251 EQUATE('WINDOWS-1251')
2. И заставим выводить данные в windows-1251 (CpXML.clw)
DOMToXMLFile procedure(*Document doc, string path, <*CSTRING newLine>, UNSIGNED Format = Format:AS_IS)
Код: Выделить всё
ret BYTE
CODE
IF omitted(3)
!ret=DOMToXMLFile(doc,path,,Format,XMLEnc:UTF8)
ret=DOMToXMLFile(doc,path,,Format,XMLEnc:WIN1251)
ELSE
!ret=DOMToXMLFile(doc,path,newLine,Format,XMLEnc:UTF8)
ret=DOMToXMLFile(doc,path,newLine,Format,XMLEnc:WIN1251)
END
RETURN ret
3. После чего получим XML-файл (например, в Example\XMLParse) в кодировке Windows-1251, вполне отображаемый браузером. Но встаёт другая проблема — эти файлы не читаются кларионовским парсером (Шаблон ‘View XML File’ просто падает при загрузке). Ну что ж, тем хуже для парсера. Возьмём шестнадцатеричный редактор, найдём в модуле C60cpxml.dll текст ‘ISO-8859-1’, заменим на ‘WINDOWS-1251’ и добавим в конец ‘<0>’ .
4. Вопрос с документами в UTF-8 не рассматривается
—————————————
C уважением,
Юрий Философов,
Главный программист
Корпорация «Диполь», Саратов
E-mail yufil@tacis-dipol.ru (служ)
yufil@mail.ru (дом)
ICQ#75924439
(Добавление)
Когда-то мне пришлось более плотнее исследовать C6 XML Support. Сделал точно такие же изменения как Вы.
3. После чего получим XML-файл (например, в Example\XMLParse) в кодировке Windows-1251, вполне отображаемый браузером.
Когда получил этот результат — обрадовался. Но попробовал, используя их классы создать свой XML, и очень разочаровался. Оказывается, классы напрочь отказываются работать с русскими тегами.
Но встаёт другая проблема — эти файлы не читаются кларионовским парсером (Шаблон ‘View XML File’ просто падает при загрузке). Ну >что ж, тем хуже для парсера.
Может проблема в кодовой странице, о которой писал Сергей Артюшенков.
Возьмём шестнадцатеричный редактор, найдём в модуле C60cpxml.dll текст ‘ISO-8859-1’, заменим на ‘WINDOWS-1251’ и добавим в конец ‘<0>’ .
Я не понял, тогда в этом случае все O’K, что ли?
С уважением, Семен Попов
Когда получил этот результат — обрадовался. Но попробовал, используя их классы создать свой XML, и очень разочаровался. Оказывается, классы напрочь отказываются работать с русскими тегами.
Пофиксил. Теперь работают
Когда получил этот результат — обрадовался. Но попробовал, используя их классы создать свой XML, и очень разочаровался. Оказывается, классы напрочь отказываются работать с русскими тегами.
А за это отвечает процедура CheckXMLName из CpXML.clw . Можно поставить в первую строку Return(0) — и будут приниматься любые теги
—————————————
C уважением,
Юрий Философов
Спасибо, попробую.
С уважением, Семен Попов
Когда-то мне пришлось более плотнее исследовать C6 XML Support. Сделал точно такие же изменения как Вы.
Это естественно. Но сгенерированные файлы не читались через Support. Потратил время, чтобы понять причину и добить, как заставить их читаться. О чём и рассказал
Я не понял, тогда в этом случае все O’K, что ли?
По крайней мере, файлы, созданные обычным текстовым редактором или сформированные программой (в том числе без использования интерфейса) читаются, только и всего. Просто похоже, что используемая библиотека в принципе не поддерживает кодировок, отличных от буржуинских, а это самый простой путь заставить это делать…
… исправленные модули для CW6.1 на http://www.tacis-dipol.ru/fil/XML1251.zip
—————————————
C уважением,
Юрий Философов
Написал: ClaList(2)