Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problema al generar fichero XML usando TXMLDocument (https://www.clubdelphi.com/foros/showthread.php?t=89834)

newtron 15-02-2016 17:43:02

Problema al generar fichero XML usando TXMLDocument
 
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:
Cita:

<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:
Código Delphi [-]
      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:
Cita:

<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 20:15:17

Algo parecido
 
A mi me paso algo parecido y finalmente me quedó de esta manera:

Código Delphi [-]
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 21: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:

Código Delphi [-]
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 10:51:18

Gracias a los dos. Haré pruebas y ya comento.

Saludos

olbeup 16-02-2016 13:04:06

Cita:

Empezado por newtron (Mensaje 502091)
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:
Código Delphi [-]
      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:
Código Delphi [-]
      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 14:02:29

Cita:

Empezado por olbeup (Mensaje 502119)
Hola Neutron,

Me volví loco buscando la solución y aquí esta:
Código Delphi [-] 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

Código Delphi [-]
      XMLFileHeader := XMLMain.AddChild('CstmrDrctDbtInitn','');

Saludos

orodriguezca 16-02-2016 14:16:54

La intrucción que deberias colocar es :

Código Delphi [-]
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 14:34:51

Ok.

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

Gracias a todos y un saludo.


La franja horaria es GMT +2. Ahora son las 19:23:29.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi