delphi - Reading distinct values from XML using XPath -
i have xml in following format:
<accounts> <account number="1" debitamount="1000" amount="2827561.95" /> <account number="225" debitamount="2000" amount="12312.00" /> <account number="236" debitamount="london" amount="457656.00" /> <account number="225" debitamount="london" amount="23462.40" /> <account number="236" debitamount="bangalore" amount="2345345.00" /> </accounts> how retreive unique account numbers using xpath? ie, want values 1, 225 , 236.
this did:(i'm using delphi 2007...)
const xmlstr = ' <accounts> <account number="1" debitamount="1000" amount="2827561.95" /> <account number="225" debitamount="2000" amount="12312.00" /> <account number="236" debitamount="london" amount="457656.00" /> <account number="225" debitamount="london" amount="23462.40" /> <account number="236" debitamount="bangalore" amount="2345345.00" /> </accounts>'; function getaccountnumbers:tlist; var xmldomdocument : ixmldomdocument; accounts : ixmldomnodelist; accountdetail :ixmldomnode; i:integer list :tlist begin result:=tlist.create; xmldomdocument:=codomdocument.create; xmldomdocument.loadxml(xmlstr); accounts:= xmldomdocument.selectnodes(''./accounts /account[not(@number=preceding-sibling/ account /@number)]'); := 0 accountdetails.length - 1 begin accountdetail := accountdetails.item[i]; //omitting "<>nil" checks... list.add(accountdetail.attributes.getnameditem('number').nodevalue; end; end; but returns no nodes(accountdetails.length=0). please let me know missing here.
thanks,
pradeep
it seems version of msxml delphi 2007 doesn't support xpath axis. if decide use following code, import either microsoft xml, v3.0 or microsoft xml, v6.0 type library first , try this:
unit unit1; interface uses windows, messages, sysutils, variants, classes, graphics, controls, forms, dialogs, stdctrls, msxml2_tlb; type tform1 = class(tform) button1: tbutton; procedure button1click(sender: tobject); private { private declarations } public { public declarations } end; var form1: tform1; implementation {$r *.dfm} const xmlstring = '<accounts>' + '<account number="1" debitamount="1000" amount="2827561.95"/>' + '<account number="225" debitamount="2000" amount="12312.00"/>' + '<account number="236" debitamount="london" amount="457656.00"/>' + '<account number="225" debitamount="london" amount="23462.40"/>' + '<account number="236" debitamount="bangalore" amount="2345345.00"/>' + '</accounts>'; type tintegerarray = array of integer; function getaccountnumbers(const axmlstring: string): tintegerarray; var i: integer; xmldomnodelist: ixmldomnodelist; xmldomdocument: ixmldomdocument3; begin xmldomdocument := codomdocument60.create; if assigned(xmldomdocument) , xmldomdocument.loadxml(axmlstring) begin xmldomnodelist := xmldomdocument.selectnodes('/accounts/account[not(@number=preceding-sibling::account/@number)]/@number'); setlength(result, xmldomnodelist.length); := 0 xmldomnodelist.length - 1 result[i] := xmldomnodelist.item[i].nodevalue; end; end; procedure tform1.button1click(sender: tobject); var s: string; i: integer; integerarray: tintegerarray; begin s := 'account numbers: '; integerarray := getaccountnumbers(xmlstring); := 0 length(integerarray) - 1 s := s + inttostr(integerarray[i]) + ', '; delete(s, length(s) - 1, 2); showmessage(s); end; end.
Comments
Post a Comment