Fórum usar XMLTransformProvider passando o xml sem ser via arquivo. #393564

10/01/2011

0

Olá pessoal estou usando o XMLTransformProvider para ler um xml no formato datapacket
com o clientdataset, o problema é que vou utilizar isso em uma aplicação com Threads
onde vários usuários irão acessar a função ao mesmo tempo, neste caso gostaria
de saber se tem alguma opção de ler o xml sem no XMLTransformProvider sem
ser via arquivo c:\xml.xml
ou seja, se eu abrir o xml em um memo, como passo isso para o XMLTransformProvider
tentei

XMLTransformProvider1.TransformRead.SourceXml := memo1.text;
XMLTransformProvider1.TransformRead.SourceXmlDocument := XMLDoc.GetDOMDocument;

onde xmldoc e do tipo IXMLDocument

mais nenhuma das opções da certo, abre no dbgrid sem os registros,

só da certo se ler o xml via arquivo
XMLTransformProvider1.XMLDataFile := 'c:\xml.xml';
XMLTransformProvider1.TransformRead.SourceXmlFile := 'c:\xml.xml';

outra coisa, é possivel passar o xtr sem ser via arquivo tb?
o código direto para o componente?

Obrigado desde já!
Murilo Junqueira

Murilo Junqueira

Responder

Posts

11/01/2011

Rubem Rocha

Se for tratar como arquivo, continue usando o esquema com o TXMLTransformProvider. Se o XML terá que ser informado na unha, como um texto informado pelo usuário via um TMemo, por exemplo, a saída é utilizar o componente TXMLTransform para converter esse texto em forma de datapackets que serão atribuídos ao ClientDataSet. Exemplo:   //  informa o texto com o XML XMLTransform1.SourceXML := memo1.text;   //  informa ao XMLTransform o arquivo de transformação, //  criado no XML Mapper XMLTransform1.TransformationFile := 'CustXMLToCustTable.xtr';   //  atribui o datapacket criado pelo XMLTransform ao ClientDataSet
ClientDataSet1.XMLData := XMLTransform1.Data;     Boa sorte.   Sds.,   Rubem Rocha Manaus, AM
Responder

Gostei + 0

11/01/2011

Murilo Junqueira

Obrigado pela resposta, consegui resolver esta parte da seuinte maneira:

 ClientDataset1.Active := FALSE;
 XMLTransformProvider1.TransformRead.TransformationFile := xDirSys + 'DadosING.xtr';
 ClientDataSet1.XMLData := XMLTransformProvider1.TransformRead.TransformXML(MRR.Text);
 ClientDataset1.Active := TRUE;


agora tenho um outro problema,
é possível gerar o xtr sem ser pelo xml mapper, pelo proprio delphi em runtime?
e tb uma outra forma de passar o xtr sem ser via arquivo em diretório, via stream algo do tipo
não queria mexer com nada de diretórios do windows, como disse a aplicação usa threads...

Obrigado noamente!
Responder

Gostei + 0

19/07/2022

Mário Reis

De duas uma, ou não entendi a resposta acima ou a solução indicada enferma de erro!
Se bem entendi, de cada vez que tiver que ler um arquivo xml via XMLTransformProvider1 não tem que
gerar e informar o novo "TransformWrite/TransFormRead o novo <qualquercoisa>.xtr (enquanto ler ficheiros com aquela mesma estrutura não haverá problemas; já com o XMLTransformProvider1.XMLDataFile tenho duvidas que ele não tenha de ser atualizado pelo xml em linha com aquela mesma estrutura.
Parece-me que todas as vezes se tem que informar XMLTransformProvider1.XMLDataFile:= OpenTextFileDialog1.FileName com o novo XML em linha

Agora, estou com um problema! Ao testar um XML complexo (Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.002.001.03") com um header e um detalhe no mesmo aparentemente faz tudo direto e limpo mas no ecran.
Porém, quando gravo [ClientDs1.ApplyUpdates(-1);] perco tudo e o xml em linha fica transformado em um datapacket.
Perdendo todos os dados!? Alguma ideia?Obrigado
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar