Manchmal müssen wir XML nur als kleine Anwendungen verwenden, z. B. nur einige Konfigurationen speichern. Das Delphi -Feld verfügt über eine direkte Lesen und Schreiben von XML -Datei (Beispiele und Code), und seine Kernfunktion ist die folgenden zwei Funktionen (eine gelesene und ein Schreiben):
{--------------------------------------------- ---------------------------------- Fun/Pro: GetxMlnoDeValue@Date: 2004.12.11@param: xmlFilexml 文件 @param: xmlnodepath Node @Param: XMLARATTRNAME -Attributname im Knoten. @Param: Der Trennzeichen der Parameter des DEP-Knotens, Standard ist.@Return: Der Wert des ersten Knoten -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------- ---------------------------------------------- } functionGetXmlnoDeValue (StrentityEngineFile: String; xmlnodepath: String; constXmlattrName: String = ''; Constdep: char = '.'): String; varxMldocument: ixmldocument; Node: ixmlnode; // XML -Knotenpfad xmlnodelist: = tstringlist.create; xmlnodelist.delimiter: = dep; xmlnodelist.delimitedText: = xmlnodepath; urlCount: = xmlnodelist.Count; (StrentityEngineFile); xmldocument.active: = true; trynode: = xmldocument (node.childnodes, xmlnodelist [i]) elsebreak; end; if (node = nil) thenbeginResult: = ''; EndelSebin // beurteilen, ob Attribute oder Knoteninhalte in den Inhalt von (trim (xmlattrname)) thenResult: = node.TextelSeresult: = node.attributenodes.node [xmlattrName] .nodeValue; end; endelSebeginResult: = ''; end; excePtresult: = 'error'; Ende; xmldocument -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------- Fun/Pro: setxMlnoDeValue@Date: 2004.12.11@param: xmlFilexML-Datei@Param: xmlnodepath Node@Param: Der Attributname im XMLATTRNAME -Knoten. @Param: Der Trennzeichen der Parameter des DEP-Knoten -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------- -----------------------------------------------} FunktionsetxMlnodeValue ( StrentityEngineFile: String; xmlnodepath: String; constXmlattrName: String = ''; Constvalue: String = ''; constDep: char = '.'): boolean; varxmldocument: ixmldocument; node: ixmlnode; : Integer; begin // xml Knotenpfad Xmlnodelist: = tstringlist.create; xmlnodelist.delimiter: = dep; xmlnodelist.DelimitedText: = xmlnodepath; urlCount: = xmlnodelist.Count; // xml) xml -Objekt xml. . thenNode: = getNodefromixMlnodelist (node.childnodes, xmlnodelist [i]) elsebreak; end; if (node <> nil) thenbeginif (trim (xmlattrname) = ') thennode.text: = valuellSenode.attributenodes.node.nodes.node. : = value; xmldocumentMit den oben genannten zwei Funktionen gibt es jedoch ein Problem: Es kann nur den ersten Datensatz per Knotennamen und Attributname finden. Zum Beispiel: Wenn Sie eine XML -Datei wie folgt bedienen möchten, gibt es mehrere Knoten und Attributnamen mit denselben Attributnamen schlagen.
<colourName = NormalAttributed = 100Green = 125Blue = 150/> <colourName = Goodattribut = 150Green = 175Blue = 200/> <colourname = exciplibuted = 0Green = 0Blue = 255/>OK, das größte Vergnügen für Programmierer ist es, es selbst zu tun. Lassen Sie uns diese beiden Funktionen überarbeiten. Der ursprünglichen Funktion werden zwei Parameter hinzugefügt:
{--------------------------------------------- ----------------------------------------------- Fun/Pro : GetxMlnodespecialValue@Datum: 2004.12.11@param: xmlFilexML -Datei@Param: xmlnodepath node @param: xmlarattrname Attributname im Knoten, wenn Sie den Knotenwert direkt nehmen, kann dieser Parameter ignoriert werden. @Param: Der Attributname im Knoten, nach dem xmlSpecialName @Param: xmlspecialValue der Wert, der einem bestimmten Attribut entspricht, nach der Suche nach @Param: DEP -Knoten -Parameterabscheider, Standard, @return: Der Wert von @param: DEP -Knoten, durchsucht. Ein bestimmtes Attribut --- -------------------------------------------- ------ -----------------------------} FORMANCETXMLNODEPECIALVALUE (STRENTITYEGINEFILE: STRING; XMLNODEPATH: STRING; constXmlattrName: String = ''; constxMlSpecialName : String = ''; : = Tstringlist.create; xmlnodelist.delimiter: = dep; xmlnodelist.delimitedText: = xmlnodepath; urlCount: = xmlnodelist.count; // xml -Objekt xmldocument: = txmldocument.create (nil) (nilegin) (nilegin) (nile); xmldocument. Aktiv: = true; [i]); node.attributenodes.nodes [xmlspecialName] .nodeValue; // Ich möchte hier keine vorübergehende Variable deklarieren, daher verwende ich das Ergebnis, um zu vergleichen, was verborgene Gefahren sein kann. while (result <> xmlSpecialValue) DOBELNODE: = Node.Nextsibling; Ende; Ergebnis: = node.attributenodes.noden [xmlattrName] .nodeValue; Ende; Ende; End; EndelSebeginResult: = ''; End; excePtresult: = 'error'; end; xmldocument.active: = false; end;Funktionen schreiben
{--------------------------------------------- ------------------------------------------------- Fun/Pro: setxmlnodespecialValue@Datum: 2004.12 .11@param: xmlFilexML -Datei@Param: xmlnodepath node @param: xmlarattrname Attributname im Knoten. @Param: Der Attributname im Knoten, nach dem xmlSpecialName @Param: xmlspecialValue der Wert einer Eigenschaft im Knoten, nach der von @Param: DEP -Knoten -Parametertrenntrennzeichen gesucht werden soll, durchsucht werden soll. Erfolgreich oder nicht --- ------------------------------------------------------------------------------------------------------------------------------------------------------------------ ------ --------------------- : String = ''; ; nil); xmldocument nil) thenNode: = getNodefromixMlnodelist (node.childnodes, xmlnodelist [i]) elsebreak; end; if (nil <> nil) thenbegin {if (trim (xmlattrname) = '') thennode.text: = valueSsenode.attributenoden.noden [attriboden.noden.noden xmlattrName] .nodeValue: = value;} if (trim (xmlattrName) = '') thennode.text: = valueLsebegincmpvalue: = node.attributenoden.nodes [xmlspecialname] .nodevalue; Nextsibling; Wert; Ende; xmldocument.