В прошлом году я провел много времени, пытаясь разработать веб-приложение на базе XML с Delphi. Первоначальная идея была прекрасной, но в результате все было очень просты. Одна из причин заключается в том, что реализация привязки данных между XML и объектом слишком хлопотна (другая часть заключается в том, что он не знаком с XSLT, и для его изучения требуется много времени).
Я всегда использовал привязку данных XML, предоставленную Delphi. Конечно, это очень удобно, когда он будет создан. Но проблема в том, что всегда будут некоторые изменения в процессе разработки программы. Очень хлопотно.
Поэтому, когда я думаю об объективации набора данных, я сразу думаю, что я также могу использовать RTTI для реализации xml repistence of Object - фактически, реализация SOAP, начинающаяся с Delphi6, предназначена для использования RTTI для реализации преобразования объекта в данные SOAP ( то есть XML). Очевидно, я уже был очень поздно. Работайте несколько лет назад, и я сразу же попросил его о его исходном коде. Lexlib - это библиотека со многими функциями, которая немного похожа на базовую библиотеку классов .NET (конечно, не так большой ^o ^). Поскольку мне нужна только эта часть, не нужно использовать всю эту библиотеку так много проблем. выполнить:
TMXMLPERSISTENT = Class (TOBCET) Процедура открытого класса LOADOBJFROMXL (ANODE: IXMLNODE; AOBJ: TPERSISTENT); , tkset, tkwchar, tklstring, tkwstring, tkint64]; {tmxmlpersistent} Начните, если ( AOBJ - это tmdatasetProxy) тогда (AOBJ как tmdatasetProxy) .loadFromxml (анод) иначе начинается plist: = tmproplist.create (aobj); ; Anode.childnodes [WideString (pinfo^.name)], tmpobj как tpersistent); Pinfo^. Ppropinfo; pinfo: = plist.props [i]; (tmpobj - это tpersistent)), затем SaveObjtoxml (anode.addchild (WideString (pinfo^.name)), tmpobj как tpersistent); ^ .Name) .Text: = getPropValue (AOBJ, Pinfo^.Эта реализация должна быть очень проста. В основном есть три части (структура нагрузки и сохранения аналогична):
Во -первых, специальная обработка сделана TmdatasetProxy и поручена этому классу обработать саму реализацию. Полем
Второе состоит в том, чтобы рекурсивно обрабатывать класс, и, конечно, поддерживает только класс, полученный из TperSistent.
В -третьих, общее поле просто преобразуется в строку и сохраняется, который заимствует фильтр lexlib, и только обрабатывает типы данных, которые можно просто преобразовать в строку, фильтраруя эти типы, которые могут вызвать ошибки конверсии.
Для TMProplist, используемого в приведенном выше коде, см. Реализацию в «Использование RTTI Delphi для реализации наборов данных».
Ниже приведена стойкость набора данных XML, реализованную с помощью tmdatasetproxy. Он устраняет проблему с использованием TclientDataset, и использует метод записи с узлом. Хотя XML -файл, сгенерированный таким образом, будет немного больше, преимущества также очевидны, особенно XML, который я планирую использовать в веб -приложениях, и записанные в узле будет намного удобнее при использовании XSLT.
Процедура tmdatasetproxy.loadfromxml (анод: ixmlnode); var i, j: integer; Childnodes [j]; [WideString (Pinfo^ В то время как Foreach Do Prow: = anode.addchild ('row'); Затем prow.addchild (VideString (Pinfo^.Ниже приведена простая демонстрация, которая включает в себя набор данных XML. Обратите внимание, что при нагрузке член сотрудника подключен к Adodataset2, который подключен к таблице, содержащей эти поля. После завершения нагрузки, содержимое этих полей в таблице работников будет скопировано в эту таблицу.
Tdemocompany = Class (Tpersistent) Tform1.saveclick (отправитель: Tobject); ; DEMO.MOULYEE: = NIL; Попробуйте Xmldocument1.Active: = true; Текст: = InttoStr (demo.code); Subtems.add (demo.employee.lastname); .Free;
Наконец, я могу попрощаться с неприятным привязкой данных XML, и мне не нужно писать XSD в будущем - хотя есть полезные инструменты, лучше сэкономить некоторые проблемы.