Ho un XML nel seguente formato:Lettura valori distinti da XML utilizzando XPath
<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>
Come faccio a prelevare i numeri di conto unici utilizzando XPath? vale a dire, voglio ottenere i valori 1, 225 e 236.
Questo è quello che ho fatto: (sto usando 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)]');
for i := 0 to accountdetails.length - 1 do begin
accountdetail := accountdetails.item[i];
//omitting the "<>nil" checks...
list.Add(accountdetail.attributes.getNamedItem('Number').Nodevalue;
end;
end;
Ma questo non ha prodotto alcun nodi (accountdetails. lunghezza = 0). Per favore fatemi sapere cosa mi manca qui.
Grazie,
Pradeep
Questa parte è parte del tuo codice reale? Guardandolo, non verrà nemmeno compilato. – TLama
L'ho copiato; ma non ha corretto gli apostrofi. Volevo solo dare un'idea di cosa ho fatto ... – Pradeep
Rispondere perché stai ricevendo la lista di lunghezza zero di 'IXMLDOMNodeList' è semplice. È perché hai provato a risolvere l'errore relativo ai caratteri '::' non validi in 'previous-sibling ::' sostituendolo con '/' ma questo significherebbe che stai confrontando il valore con il nodo 'precedente-fratello/.. 'Cosa c'è che non va. È necessario utilizzare 'previous-sibling' come parametro (usando' :: ') restituendo il nodo precedente, non come valore di nodo costante. Per utilizzare l'asse XPath è necessario utilizzare la versione più recente di MSXML poiché quella precedente non lo supporta. – TLama