Delphi XML: obtener un valor del nodo principal

Soy nuevo en el uso de XML en Delphi y he usado las preguntas ya publicadas para averiguar la mayor parte de lo que necesito saber (¡gracias!). Sin embargo... tengo dificultades para obtener un valor de datos de la parte superior del archivo XML emitido por uno de nuestros proveedores.

La parte superior del archivo XML se muestra a continuación:

<?xml version="1.0" encoding="utf-8"?>
<form billId="1004" penId="ABCDE" appName="Report Sheet" penSerialNo="AJX-AAT-AGK-B4" >
<question id="1" reference="site_name" value="Acme Inc" /></question>
<question id="2" reference="site_address" value="London" /></question>
<question id="3" reference="TQM_job_no" value="AB1234567" /></question>
<question id="4" reference="TQM_site_no" value="XX999" /></question>

¿Cómo puedo obtener el penid y penSerialNo ¿valores?

Como referencia, estoy usando el código a continuación, obtenido de otra publicación en el sitio, para atravesar el XML y obtener los valores del pregunta nodos:

for i:= 0 to XMLDocument1.DocumentElement.ChildNodes.Count - 1 do
   begin
       Node:= XMLDocument1.DocumentElement.ChildNodes[I];
 if Node.NodeName = 'question' then
  begin
   if Node.HasAttribute('value') then
    VALUEvar:= Node.Attributes[value'];
    // do something with VALUEvar which is a string
      end;
end;
end;

Realmente agradecería cualquier ayuda que pudiera brindarse... ¡gracias de antemano!

preguntado el 03 de mayo de 12 a las 11:05

Simplemente cambia 'question' a 'form' y 'value' a 'penId'. ¿Has probado eso? No es la solución más óptima, pero me pregunto si lo intentaste. -

Hola, sí lo intenté, sin éxito. Agregué la línea de código: if Node.NodeName = 'form' then showmessage('Hello World'); pero este mensaje nunca aparece, por lo que no entiendo cómo puedo obtener los valores de los atributos que necesito>> -

¿Es válido para usar? <tag attr="value" /></tag> ? -

form nodo es el nodo raíz. tienes que usar código como xml.documentElement.Attributes['penId'] para obtener sus atributos -

1 Respuestas

Como form es su nodo raíz, puede usar algo como esto:

uses
  XMLDoc, XMLIntf;

procedure TForm1.Button1Click(Sender: TObject);
var
  XMLDocument: IXMLDocument;
begin
  XMLDocument := LoadXMLDocument('c:\YourFile.xml');
  if XMLDocument.DocumentElement.HasAttribute('penId') then
    ShowMessage(VarToStr(XMLDocument.DocumentElement.Attributes['penId']));
  if XMLDocument.DocumentElement.HasAttribute('penSerialNo') then
    ShowMessage(VarToStr(XMLDocument.DocumentElement.Attributes['penSerialNo']));
end;

De todos modos, su documento no es válido. No puede usar etiquetas adjuntas como:

<tag attr="value"/></tag>

Cualquiera de los dos usos:

<tag attr="value"/>

or

<tag attr="value"></tag>

contestado el 03 de mayo de 12 a las 13:05

Gracias por la respuesta sobre el nodo raíz, es muy apreciado y funciona exactamente como se requiere. No estoy creando el XML, así que volví al proveedor sobre las etiquetas. - Gary

Los proveedores que envían productos que producen XML malformado, desearía que fuera raro, pero no lo es. - Warren P

He visto horrores de aplicaciones que producen XML con cadenas vanila. Sí, está ahí fuera. Esa muestra XML tiene algunos problemas, supongo. - Corredor

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.