Иногда нам нужно использовать XML только в качестве небольших приложений, таких как простое сохранение журналов или некоторые конфигурации. В поле Delphi есть прямое чтение и запись XML -файла (примеры и код), а его основная функция - это следующие две функции (одна чтение и одна запись):
{------------------------------------------------- ------------------------------ FUN/PRO: GETXMLNODEVALUE@Дата: 2004.12.11@param: xmlfilexml 文件 @param: xmlnodepath Узел @Param: xmlarattrname Имя атрибута в узле. @Param: разделитель параметров узла DEP, по умолчанию.@Return: значение первого узла ----------------------------------------- ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ -------------------------------------------------- -------------------------------------------------- } functiongetxmlnodevalue (strentityEnginefile: string; xmlnodepath: string; constxmlattrname: string = ''; constdep: char = '.'): string; varxmldocument: ixmldocument; node: ixmlnode; xmlnodelist: tStrings; iteger; // xmfl Node Path xmlnodelist: = tstringlist.create; xmlnodelist.delimiter: = dep; xmlnodelist.delimitedtext: = xmlnodepath; urlcount: = xmlnodelist.count; // xml object xmlcument: = txmldocument.crate.crount.crount. (StrentityEngineFile); xmldocument.Active: = true; tryNode: = xmldocument.documentelement; if (node.nodeName = xmlnodelist [0]), затем begin // scan node fori: = 1tourlcount-1dobeginif (node <> nil) thennode: = getnodefromix (node.childnodes, xmlnodelist [i]) else breake; end; if (node = nil) then beginresult: = ''; endelsebegin // Судить, принимать ли атрибуты или содержимое узла if (trim (xmlattrname) = '') then -srosult: = = node.texteleleseresult: = node.attributeNodes.nodes [xmlattrname] .nodevalue; end; endelsebeginresult: = ''; end; exceptresult: = 'error'; end; xmldocument.active: = false; end; {--- ------------------------------------------------------ -------------------------- FUN/PRO: SETXMLNODEVALUE@Дата: 2004.12.11@param: xmlfilexml file@param: xmlnodepath Node@Param: имя атрибута в узле Xmlattrname. @Param: разделитель параметров узла DEP, по умолчанию.@Return: нет операции. ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ -------------------------------------------------- -----------------------------------------------} functionSmlnoDevalue ( StrentityEngineFile: string; xmlnodepath: String; constxmlattrname: String = ''; contvalue: String = ''; constdep: char = '.'): boolean; varxmldocument: ixmldocument; node: ixmlnode; xmlnodelist: tshrings; i: integer; : Integer; begin // xml node path xmlnodelist: = tstringlist.create; xmlnodelist.delimiter: = dep; xmlnodelist.delimitedtext: = xmlnodepath; urlcount: = xmlnodelist.count; // xmlnodepath; urlcount: = xmlnodelist.count; // xmlnodepath; ; xmldocument.loadfromfile (strentityEngineFile); xmldocument.active: = trynode: = xmldocument.documentelement; if (node.nodename = xmlnodelist [0]) thenbegin // scan node for ThenNode: = getNodeFromixMlNodelist (node.childnodes, xmlnodelist [i]) else; end; if (node <> nil) thenbeginif (trim (xmlattrname) = '') thennode.text: = valueElsenode.attribtenes.nodes [xmlattrname] : = value; xmldocument.savetofile (strentityEnginefile); end; end; result: = true; exceptResult: = false; end; xmldocument.active: = false; end;Но есть проблема с двумя вышеуказанными функциями: она может найти первую запись только по имени узла и имени атрибута. Например: если вы хотите использовать XML -файл, аналогичный следующему, существует несколько узлов и имен атрибутов с одинаковыми именами атрибутов, но значения атрибутов различны, и вышеуказанные функции чтения и записи будут продолжаться ударять.
<colourname = normalattributed = 100green = 125blue = 150/> <colourname = goodattributed = 150green = 175blue = 200/> <colourname = recavityattributed = 0green = 0blue = 255/>Хорошо, наибольшее удовольствие для программистов - сделать это самостоятельно. Давайте пересмотрим эти две функции. Два параметра добавляются к исходной функции:
{------------------------------------------------- ----------------------------------------------- Fun/Pro : Getxmlnodepcecialvalue@Дата: 2004.12.11@param: xmlfilexml file@param: xmlnodepath node @param: xmlarattrname Имя атрибута в узле. @Param: Имя атрибута в узле, которое будет искать, xmlSpecialName @param: xmlspecialvalue Значение, соответствующее определенному атрибуту в узле, который будет искать @param: dep node Разделитель параметров, по умолчанию. @Return: значение Определенный атрибут --- ------------------------------------------------ ------ -------------------------} functiongetxmlnodespecialValue (StrentityEngineFile: String; xmlnodepath: String; constxmlattrname: string = ''; constxmlSpecialName : String = ''; : = TStringList.create; xmlnodelist.delimiter: = dep; xmlnodelist.delimitedtext: = xmlnodepath; urlcount: = xmlnodelist.count; // xml object xmldocument: = txmldocument.create (nil); xmldocument.glilefument.EngilElmillemlile. Active: = true; [i]); node.attributenodes.nodes [xmlspecialname] .nodevalue; // Я не хочу объявлять здесь временную переменную, поэтому я использую результат для сравнения, которые могут быть скрытыми опасностями. while (result <> xmlspecialvalue)) dobeginnode: = node.nextibling; end; result: = node.attributeNodes.nodes [xmlattrname] .nodevalue; end; end; end; endelsebeginresult: = ''; end; exceptresult: = 'error'; end; xmldocument.active: = false; end;Написать функции
{------------------------------------------------- ----------------------------------------- FUN/PRO: SETXMLNODESPECIALVALUE@Дата: 2004.12 .11@param: xmlfilexml file@param: xmlnodepath node @param: xmlarattrname Имя атрибута в узле. @Param: Имя атрибута в узле, которое будет искать, xmlSpecialName @param: xmlspecialvalue Значение, соответствующее свойству в узле, которое будет искать по @param: DEP -параметр раздел. успешно или нет --- -------------------------------------------------- ------ -----------------------------} functionStxmlnodepecialValue (StrentityEngineFile: String; xmlnodepath: String; constxmlattrname: string = ''; constvalue : String = ''; ; nil); xmldocument.loadfromfile (strentityEngineFile); xmldocument.active: = true; tryNode: = xmldocument.documentelement; if (node.nodeName = xmlnodelist [0]) thenbegin // scan node for nil) thennode: = getNodeFromixMlNodeList (node.childnodes, xmlnodelist [i]) else; end; if (node <> nil) then begin {if (xmlattrname) = '') thennode.text: = valueElsenode.attributenodes.nodes [ xmlattrname] .nodevalue: = value;} if (trim (xmlattrname) = '') thennode.text: = valueelsebegincmpvalue: = node.attributenodes.nodes [xmlspecialname] .nodevalue; Nextsibling; значение; end; xmldocument.