PDA

Ver la Versión Completa : Problema al generar fichero XML usando TXMLDocument


newtron
15-02-2016, 16:43:02
Hola a tod@s.

Como algunos de vosotros sabéis para el tema de la creación del nuevo fichero SEPA con XML estoy usando TXMLDocument pero me encuentro un problema.

Tengo que crear un nodo con atributos de forma que consiga este resultado:

<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.008.001.02" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<CstmrDrctDbtInitn>
para esto hago lo siguiente:

XMLMain := XMLInit.AddChild('Document');
XMLMain.Attributes['xmlns'] := 'urn:iso:std:iso:20022:tech:xsd:pain.008.001.02';
XMLMain.Attributes['xmlns:xsi'] := 'http://www.w3.org/2001/XMLSchema-instance';

Esto lo hago en mi pc y funciona perfectamente, el problema es que en el pc del primer cliente que lo prueba, con la misma instrucción me generar lo siguiente:

<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.008.001.02" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<CstmrDrctDbtInitn xmlns="">
Si os fijáis, en la segunda línea se añade el texto xmlns="" siendo el programa el mismo, lo único es que se ejecuta en otro pc.

¿Es posible que haya algo en la configuración de windows que provoque este comportamiento?

Gracias y un saludo

Osorio
15-02-2016, 19:15:17
A mi me paso algo parecido y finalmente me quedó de esta manera:

procedure TFCamion.Button1Click(Sender: TObject);
const
DestPath = 'ExampleDelphitoxml.xml';
var
Document: IXMLDocument;
NodeElement, NodoBody, NodoDatos: IXMLNode;
begin
Document := TXMLDocument.Create(nil);
Document.Options := [doNodeAutoIndent];
Document.Active := True;
Document.Version := '1.0';
Document.Encoding:= 'UTF-8';

Document.DocumentElement := Document.CreateNode('soapenv:Envelope', ntElement, '');
Document.DocumentElement.Attributes['xmlns:soapenv'] := 'http://schemas.xmlsoap.org/soap/envelope/';
Document.DocumentElement.Attributes['xmlns:rem'] := 'http://remote.ipaserver.puerta.gpc.com/';


NodeElement := Document.DocumentElement.AddChild('soapenv:Header');

NodoBody := Document.DocumentElement.AddChild('soapenv:Body');
NodeElement := NodoBody.AddChild('rem:getTakeWeightTask');

nododatos:= NodeElement.AddChild ('placa','',false,-1 );
nododatos.Text:= 'R29' ;


nododatos:= NodeElement.AddChild('Terminal','',false, -1);//Notese aqui que el addchild lleva otros parametros (false por ejemplo para que omita el prefijo

nododatos.Text:= 'SPC';
Document.SaveToFile(DestPath);
memo1.Lines.Clear;
memo1.Lines.LoadFromFile(DestPath);
DeleteFile(DestPath);
end;


Disculpen que mi pc extrañamente no me permitió colocar en codigo delphi. Si alguien colabora gracias desde ya.

Saludos.

orodriguezca
15-02-2016, 20:06:24
Para evitar está situación cada nodo hijo que se agregue al XML debe tener exactamente el mismo namspace de el documento o al menos así me funciona a mi. Por ejemplo:


procedure TForm1.Button3Click(Sender: TObject);
var
Document: IXMLDocument;
iNode: IXMLNode;
Myxmlns: string;
begin
Document := TXMLDocument.Create(nil);
Document.Options := [doNodeAutoIndent] ;
Document.Active := True;
Document.Version := '1.0';
Document.Encoding:= 'UTF-8';
Myxmlns := 'urn:iso:std:iso:20022:tech:xsd:pain.008.001.02';

Document.DocumentElement := Document.CreateNode('Document');
Document.DocumentElement.Attributes['xmlns'] := Myxmlns;
Document.DocumentElement.Attributes['xmlns:xsi'] := 'http://www.w3.org/2001/XMLSchema-instance';
iNode := Document.DocumentElement.AddChild('CstmrDrctDbtInitn', Myxmlns);
end;

newtron
16-02-2016, 09:51:18
Gracias a los dos. Haré pruebas y ya comento.

Saludos

olbeup
16-02-2016, 12:04:06
Hola a tod@s.

Como algunos de vosotros sabéis para el tema de la creación del nuevo fichero SEPA con XML estoy usando TXMLDocument pero me encuentro un problema.

Tengo que crear un nodo con atributos de forma que consiga este resultado:

para esto hago lo siguiente:

XMLMain := XMLInit.AddChild('Document');
XMLMain.Attributes['xmlns'] := 'urn:iso:std:iso:20022:tech:xsd:pain.008.001.02';
XMLMain.Attributes['xmlns:xsi'] := 'http://www.w3.org/2001/XMLSchema-instance';

Esto lo hago en mi pc y funciona perfectamente, el problema es que en el pc del primer cliente que lo prueba, con la misma instrucción me generar lo siguiente:

Si os fijáis, en la segunda línea se añade el texto xmlns="" siendo el programa el mismo, lo único es que se ejecuta en otro pc.

¿Es posible que haya algo en la configuración de windows que provoque este comportamiento?

Gracias y un saludo

Hola Neutron,

Me volví loco buscando la solución y aquí esta:
XMLMain := XMLInit.AddChild('Document', 'urn:iso:std:iso:20022:tech:xsd:pain.008.001.02');
XMLMain.Attributes['xmlns:xsi'] := 'http://www.w3.org/2001/XMLSchema-instance';

Un saludo.

newtron
16-02-2016, 13:02:29
Hola Neutron,

Me volví loco buscando la solución y aquí esta:
Código Delphi [-] (http://www.clubdelphi.com/foros/#) XMLMain := XMLInit.AddChild('Document', 'urn:iso:std:iso:20022:tech:xsd:pain.008.001.02'); XMLMain.Attributes['xmlns:xsi'] := 'http://www.w3.org/2001/XMLSchema-instance';

Un saludo.

Gracias por tu respuesta pero estoy probando tu código y me sigue saliendo en la linea siguiente el "biznago" que no deseo:

<CstmrDrctDbtInitn xmlns="">

Ese xmlns="" me sobra porque la instrucción que pongo es


XMLFileHeader := XMLMain.AddChild('CstmrDrctDbtInitn','');


Saludos

orodriguezca
16-02-2016, 13:16:54
La intrucción que deberias colocar es :


XMLFileHeader := XMLMain.AddChild('CstmrDrctDbtInitn', 'urn:iso:std:iso:20022:tech:xsdain.008.001.02');


Debes usar el mismo namespace del documento.

newtron
16-02-2016, 13:34:51
Ok.

Ya pillo la idea, he modificado el código y parece que sale correcto.

Gracias a todos y un saludo.