XMLは、単にログや一部の構成を保存するなど、XMLを直接読み取り、書き込む必要がある場合にのみXMLを使用する必要があります。 Delphiボックスには、直接読み取りおよび書き込みXMLファイル(例とコード)があり、そのコア関数は次の2つの関数(1つの読み取りと1つの書き込み)です。
{----------------------------------------------------------- ----------------------------- fun/pro:getxmlnodevalue@日付:2004.12.11@param:xmlfilexml@param:xmlnodepath node @param:xmlarattrname属性名は、ノード値を直接取得する場合、このパラメーターは無視できます。 @Param:DEPノードのパラメーターの区切り文字、デフォルトは。@return:最初のノードの値---------------------------------------------------------------------- -------------------------------------------------------------- -------------------------------------------------------------- -------------------------------------------------------------- -------------------------------------------------------------- -------------------------------------------------------------- } functiongetXmlnodevalue(StrentityEngineFile:string; xmlnodepath:string; constxmlattrname:string = ''; constdep:char = '。'):string; varxmldocument:ixmldocument; ixmldocument; node:node:node:ixmlnode; xmlnodelist; xmlnode; // XMLノードパスXMLNODELIST:= TSTRINGLIST.CREATE; XMLNODELIST.DELIMITER:= DEP; XMLNODELIST.DELIMITEDTEXT:= XMLNODEPATH; URLCOUNT:= XMLNODELIST.COUNT; // XMLオブジェクト(StrentityEngineFile); xmldocument.active:= true; trynode:= xmldocument.documentelement; if(node.nodename = xmlnodelist [0])thenbegin //ノードfori:= 1tourlcount-1dobeginif(node <> nil) (node.childnodes、xmlnodelist [i])elsebreak; end; if(node = nil)thenbeginResult:= ''; endelseBegin //属性を取得するかどうかを判断node.textelseresult:= 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:操作は成功しません------------------------------------------- -------------------------------------------------------------- -------------------------------------------------------------- -------------------------------------------------------------- -------------------------------------------------------------- ---------------------------------------------} functionsetxmlnodevalue( StrentityEngineFile:String; xmlnodepath:string; constxmlattrname:string = ''; constvalue:string = ''; constdep:char = '。'):boolean; varxmldocument:ixmldocument; node:node:ixmlnode; xmlnodelist:tstring; i:integergount :integer; begin // xmlノードパスxmlnodelist:= tstringlist.create; xmlnodelist.delimiter:= dep; xmlnodelist.delimitedtext:= xmlnodepath; urlcount:= xmlnodelist.count; ; xmldocument.loadfromfile(strentityenginefile); xmldocument.active:= true; trynode:= xmldocument.documentelement; if(node.nodename = xmlnodelist [0])thenbegin // scan node fori:= 1tourlcount-1dobeginif(node) thennode:= getNodeFromIXMlNodelist(node.childnodes、xmlnodelist [i])elsebreak; end; if(node <> nil)thenbeginif(trim(xmlattrname)= '')thennode.text:= valueElsEnode.AttributEnames [Xmlattrname] .nodevalue := value; xmldocument.savetofile(strentityenginefile); end; end; result:= true; exceptresult:= false; end; xmldocument.active:= false; end; end;ただし、上記の2つの関数には問題があります。ノード名と属性名で最初のレコードのみを見つけることができます。たとえば、以下と同様のXMLファイルを操作する場合、同じ属性名を持つ複数のノードと属性名がありますが、属性の値は異なり、上記の読み取りおよび書き込み関数は続きますストライク。
<colourname = normalattributed = 100green = 125blue = 150/> <colourname = goodattributed = 150green = 175blue = 200/> <colourname = colourname = qualtenceattributed = 0green = 0blue = 255/>わかりました、プログラマーにとって最大の喜びは自分でそれをすることです。これら2つの機能を修正しましょう。元の関数に2つのパラメーターが追加されます。
{----------------------------------------------------------- --------------------------------------------------- fun/pro :getXmlnodespecialvalue@日付:2004.12.11@param:xmlfilexml file@param:xmlnodepath node:xmlarattrname属性名を直接取得すると、このパラメーターは無視できます。 @Param:XMLSPECIALNAMEで検索されるノードの属性名@Param:XMLSpecialValue @Paramを検索するノードの特定の属性に対応する値:DEPノードのパラメーターセパレーター、デフォルトは。特定の属性-------------------------------------------------------------------------------------------------------- ------ ----------------------} functionGetXmlnodespecialValue(strentityEngineFile:string; xmlnodepath:string; constxmlattrname:string = ''; constxmlspeacialname :string = ''; constxmlspecialvalue:string = ''; constdep:char = '):string; varxmldocument; node:ixmlnode; xmlnodelist:i:integer; urlcount:integer; // xmlnode path xmlnodelist := TSTRINGLIST.CREATE; XMLNODELIST.DELIMITER:= DEP; XMLNODELIST.DELIMITEDTEXT:= XMLNODEPATH; URLCOUNT:= XMLNODELIST.COUNT; // XMLオブジェクトXMLDocument:= TXMLDOCUMTION(TXMLDOCUMTION 。 Active:= true; tryNode:= xmldocument.documentelement; if(node.nodename = xmlnodelist [0])thenbegin // scan node fori:= 1tourlcount-1dobeginif(node <> nil)thenbeginnode:= getnodefromixmlnodelist [i]); endelsebreak; end; if(node = nil)thenbeginult: ''; endelsebegin //属性またはノードコンテンツを取得するかどうかを判断しますnode.attributenodes.nodes [xmlspecialname] .nodevalue; //ここで一時的な変数を宣言したくないので、結果を使用して、隠された危険になる可能性があります。 while(result <> xmlspecialvalue))dobeginnode:= node.nextsibling; end; result:= node.attributenodes.nodes [xmlattrname] .nodevalue; end; end; end; endelsebeginResult:= ''; end; exceptresult:= 'error'; end; xmldocument.active:= false; end; end; end;機能を書きます
{----------------------------------------------------------- ---------------------------------------- fun/pro:setXmlnodespecialvalue@date:2004.12 .11@param:xmlfilexml file@param:xmlnodepath node @param:xmlarattrname属性名はノード値を取得する場合、このパラメーターは無視できます。 @Param:XMLSPECIALNAMEで検索するノードの属性名@Param:XMLSpecialValue @Paramが検索するノードのプロパティに対応する値:DEPノードパラメーターセパレーター、デフォルトは。 @return:操作は操作です成功かどうか---------------------------------------------------------------------------------------------- ------ ---------------------} functionsetxmlnodespecialValue(strentityEngineFile:string; xmlnodepath:string; constxmlattrname:string = ''; constvalue :string = ''; constxmlspecialname:string = ''; constxmlspecialValue:string = ''; constdep:char = '。'):boolean; varxmldocument; node:ixmlnode; xmlnodelist:tstring; ; cmpvalue:string; begin // xmlノードパスxmlnodelist:= tstringlist.create; xmlnodelist.delimiter:= dep; xmlnodelist.delimitedtext:= xmlnodepath; urlcount:= xmlnodeList.count; nil); xmldocument.loadfromfile(strentityenginefile); xmldocument.active:= true; tryNode:= xmldocument.documentelement; if(node.nodename = xmlnodelist [0])thenbegin // scan node fori:= nodeginif(nodeginif( nil)thenNode:= getNodeFromixMlNodelist(node.childnodes、xmlnodelist [i])elsebreak; end; if(node <> nil)thenbegin {if(trim(xmlattrname)= '')thennode.text:= valueElsenode.attributenodes.nodes [ xmlattrname] .nodevalue:= value;} if(trim(xmlattrname)= '')thennode.text:= node.attributenodes.nodes [xmlspecialname] .nodevalue:nodevalue。 Nextsibling; value; end; xmldocument。