บางครั้งเราจำเป็นต้องใช้ XML เป็นแอพพลิเคชั่นขนาดเล็กบางอย่างเช่นการบันทึกบันทึกหรือการกำหนดค่าบางอย่างในเวลานี้เราต้องอ่านและเขียน XML โดยตรงประสิทธิภาพเป็นสิ่งสำคัญอันดับแรก กล่อง Delphi มีไฟล์ XML อ่านและเขียนโดยตรง (ตัวอย่างและรหัส) และฟังก์ชั่นหลักคือฟังก์ชั่นสองฟังก์ชั่นต่อไปนี้ (หนึ่งอ่านและหนึ่งเขียน):
{--------------------------------------------- ----- Node @Param: ชื่อแอตทริบิวต์ XMLARATTRNAME ในโหนด @Param: ตัวคั่นของพารามิเตอร์ของโหนด dep, ค่าเริ่มต้นคือ@return: ค่าของโหนดแรก ----------------------------- ค่า ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ----------------------------------------------- ----------------------------------------------- } functiongetxmlnodevalue (strentityEngineFile: string; xmlnodepath: string; constxmlattrname: string = '' constdep: char = '.'): string; varxmldocument: ixmldocument; node: ixmlnode; xmlnodelist // XML Node Path Xmlnodelist: = tStringList.create; xmlnodelist.delimiter: = dep; xmlnodelist.delimitedText: = xmlnodepath; urlcount: = xmlnodelist.count; (strentityEngineFile); xmldocument.active: = true; trynode: = xmldocument.documentelement; ถ้า (node.nodename = xmlnodelist [0]) nodebegin // scan node fori: = 1tourlcount-1dobeginif (node <> node) (node.childnodes, xmlnodelist [i]) ElseBreak; end; ถ้า (node = nil) thenBeginResult: = ''; endelSebegin // ตัดสินว่าจะใช้แอตทริบิวต์หรือเนื้อหาโหนดถ้า node.textelseresult: = node.attributeNodes.nodes [xmlattrName] .nodevalue; end; endelSebeGinResult: = ''; end; exceptresult: = 'ข้อผิดพลาด'; สิ้นสุด; ------------------------------------------------------ ----- Node@Param: ชื่อแอตทริบิวต์ในโหนด XMLATTRNAME @Param: ตัวคั่นของพารามิเตอร์ของโหนด dep, ค่าเริ่มต้นคือ@return: ไม่มีการดำเนินการสำเร็จ ----------------------- ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ----------------------------------------------- -------------------------------------------} functionsetxmlnodevalue ( StrentityEngineFile: String; Xmlnodepath: String; constxMlattrName: String = ''; ConstValue: String = '' constdep: char = '.'): boolean; varxmldocument: ixmldocument; node: ixmlnode; xmlnodelist: tstrings; : จำนวนเต็ม; เริ่มต้น // XML Node Path Xmlnodelist: = tStringList.create; xmlnodelist.delimiter: = dep; xmlnodelist.delimitedText: = xmlnodepath; urlcount: = xmlnodelist.count; ; xmldocument.loadfromfile (strentityEngineFile); xmldocument.active: = true; trynode: = xmldocument.documentelement; ถ้า (node.nodename = xmlnodelist [0]) node node (node) Thennode: = getNodeFromixmlnodelist (node.childnodes, xmlnodelist [i]) elsebreak; end; ถ้า (โหนด <> nil) nilbeginif (trim (xmlattrname) = '') node.text: = valueelsenode.attributeNodes.nodes.nodes : = value; xmldocument.savetofile (strentityEngineFile); end; end; ผลลัพธ์: = true; exceptresult: = false; end; xmldocument.active: = false; end;แต่มีปัญหากับฟังก์ชั่นสองฟังก์ชั่นข้างต้น: สามารถค้นหาบันทึกแรกได้โดยชื่อโหนดและชื่อแอตทริบิวต์เท่านั้น ตัวอย่างเช่น: หากคุณต้องการใช้งานไฟล์ XML คล้ายกับต่อไปนี้มีหลายโหนดและชื่อแอตทริบิวต์ที่มีชื่อแอตทริบิวต์เดียวกัน แต่ค่าของแอตทริบิวต์จะแตกต่างกัน โจมตี.
<colourname = NormalAtTributed = 100Green = 125BLUE = 150/> <OLOURNAME = GOODATTRIBIDED = 150GREEN = 175BLUE = 200/> <COLOURNAME = ยอดเยี่ยมตกลงความสุขที่ยิ่งใหญ่ที่สุดสำหรับโปรแกรมเมอร์คือการทำด้วยตัวเอง มาแก้ไขฟังก์ชั่นทั้งสองนี้กันเถอะ มีการเพิ่มพารามิเตอร์สองตัวลงในฟังก์ชันดั้งเดิม:
{--------------------------------------------- ------------------------------------------- ความสนุก/มืออาชีพ : getxmlNodeSpecialValue@วันที่: 2004.12.11@param: xmlfilexml ไฟล์@param: xmlnodepath โหนด @param: xmlarattrname ชื่อแอตทริบิวต์ในโหนด @Param: ชื่อแอตทริบิวต์ในโหนดที่จะค้นหาโดย xmlspecialName @param: xmlspecialValue ค่าที่สอดคล้องกับแอตทริบิวต์บางอย่างในโหนดที่จะค้นหา @Param: ตัวคั่นพารามิเตอร์ของ DEP คุณลักษณะบางอย่าง --- -------------------------------------------- ------ -------------------------} functiongetxmlNodeSpecialValue (strentityEngineFile: string; xmlnodepath: string; constxmlattrname: string = '' constxmlspecialname : string = ''; constxmlspecialValue: string = '' constdep: char = '.'): string; varxmldocument: ixmldocument; โหนด: ixmlnode; xmlnodelist: tstrings; : = tStringList.create; xmlnodelist.delimiter: = dep; xmlnodelist.delimitedText: = xmlnodepath; urlcount: = xmlnodelist.count; // xml วัตถุ Xmldocument: = txmldocument.create active: = true; [i]); endelsebreak; end; ถ้า (node = nil) thenbeginResult: = ''; endelsebegin // ตัดสินว่าจะใช้แอตทริบิวต์หรือเนื้อหาโหนดถ้า (trim (xmlarattrname) = '') node.attributeNodes.nodes [xmlspecialName] .nodevalue; // ฉันไม่ต้องการประกาศตัวแปรชั่วคราวที่นี่ดังนั้นฉันจึงใช้ผลลัพธ์เพื่อเปรียบเทียบซึ่งอาจเป็นอันตรายที่ซ่อนอยู่ ในขณะที่ (ผลลัพธ์ <> xmlspecialValue)) dobeginNode: = node.nextsibling; สิ้นสุด; ผลลัพธ์: = node.attributeNodes.nodes [xmlattrName] .nodevalue; end; end; endelSebeGinResult: = ''; end; exceptresult: = 'ข้อผิดพลาด'; สิ้นสุด; xmldocument.active: = false;ฟังก์ชั่นเขียน
{--------------------------------------------- ----- .11@Param: XMLFilexml file@param: XMLNODEPATH Node @Param: XMLARATTRNAME ชื่อแอตทริบิวต์ในโหนด @Param: ชื่อแอตทริบิวต์ในโหนดที่จะค้นหาโดย xmlspecialName @param: xmlspecialValue ค่าที่สอดคล้องกับคุณสมบัติในโหนดที่จะค้นหาโดย @param: ตัวคั่นพารามิเตอร์ dep node, ค่าเริ่มต้นคือ @return: เป็นการดำเนินการ ประสบความสำเร็จหรือไม่ --- -------------------------------------------------------- ------ -------------------------------------------------------------------------} : string = ''; constxmlspecialname: string = '' constxmlspecialValue: string = '' constdep: char = '.'): boolean; varxmldocument: ixmldocument; node: ixmlnode; ; cmpvalue: สตริง; เริ่มต้น // xml โหนดพา ธ xmlnodelist: = tstringlist.create; xmlnodelist.delimiter: = dep; xmlnodelist.delimitedText: = xmlnodepath; urlcount: = xmlnodelist.count nil); xmldocument.loadfromfile (strentityEngineFile); xmldocument.active: = true; trynode: = xmldocument.documentelement; ถ้า (node.nodename = xmlnodelist [0] nil) thennode: = getNodeFromixMlnodelist (node.childnodes, xmlnodelist [i]) elsebreak; end; ถ้า (โหนด <> nil) thenbegin {ถ้า (trim (xmlattrname) = ') xmlattrname] .nodevalue: = value;} if (trim (xmlattrname) = '') thennode.text: = valueelSebeGincMpValue: = node.attributeNodes.nodes [xmlspecialName] .nodevalue; Nextsibling; ค่า; end; xmldocument