Parfois, nous n'avons qu'à utiliser XML comme quelques petites applications, telles que les journaux d'enregistrement ou les configurations. La boîte Delphi a un fichier XML à lire et à écrire directement (exemples et code), et sa fonction principale est les deux fonctions suivantes (une lecture et une écriture):
{------------------------------------------------- ------------------------------ Fun / Pro: getXmlNodevalue @ Date: 2004.12.11@param: xmlfilexml 文件 @param: xmlNodepath Nœud @param: xmlarAtTrName Nom de l'attribut dans le nœud. @Param: le délimiteur des paramètres du nœud DEP, par défaut est. @ Return: la valeur du premier nœud ------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ------------------------------------------------ - - ------------------------------------------------ - - } functiongetxmlnodevalue (StrentityEngineFile: String; xmlNodePath: String; constxmlattrname: string = ''; constdep: char = '.'): string; varXMlDocument: ixmlDocument; node; ixmlnode; xmlNodeList: tStrings; i: Integer; UrlCount: INTERG // chemin de nœud xml xmlNodeList: = tStringList.create; xmlNodelist.deliter: = dep; xmlNodeList.demitedText: = xmlNodePath; UrlCount: = xmlNodelist.Count; // Xml Object XMLDocument: = TxMlDoduMit (StrentityEngineFile); xmldocument.active: = true; tryNode: = xmlDocument.DocumentElement; if (node.NodeName = xmlNodeList [0]) thenbegin // Node nœud fori: = 1TourlCount-1DobeginIf (Node <> nil) the (node.childnodes, xmlNodeList [i]) elsebreak; end; if (node = nil) thenbeginResult: = ''; EndelSebegin // Node.TextelsSereSult: = node.atTrributeNodes.nodes [xmlattrname] .NodEvalue; end; EndelSebeginResult: = ''; end; exceptreSult: = 'error'; end; xmldocument.active: = false; end; end; {--- error -------------------------------------------------- ------------------------------ Fun / Pro: SetxmlNodevalue @ Date: 2004.12.11@param: fichier xmlfilexml @ param: xmlNodepath Node @ param: le nom d'attribut dans le nœud xmlattrname. @Param: le délimiteur des paramètres du nœud DEP, par défaut est. @ Retour: aucune opération n'est réussie --------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ------------------------------------------------ - - -----------------------------------------------} FonctionSetxMlNodevalue ( StrentityEngineFile: String; xmlNodePath: String; constxmlatTrName: string = ''; constvalue: string = ''; constdep: char = '.'): booléen; varxmlDocument: ixmlDocument; node: ixmlNode; xmlNodeList: tsstrings; i: Integer; urlCount : INTEGER; Begin // PATH NODE XML XMLNODELIST: = TSTRINGLIST.CREATE; XMLNODELIST.DELIMITER: = DEP; XMLNODELIST.DelimitedText: = XMLNODEPATH; UrlCount: = xmlNodeList.Count; // Xml Object XMLDocument: = TxMlDoCument.Count; ; xmlDocument.LoadFromFile (StrentityEngineFile); xmlDocument.Active: = true; tryNode: = xmlDocument.DocumentElement; if (node.NodeName = xmlNodeList [0]) the thennode: = getNodeFromIxMlNodeList (node.childnodes, xmlNodelist [i]) elsebreak; end; if (node <> nil) thenbeginif (trim (xmlattrname) = '') the : = valeur; xmlDocument.savetofile (StrentityEngineFile); end; end; résultat: = true; exceptreult: = false; end; xmldocument.active: = false; end;Mais il y a un problème avec les deux fonctions ci-dessus: il ne peut trouver que le premier enregistrement par nom de nœud et nom d'attribut. Par exemple: si vous souhaitez utiliser un fichier XML similaire à ce qui suit, il existe plusieurs nœuds et noms d'attribut avec les mêmes noms d'attribut, mais les valeurs des attributs sont différentes, et les fonctions de lecture et d'écriture ci-dessus continueront grève.
<Colourname = normalAttributed = 100Green = 125Blue = 150 /> <Colourname = GoodAttributed = 150Green = 175Blue = 200 /> <Colourname = ExcellentAttributed = 0Green = 0Blue = 255 />OK, le plus grand plaisir pour les programmeurs est de le faire vous-même. Révitons ces deux fonctions. Deux paramètres sont ajoutés à la fonction d'origine:
{------------------------------------------------- ----------------------------------------------- Fun / Pro : GetXmlNoDEspecialValue @ Date: 2004.12.11@param: fichier xmlfilexml @ param: xmlNodePath node @param: xmlarAttrname Nom d'attribut dans le nœud. @Param: le nom d'attribut dans le nœud à rechercher par xmlSpecialName @param: xmlspecialValue La valeur correspondant à un certain attribut dans le nœud à rechercher pour @param: le séparateur de paramètre du nœud de DEP est. @ Return: la valeur de la valeur de un certain attribut --- -------------------------------------------- ------ -------------------------} functionGetXMlNoDESpecialValue (StrentityEngineFile: String; XmlNodePath: String; constxmlattrname: string = ''; constxmlSpecialName : String = ''; : = TStringList.create; xmlNodeList.deliter: = dep; xmlNodeList.DelimitedText: = xmlNodePath; UrlCount: = xmlNoDelist.Count; // Xml Object XMLDocument: = txmldocument.create (nil); xmldocument.loadFromFile (StrentityEnglefile); xMlDocument. Actif: = true; trynode: = xmlDocument.DocumentElement; if (node.NodeName = xmlNodeList [0]) the [i]); EndelSebreak; end; if (node = nil) thenbeginResult: = ''; EndelSebegin // node.attributeNodes.nodes [xmlSpecialName] .NodEvalue; // Je ne veux pas déclarer une variable temporaire ici, donc j'utilise le résultat pour comparer, qui peut être des dangers cachés. while (Résultat <> xmlSpecialValue)) dobeginnode: = node.nextsibling; end; Résultat: = node.attributeNodes.nodes [xmlattrname] .Nodevalue; end; end; end; EndelsebeginResult: = ''; end; exceptreult: = 'error'; end; xmldocument.active: = false; end;Des fonctions d'écriture
{------------------------------------------------- ----------------------------------- .11 @ param: xmlfilexml fichier @ param: xmlNodePath node @param: xmlarAttrname Nom d'attribut dans le nœud. @Param: le nom d'attribut dans le nœud à rechercher par XMLSpecialName @param: xmlsSpecialValue La valeur correspondant à une propriété dans le nœud à rechercher par @param: le séparateur de paramètre du nœud DEP, par défaut est. @ Return: l'opération est l'opération réussi ou non --- -------------------------------------------- ------ -------------------------} functionSetXMlNoDESpecialValue (StrentityEngineFile: String; XmlNodePath: String; constxmlattrname: string = ''; constvalue : String = ''; ; CMPValue: String; begin // PATH NODE XML XMLNODELIST: = TSTRINGLIST.CREATE; XMLNODELIST.DELIMITER: = DEP; XMLNODELIST.DelimitedTex nil); xmlDocument.LoadFromFile (StrentityEngineFile); xmlDocument.Active: = true; tryNode: = xmlDocument.DocumentElement; if (node.NodeName = xmlNodelist [0]) puisBegin // Node de scan fori: = 1TourlCount-1DobeginIf (Node <> Scan Fori: = 1TourlCount-1DobeginIf (Node <> nil) thennode: = getNodeFromIxMlNodeList (node.childnodes, xmlNodelist [i]) elsebreak; end; if (node <> nil) thenbegin {if (Trim (xmlattrname) = '') thennode.text: = valueLSenode.atTTrutenode.Nodes [ xmlattrname] .NodEvalue: = value;} if (Trim (xmlatTrName) = '') theNnode.Text: = valueLSeBegincmpValue: = node.atTrributeNodes.Nodes [xmlSpecialName] .NodEvalue). NextSibling; while (node. NodeName = '# comment') dobeginnode: = node.nextsibling; end; cmpValue: = node.attributeNodes.nodes [xmlSpecialName]. Valeur; end; XMLDocument.