¿Cómo analizo esta cadena XML en Delphi 2009?
Frecuentes
Visto 15,072 veces
1
Esta es la información que tiene la cadena XML.
<?xml version="1.0" encoding="UTF-8"?>
<string xmlns="http://tempuri.org/">
<statusInfo><vendorClaimID>BRADY12478018AETNA</vendorClaimID>
<statusID>0</statusID><statusDescription>Unvalidated</statusDescription>
</statusInfo></string>
Pero así es como entra. Tendrás que desplazarte hacia la derecha para verlo todo.
'<?xml version="1.0" encoding="utf-8"?>'#$D#$A'<string xmlns="http://tempuri.org/"><statusInfo><vendorClaimID>BRADY12478018AETNA</vendorClaimID><statusID>0</statusID><statusDescription>Unvalidated</statusDescription></statusInfo></string>'
Cargué la cadena en un XMLDoc, pero no sé cómo acceder fácilmente a los valores desde aquí.
var
doc: IXMLDocument;
doc := LoadXMLData(xmlString);
¡Gracias!
2 Respuestas
7
Puede usar XPath para extraer los valores de los nodos
Mira esta muestra
{$APPTYPE CONSOLE}
{$R *.res}
uses
MSXML,
SysUtils,
ActiveX,
ComObj;
Const
XMLStr=
'<?xml version="1.0" encoding="UTF-8"?> '+
'<string xmlns="http://tempuri.org/">'+
' <statusInfo>'+
' <vendorClaimID>BRADY12478018AETNA</vendorClaimID> '+
' <statusID>0</statusID><statusDescription>Unvalidated</statusDescription> '+
' </statusInfo>'+
'</string> ';
procedure Test;
Var
XMLDOMDocument : IXMLDOMDocument;
XMLDOMNode : IXMLDOMNode;
begin
XMLDOMDocument:=CoDOMDocument.Create;
XMLDOMDocument.loadXML(XmlStr);
XMLDOMNode := XMLDOMDocument.selectSingleNode('//string/statusInfo/vendorClaimID');
if XMLDOMNode<>nil then
Writeln(Format('vendorClaimID %s',[String(XMLDOMNode.Text)]));
XMLDOMNode := XMLDOMDocument.selectSingleNode('//string/statusInfo/statusID');
if XMLDOMNode<>nil then
Writeln(Format('statusID %s',[String(XMLDOMNode.Text)]));
XMLDOMNode := XMLDOMDocument.selectSingleNode('//string/statusInfo/statusDescription');
if XMLDOMNode<>nil then
Writeln(Format('statusDescription %s',[String(XMLDOMNode.Text)]));
end;
begin
try
CoInitialize(nil);
try
Test;
finally
CoUninitialize;
end;
except
on E:EOleException do
Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode]));
on E:Exception do
Writeln(E.Classname, ':', E.Message);
end;
Writeln('Press Enter to exit');
Readln;
end.
contestado el 23 de mayo de 12 a las 00:05
Puede usar XPath con IXMLDocument si su motor de proveedor interno está configurado en MSXML. - Rémy Lebeau
Genial, esto está funcionando con la cadena que ha proporcionado. ¿Tiene alguna idea de lo que puedo hacer cuando la cadena (respuesta) que obtengo se ve así? ' '#$D#$A'tempuri.org/…>' que '#$D#$A' parece estar tirando a la basura y estoy teniendo problemas para deshacerme de él. - Trevor
La cadena completa no se muestra después de ... pero espero que entiendas lo que está sucediendo. También lo agregué a mi pregunta principal. Gracias - Trevor
Ok, entonces primero debes decodificar tu XML, intenta usar el HTTPDecode
función de la unidad HTTPApp y luego analice la cadena de resultado con el método anterior o usando la respuesta de Remy. - RRUZ
Probé la función HTTPDecode pero todavía no leyó la cadena correctamente una vez que la cargué, no puedo encontrar ninguno de los nodos. :( - Trevor
4
Cada nodo en el XML se representará como un IXMLNode
en la IXMLDocument
, en la misma jerarquía que aparecen en el XML. Ayudaría si primero mira el XML con los nodos sangrados para que pueda ver la jerarquía más claramente:
<?xml version="1.0" encoding="UTF-8"?>
<string xmlns="http://tempuri.org/">
<statusInfo>
<vendorClaimID>BRADY12478018AETNA</vendorClaimID>
<statusID>0</statusID>
<statusDescription>Unvalidated</statusDescription>
</statusInfo>
</string>
Una vez que comprenda la jerarquía, puede escribir código para ella:
var
doc: IXMLDocument;
statusInfo: IXMLNode;
vendorClaimID: String;
statusID: Integer;
statusDescription: String;
begin
doc := LoadXMLData(xmlString);
statusInfo := doc.DocumentElement.ChildNodes['statusInfo'];
vendorClaimID := statusInfo.ChildNodes['vendorClaimID'].Text;
statusID := StrToInt(statusInfo.ChildNodes['statusID'].Text);
statusDescription := statusInfo.ChildNodes['statusDescription'].Text;
end;
Alternativamente:
var
doc: IXMLDocument;
statusInfo: IXMLNode;
vendorClaimID: String;
statusID: Integer;
statusDescription: String;
begin
doc := LoadXMLData(xmlString);
statusInfo := doc.DocumentElement.ChildNodes['statusInfo'];
vendorClaimID := VarToStr(statusInfo.ChildValues['vendorClaimID']);
statusID := StrToInt(VarToStr(statusInfo.ChildValues['statusID']));
statusDescription := VarToStr(statusInfo.ChildValues['statusDescription']);
end;
Si utiliza el asistente de vinculación de datos XML de Delphi, generará interfaces que analizarán el XML por usted:
var
doc: IXMLDocument;
statusInfo: IXMLstatusInfoType;
vendorClaimID: String;
statusID: Integer;
statusDescription: String;
begin
doc := LoadXMLData(xmlString);
statusInfo := Getstring(doc).statusInfo;
vendorClaimID := statusInfo.vendorClaimID;
statusID := statusInfo.statusID;
statusDescription := statusInfo.statusDescription;
end;
contestado el 23 de mayo de 12 a las 00:05
Gracias por la ayuda, mi cadena xml estaba codificada con html, por lo que nada funcionaba. - Trevor
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas xml delphi delphi-2009 xmldocument or haz tu propia pregunta.
¿Tiene esto algún sentido o esta cadena es incluso algo que se puede analizar? - Trevor
Hizo una edición de la cadena xml, espero que sea más fácil de entender ahora. - Trevor
Gracias por su ayuda... Bueno, recibo esta cadena en respuesta a una llamada de servicio web. Tal vez esta pequeña información de la documentación del servicio web ayude... "Recibir la respuesta En la mayoría de los casos, la respuesta para cada llamada de servicio web se devuelve como XML o texto formateado. Por ejemplo, la URL anterior devolvería:tempuri.org/… Fondo Nacional de Beneficios</Name><ApexPayerID>13162</ApexPayerID></Payer>< ... "" - Trevor
El formato anterior es el aspecto de mi cadena original, pero después de escribirlo en un archivo xml y tomar el texto, se parece más a lo que ve en mi revisión actual. - Trevor