Ich habe eine XML in folgendem Format:Lese verschiedene Werte von XML mit 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>
Wie retreive ich die einzigartigen Kontonummern mit XPath? dh ich will 1 die Werte erhalten, 225 und 236.
Dies ist, was ich getan habe: (Ich verwende 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;
Aber diese lieferte keine Knoten (accountdetails. Länge = 0). Bitte lassen Sie mich wissen, was ich hier vermisse.
Danke,
Pradeep
Ist dieses Teil Teil Ihres echten Codes? Wenn man es anschaut, wird es nicht einmal kompilieren. – TLama
Ich habe das kopiert; aber hat die Apostrophe nicht korrigiert. Ich wollte nur eine Vorstellung davon geben, was ich getan habe ... – Pradeep
Um zu beantworten, warum Sie 'IXMLDOMNodeList' bekommen, ist die Null-Länge-Liste einfach. Das liegt daran, dass Sie versucht haben, den Fehler um die ungültigen '::' Zeichen von 'previous-sibling ::' zu umgehen, indem Sie ihn durch '/' ersetzen, aber das würde bedeuten, dass Sie den Wert mit dem Knoten 'previous-sibling 'vergleichen/.. 'was ist falsch. Sie müssen das 'vorhergehende Geschwister 'als Parameter verwenden (indem Sie' '' '' '' '' '' ') verwenden und den vorherigen Knoten nicht als konstanten Knotenwert ausgeben. Um die XPath-Achse zu verwenden, müssen Sie die neuere Version von MSXML verwenden, da die alte Version dies nicht unterstützt. – TLama