Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Lectura y escritura de un XML (https://www.clubdelphi.com/foros/showthread.php?t=80126)

lmpadron 05-09-2012 23:17:21

Lectura y escritura de un XML
 
hola comunidad
Ante todo no se si el nombre de este hilo sea el mas correcto pero no se de que otra manera mas especifica llamarlo !!!
Sucede que trato de obtener los datos de este XML
Código:

<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">
        <s:Schema id="RowsetSchema">
                <s:ElementType name="row" content="eltOnly">
                        <s:AttributeType name="IdCargo" rs:number="1" rs:maydefer="true" rs:writeunknown="true">
                                <s:datatype dt:type="int" dt:maxLength="4" rs:precision="10" rs:fixedlength="true"/>
                        </s:AttributeType>
                        <s:AttributeType name="Cargo" rs:number="2" rs:nullable="true" rs:maydefer="true" rs:writeunknown="true">
                                <s:datatype dt:type="string" dt:maxLength="50"/>
                        </s:AttributeType>
                        <s:extends type="rs:rowbase"/>
                </s:ElementType>
        </s:Schema>
        <rs:data>
                <z:row IdCargo="1" Cargo="Cargo 1"/>
                <z:row IdCargo="2" Cargo="Cargo 2"/>
                <z:row IdCargo="3" Cargo="Cargo 3"/>
                <z:row IdCargo="4" Cargo="Cargo 4"/>
                <z:row IdCargo="5" Cargo="Cargo 5"/>
        </rs:data>
</xml>
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>

Al principio trate de usar el TXMLDocument pero ni modo de que pueda leer los nodos asi que decidi usar el TXMLTransformProvider con un TClientDataSet y de esa forma poder usar el xml como si fuera una base de datos comun y corriente. Pues hasta ahi la idea es genial, :D:D:D:D, donde se pone dificil es en llevarla a la practica :D:D:D:D.
Sucede que no se como crear el .XTR que el XMLTransformProvider1->DataTransformRead y el XMLTransformProvider1->DataTransformWrite necesitan para realizar la lectura o escritura según sea el caso. Si alguien tiene alguna idea de como crear estos .XTR sera mas que bienvenida o si alguien puede indicarme como leer los nodos usando el TXMLDocument tambien sera bienvenida.
Gracias de antemano por su ayuda

erickahr 06-09-2012 06:31:37

Saludos
 
Por lo que veo tu XML (y si no me equivoco :o) puede ser leido con un ClientDataset sin problemas

Código Delphi [-]
Procedure AbreXML(Archivo: String);
begin
  ClientDataSet1.Close;
  ClientDataSet1.LoadFromFile(Archivo);
  ClientDataSet1.Open;  
end;

Y en un Button pones:

Código Delphi [-]
AbreXML('C:\tuarchivo.xml');

Si quieres guardar los cambios hechos puedes usar el siguiente codigo:

Código Delphi [-]
  ClientDataSet1.SaveToFile('C:\tuarchivomodificado.xml', dfXML);

Por otro lado, tambien podrias checar la documentacion del XMLMaper, aunque como te comento creo que no necesitaras mas que el ClientDataSet.

lmpadron 06-09-2012 15:21:29

Cita:

Empezado por erickahr (Mensaje 442031)
Por lo que veo tu XML (y si no me equivoco :o) puede ser leido con un ClientDataset sin problemas

Código:

---------------------------
Debugger Exception Notification
---------------------------
Project xml.exe raised exception class EDBClient with message 'Mismatch in datapacket.'. Process stopped. Use Step or Run to continue.
---------------------------
OK  Help 
---------------------------

Creo que no va a ser tan fácil jejeje aunque me hubiese encantado !!!!, parece que lo que tengo que mandarle es un DataPacket y no un XML de ahi la idea del Provider. Pero no se como crear el fichero de conversión ????????? Gracias de todas formas por la ayuda, si te surge alguna idea nueva con gusto la probaré

erickahr 06-09-2012 16:42:55

Duda
 
Una pregunta, con que programa se ha generado ese xml, porque efectivamente me mando el mismo error que a ti, pero al intentar crear un Binding del XML o pasarlo por el XML Mapper, me dio error (al parecer de parseo) con lo cual me daría a pensar que hay algo mal fisicamente con el XML.


Mira te este es un ejemplo de XML, que leo con el ClientDataSet tal como te lo sugerí.
Código:

<?xml version="1.0" standalone="yes"?>
<DATAPACKET Version="2.0">
  <METADATA>
    <FIELDS>
      <FIELD attrname="IDTRANSPORTE" fieldtype="i8" required="true">
        <PARAM Name="PROVFLAGS" Value="7" Type="i4" Roundtrip="True"/>
        <PARAM Name="ORIGIN" Value="&quot;TRANSPORTES&quot;.&quot;IDTRANSPORTE&quot;" Roundtrip="True"/>
      </FIELD>
      <FIELD attrname="TRANSPORTE" fieldtype="string.uni" WIDTH="140">
        <PARAM Name="ORIGIN" Value="&quot;TRANSPORTES&quot;.&quot;TRANSPORTE&quot;" Roundtrip="True"/>
      </FIELD>
    </FIELDS>
    <PARAMS PRIMARY_KEY="1"/>
  </METADATA>
  <ROWDATA>
    <ROW IDTRANSPORTE="1" TRANSPORTE="MULTIPACK"/>
    <ROW IDTRANSPORTE="2" TRANSPORTE="CASTORES"/>
    <ROW IDTRANSPORTE="3" TRANSPORTE="ODM"/>
    <ROW IDTRANSPORTE="4" TRANSPORTE="FLECHA AMARILLA"/>
  </ROWDATA>
</DATAPACKET>

Igual y viendo de donde viene ese XML podriamos darle una checada ;)

