que tienen un XML con el siguiente formato:Lectura valores distintos de XML usando 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>
¿Cómo retreive los números de cuenta únicos utilizando Xpath? es decir, que quieren obtener los valores de 1, 225 y 236.
Esto es lo que hice: (estoy 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;
Pero esto no devolvió nodos (AccountDetails. longitud = 0). Por favor, hágame saber lo que me falta aquí.
Gracias,
Pradeep
¿Es esa pieza parte de su código real? Al mirarlo, ni siquiera compilará. – TLama
He copiado eso; pero no corrigió los apóstrofes. Solo quería dar una idea de lo que hice ... – Pradeep
Para responder por qué está recibiendo 'IXMLDOMNodeList' la lista de longitud cero es simple. Es porque ha intentado solucionar el error sobre los caracteres '::' inválidos en 'previous-sibling ::' reemplazándolo con '/', pero esto significa que está comparando el valor con el nodo 'previous-sibling/.. 'qué está mal. Necesita usar 'previous-sibling' como parámetro (usando' :: ') devolviendo el nodo anterior, no como un valor de nodo constante. Para usar el eje XPath, debe usar la versión más nueva de MSXML, ya que la anterior no es compatible. – TLama