Terkadang, kita hanya perlu menggunakan XML sebagai beberapa aplikasi kecil, seperti hanya menyimpan log atau beberapa konfigurasi. Kotak Delphi memiliki file XML Baca dan Tulis Langsung (contoh dan kode), dan fungsi intinya adalah dua fungsi berikut (satu baca dan satu tulis):
{------------------------------------------------- ------------------------------ Menyenangkan/Pro: getxmlnodevalue@Tanggal: 2004.12.11@param: xmlfilexml 文件 @param: xmlnodepath Node @param: nama atribut xmlarattrname di node. @Param: Pembatas parameter simpul DEP, default adalah.@Return: Nilai simpul pertama ------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- } functionGetXmlnodEvalue (strentityEngineFile: string; xmlnodepath: string; constxmlattrname: string = ''; constdep: char = '.'): string; varxmldocument: ixmldocument; node: ixmlnode; xmlnodelist: ixmldocument; node: ixmlnode; xmlnodelist: ixmldocument; node: ixmlnode; xmlnodelist: tstring; node: ixmlnode; xmlnodelist: tstring: tstring; node: ixmlnode; xmlnodelist: tstring; // XML Path Node Xmlnodelist: = tStringList.create; xmlnodelist.delimiter: = dep; xmlnodelist.delimitedText: = xmlnodepath; urlcount: = xmlnodelist.count; // xml object xmldoid. (StrentityEngineFile); xmldocument.active: = true; trynode: = xmldocument.documentElement; if (node.nodename = xmlnodelist [0]) thenbegin // scan node fori: = 1tourcount-1dobeginif (noode) nil) nil nil): nil) nil nil: nil) nil nil: nil) nil nil: nil) nil: nil) nil nil: nil) nil nil: nil) nil nil: nil) nil nil: nil nil) (node.childnodes, xmlnodelist [i]) elsebreak; end; if (node = nil) thenbeginresult: = ''; endelsebegin // menilai apakah akan mengambil atribut atau konten node jika (trim (xmlattrname) = '') kemudian result: = = node.textelseresult: = node.attributeNodes.nodes [xmlattrname] .nodevalue; end; endelsebeginresult: = ''; end; exceptresult: = 'error'; end; xmldocument.active: = falt; end; end; {{------------------------------------------------------------------- -------------------------------------------------- ------------------------------ Menyenangkan/Pro: setxmlnodevalue@Tanggal: 2004.12.11@param: xmlfilexml file@param: xmlnodepath node@param: Nama atribut di node XMLATtrName. @Param: Pembatas parameter simpul DEP, default adalah.@Return: tidak ada operasi yang berhasil --------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -----------------------------------------------} FunctionsetXmlnodevalue ( strentityEngineFile: string; xmlnodepath: string; constxmlattrname: string = ''; constvalue: string = ''; constdep: char = '.'): boolean; varxmldocument: ixmldocument; node: ixmlnode; xmlnodelist: tstrings: node: ixmlnode; xmlnodelist: tstrings; : Integer; begin // xml node path xmlnodelist: = tStringlist.create; xmlnodelist.delimiter: = dep; xmlnodelist.delimitedText: = xmlnodepath; urlcount: = xmlnodelist.count;///xmlOclom; ; xmldocument.loadFromFile (strentityEngineFile); xmldocument.active: = true; trynode: = xmldocument.documentElement; if (node.nodename = xmlnodelist [0]) node // node node) node foni: = 1tourlcount-1dobegin // node node) node: = 1tourlcount-1dobegin // scan node foni: = 1tourlcount-1dobegin//node node node: = 1tourlcount-1dobegin//scan node node: = 1tourlcount-1dobeGin ThenNode: = getnodefromixmlnodelist (node.childnodes, xmlnodelist [i]) elsebreak; end; if (node <> nil) thenbeginif (trim (xmlattrname) = '') thennode.text: = valueelsenode.attributodes.nodes.nodes.nodes.nodes.nodes.nodes.nodes.nodes.nodes.nodes.nodes.nodes.nodes.nodes.nodes.nodes.nodes.nodes.nodes.nodes.nodes.nodes.nodes.nodes : = nilai; xmldocument.savetofile (strentityEngineFile); end; end; hasil: = true; exceptresult: = false; end; xmldocument.active: = false; end;Tetapi ada masalah dengan dua fungsi di atas: ia hanya dapat menemukan catatan pertama dengan nama simpul dan nama atribut. Misalnya: Jika Anda ingin mengoperasikan file XML yang mirip dengan yang berikut, ada beberapa node dan nama atribut dengan nama atribut yang sama, tetapi nilai -nilai atributnya berbeda, dan fungsi baca dan tulis di atas akan berlangsung memukul.
<colourname = NormalTributed = 100Green = 125Blue = 150/> <colourname = goodAttributed = 150Green = 175Blue = 200/> <colourname = sangat baik -baik saja = 0green = 0blue = 255/>Oke, kesenangan terbesar bagi programmer adalah melakukannya sendiri. Mari kita revisi dua fungsi ini. Dua parameter ditambahkan ke fungsi asli:
{------------------------------------------------- ----------------------------------------------- Fun/Pro : Getxmlnodespecialvalue@tanggal: 2004.12.11@param: xmlfilexml file@param: xmlnodepath node @param: xmlarattrname Nama atribut di node. @Param: Nama atribut di node yang akan dicari oleh xmlspecialname @param: xmlspecialValue nilai yang sesuai dengan atribut tertentu di node yang akan dicari untuk @param: pemisah parameter simpul DEP, default adalah. @Return: Nilai The Nilai dari Atribut tertentu --- ------------------------------------------------ ------ -------------------------} functionGetXmLnOdespecialValue (strentityEngineFile: string; xmlnodepath: string; constxmlattrname: string = ''; constxmlspecialname : String = ''; : = TStringList.create; xmlnodelist.delimiter: = dep; xmlnodelist.delimitedText: = xmlnodepath; urlcount: = xmlnodelist.count; // xml ObjoDOcument: = txmlDocument.create (nil); Aktif: = trynode: = xmldocument.documentElement; if (node.nodename = xmlnodelist [0]) thenbegin // scan node fori: = 1tourlcount-1dobeginif (node <> nil) thenbeginnode: = getnodefromixm [i]); endelsebreak; end; if (node = nil) thenbeginresult: = ''; endelsebegin // menilai apakah akan mengambil atribut atau konten node jika (trim (xmlarattrname) = '') ThenResult: = node.textelsebeginResult: = = = = node.attributeNodes.nodes [xmlspecialname] .nodevalue; // Saya tidak ingin menyatakan variabel sementara di sini, jadi saya menggunakan hasil untuk membandingkan, yang mungkin menjadi bahaya tersembunyi. while (hasil <> xmlspecialValue)) dobeginnode: = node.NextSibling; end; hasil: = node.attributeNodes.nodes [xmlattrname] .nodevalue; end; end; end; endelsebeginresult: = ''; end; exceptresult: = 'error'; end; xmldocument.active: = false; end; end;Tulis fungsi
{------------------------------------------------- ----------------------------------------- Menyenangkan/Pro: SetxmlnodespecialValue@Tanggal: 2004.12 .11@param: xmlfilexml file@param: xmlnodepath node @param: xmlaratTrname Nama atribut di node. @Param: Nama atribut di node yang akan dicari oleh xmlspecialname @param: xmlspecialValue nilai yang sesuai dengan properti di node yang akan dicari oleh @param: DEP Node parameter pemisah, default adalah @return: is the Operation berhasil atau tidak --- --------------------------------------------- ------ -------------------------} functionsetxmlnodespecialValue (strentityEngineFile: string; xmlnodepath: string; constxmlattrname: string = ''; constvalue : String = ''; ; CmpValue: string; begin // xml node path xmlnodelist: = tStringlist.create; xmlnodelist.delimiter: = dep; xmlnodelist.delimitedText: = xmlnodepath; urlcount: = xmlnodelist.count.count;/xmlnodepath; Urlcount: = xmlnodelist.count.count;/cloat/coat;/coat/coat/coat; coat.coUdor;/lldaTum; nil); xmldocument.loadFromFile (strentityEngineFile); xmldocument.active: = true; trynode: = xmldocument.documentElement; if (node.nodename = xmlnodelist [0]) NODE // scan node fORI: = 1TOURTOURCOUNT-1DOUT-1DOUT-1DOUT-1DOUT-1DOUP (NODE-1 NODE (= 1TOURCOUNT-1) nil) thennode: = getNodefromixMlnodelist (node.childnodes, xmlnodelist [i]) elsebreak; end; if (node <> nil) thenbegin {if (trim (xmlattrname) = '') stheode.text: = valueelsenode.attribute) = '') stheode.text: = valueelsenode.attribute) = '') stheode. xmLattrname] .nodevalue: = value;} if (trim (xmLattrname) = '') thennode.text: = valueelsebegmpvalue: = node.attributeNodes.nodes orthevalname. NextSibling; while (node. Nodename = '#comment') dobeginnode: = node.nextSibling; end; cmpValue: = node.attributeNodes.nodes [xmlspecialname] .nodevalue; end; node.attributenodes.nodes nilai; end; xmldocument.