lmpadron 06-09-2012 20:27:35

pues ese XML me lo mando el desarrollador de otro proyecto para el cual el mio debe tributar información, no se con que lo creo pero el desarrolla desde una versión de Basic o algo parecido de Microsoft, asi que supongo que el componente que utiliza es de ellos también.

Por otra parte usando el XMLDocument logre leerlo y llegar hasta el ultimo nodo de esta forma
Código:

Memo1->Lines->Add(XMLDocument1->Node->ChildNodes->Nodes[0]->ChildNodes->Nodes[1]->ChildNodes->GetCount());
Memo1->Lines->Add(XMLDocument1->Node->ChildNodes->Nodes[0]->ChildNodes->Nodes[1]->ChildNodes->Nodes[0]->GetNodeName());

Asi logro ver el nombre del ultimo nodo y la cantidad pero no logro ver los datos dentro de el, me dice que el nodo no tiene un valor unico de texto, lo que tiene logica porque tiene dos valores el ID y el Cargo. Ahora estoy tratando con una via y con la otra hehehe.

mlara 14-10-2012 21:29:12

Cita:

Empezado por lmpadron (Mensaje 441951)
...
Sucede que no se como crear el .XTR que el XMLTransformProvider1->DataTransformRead y el XMLTransformProvider1->DataTransformWrite necesitan para realizar la lectura o escritura según sea el caso. Si alguien tiene alguna idea de como crear estos .XTR sera mas que bienvenida ...

No tengo la respuesta, y por el contrario casi la misma pregunta. Ya que en este hilo se preguntaba por los .xtr, no sé si alguien nos pueda colaborar al menos con un ejemplo de estos archivos. Resulta que el XMP Mapper viene con la versión Enterprise de Delphi, y si no la tienes pues los archivos habría que crealos manualmente, lo cual sería fácil si pudiéramos ver uno de ejemplo.

Gracias.


La franja horaria es GMT +2. Ahora son las 07:15:28.

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