Delphi XML: obtener un valor del nodo principal
Frecuentes
Visto 3,039 veces
2
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!
1 Respuestas
3
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 xml delphi or haz tu propia pregunta.
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. - PatemanHola, 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>> - Gary
¿Es válido para usar?
<tag attr="value" /></tag>
? - TLamaform
nodo es el nodo raíz. tienes que usar código comoxml.documentElement.Attributes['penId']
para obtener sus atributos - teran