Às vezes, precisamos apenas usar o XML como alguns aplicativos pequenos, como simplesmente salvar logs ou algumas configurações. A caixa Delphi possui um arquivo XML de leitura e gravação direto (exemplos e código), e sua função principal são as duas funções a seguir (uma leitura e uma de gravação):
{------------------------------------------------- ------------------------------ FUN/PRO: getxmlnodEvalue@Data: 2004.12.11@param: xmlfilexml 文件 @param: xmlnodepath Node @param: XMLARATTRNAME Nome do atributo no nó. @Param: o delimitador dos parâmetros do nó DEP, padrão é.@Return: O valor do primeiro nó --------------------------- -------------------------------------------------------- -------------------------------------------------------- -------------------------------------------------------- --------------------------------------------------- --------------------------------------------------- } functionGetxMlNodEvalue (StrentityEngineFile: String; xmlnodepath: String; constxmlattrname: String = ''; constDep: char = ' // xml nó caminho xmlnodelist: = tstringList.create; xmlnodelist.delimiter: = dep; xmlnodelist.delimitedText: = xmlnodepath; urlCount: = xmlnodelel.count; (strentityEnginefile); xmldocument.Active: = true; tryNode: = xmldocument.documentElement; if (node.nodename = xmlnodelist [0]) thenbegin // scan thennode: = 1TourlCount-1DobEGinif (node <> nil) (node.childnodes, xmlnodelist [i]) elsebreak; end; if (node = nil) thenbeginResult: = ''; endelsebegin // julga se deve receber atributos ou conteúdo do nó se (TRIM (xmlattrname) = '') thenResult: = = = node.textelseResult: = node.attributenodes.nodes [xmlattrname] .NodEvalue; end; endelsebeginResult: = ''; end; ExceptSult: = 'Error'; end; xmldocument.Active: = false; end; end; -------------------------------------------------------- ------------------------------ FUN/PRO: SetxmlnodEvalue@Data: 2004.12.11@param: xmlfilexml arquivo@param: xmlnodepath Node@param: o nome do atributo no nó xmlattrname. @Param: o delimitador dos parâmetros do nó DEP, padrão é.@Return: Nenhuma operação é bem-sucedida --------------------------- -------------------------------------------------------- -------------------------------------------------------- -------------------------------------------------------- --------------------------------------------------- ------------------------------------------- strentityEngineFile: string; xmlnodepath: string; constxmlattrname: string = ''; constValue: string = ''; constDep: char = '.'): boolean; varxmldocument: ixmldocument; node: ixmlnode; xmlnodelist: tStrings; : Inteiro; Iniciar // Caminho do Nó XML Xmlnodelist: = tStringList.create; xmlnodelist.delimiter: = dep; xmlnodelist.delimitedText: = xmlnodePath; urlcount: = xmlnodelist.count; // xml object Xml; ; xmldocument.loadFromFile (strentityEnginefile); xmldocument.active: = true; tryNode: = xmldocument.documentElement; if (node.nodename = xmlnodelist [0]) thenbegin // scan node: = 1TourlCount-1DObin (0]) thenbegin // scan node: = 1Tourlcount-1DObin (0]) thennode: = getNodeFromixMlNodelist (Node.ChildNodes, Xmlnodelist [i]) elsebreak; end; if (node <> nil) thenbeginif (Trim (xmlattrname) = '') thennode.Text: = valueLeNode.AtTrodes.Modes) ='node.Node.TextNode.AtTrAnodes.Nodes) [thennode.Node.TextNode.AtTrodes.Nodes) [thennode.Node.TextNode.AtTrodes.nodes) : = value; xmldocument.SaveTofile (strentityEnginefile); end; end; resultado: = true; excepTResult: = false; end; xmldocument.active: = false; end;Mas há um problema com as duas funções acima: ele só pode encontrar o primeiro registro pelo nome do nó e o nome do atributo. Por exemplo: se você deseja operar um arquivo XML semelhante ao seguinte, existem vários nós e nomes de atributos com os mesmos nomes de atributos, mas os valores dos atributos são diferentes, e as funções de leitura e gravação acima continuarão batida.
<Colourname = NormalAttribued = 100Green = 125Blue = 150/> <Colourname = Goodattribued = 150Green = 175Blue = 200/> <Colourname = ExcelLAttribued = 0Green = 0Blue = 255/>OK, o maior prazer para os programadores é fazer isso sozinho. Vamos revisar essas duas funções. Dois parâmetros são adicionados à função original:
{------------------------------------------------- ------------------------------------------------- Fun/Pro : GetxmlnodespecialValue@Data: 2004.12.11@param: xmlfilexml arquivo@param: xmlnodepath node @param: xmlarattrname Nome do nó. @Param: o nome do atributo no nó a ser pesquisado por xmlspecialName @param: xmlspecialValue o valor correspondente a um determinado atributo no nó a ser pesquisado para @param: dep node separador de parâmetros, padrão é. @Retornar: o valor de Um certo atributo --- -------------------------------------------- ------ -------------------------} functionGetxMlNodEsPepecialValue (StrentityEngineFile: String; Xmlnodepath: String; constxmlattrname: String = ''; constxmlSpecialName : String = ''; : = TstringList.create; xmlnodelist.delimiter: = dep; xmlnodelist.delimitedText: = xmlnodepath; urlCount: = xmlnodelist.Count; // Xml Object Xmlocument: = txmldocument.crete (nil); Ativo: = true; [i]); Node.attributenodes.nodes [xmlSpecialName] .NodEvalue; // Não quero declarar uma variável temporária aqui, então uso o resultado para comparar, o que pode ser um perigo oculto. while (resultado <> xmlspecialValue)) DOBEGINNODE: = Node.NextSibling; end; resultado: = node.attributenodes.nodes [xmlattrname] .nodEvalue; end; end; end; endelsebeginResult: = ''; end; excepTResult: = 'error'; end; xmldocument.active: = false; end; end;Escreva funções
{------------------------------------------------- ----------------------------- .11@param: xmlfilexml arquivo@param: xmlnodepath node @param: xmlarattrname Nome do atributo no nó. @Param: o nome do atributo no nó a ser pesquisado por xmlspecialName @param: xmlspecialValue o valor correspondente a uma propriedade no nó a ser pesquisado por @param: dep nó parâmetro separador, padrão é. @Return: é a operação bem-sucedido ou não --- -------------------------------------------- ------ ---------------------------} funçõesTXMLNODESPSpecialValue (StrentityEngineFile: String; Xmlnodepath: String; constxmlattrname: String = ''; ConstValue : String = ''; ; CmpValue: string; BEGIN // XML NODE PATH XMLNODelist: = tStringList.create; xmlnodelist.delimiter: = dep; xmlnodelist.delimitedText: = xmlnodepath; UrtCount: = xmlnodelist.count; nil); xmldocument.loadFromFile (strentityEnginefile); xmldocument.active: = true; tryNode: = xmldocument.documentElement; if (node.nodename = xmlnodelist [0]) thenben // scan node: = 1Gourlc nil) thennode: = getNodeFromixMlNodelist (node.childnodes, xmlnodelist [i]) elsebreak; end; if (node <> nil) thenBegin {if (TRIM (xmlattrname) = ') thennode.Text: = valueLeShode.attrutenodes.nodenodes.nodes.nodEESTEn. xmlattrname] .NodEvalue: = value;} if (TRIM (xmlattrname) = '') thennode.text: = valueelsebegincmpvalue: = node.attributenodes.nodes [xmlspecialName] .NodEvalue; NextSibling; valor; final; xmldocument.