¿Cómo analizo esta cadena XML en Delphi 2009?

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/">&lt;statusInfo&gt;&lt;vendorClaimID&gt;BRADY12478018AETNA&lt;/vendorClaimID&gt;&lt;statusID&gt;0&lt;/statusID&gt;&lt;statusDescription&gt;Unvalidated&lt;/statusDescription&gt;&lt;/statusInfo&gt;</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!

preguntado el 22 de mayo de 12 a las 19:05

¿Tiene esto algún sentido o esta cadena es incluso algo que se puede analizar? -

Hizo una edición de la cadena xml, espero que sea más fácil de entender ahora. -

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>< ... "" -

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. -

2 Respuestas

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

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 or haz tu propia pregunta.