usar XMLTransformProvider passando o xml sem ser via arquivo.
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á!
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
Curtidas 0
Respostas
Rubem Rocha
10/01/2011
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
ClientDataSet1.XMLData := XMLTransform1.Data; Boa sorte. Sds., Rubem Rocha Manaus, AM
GOSTEI 0
Murilo Junqueira
10/01/2011
Obrigado pela resposta, consegui resolver esta parte da seuinte maneira:
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!
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!
GOSTEI 0
Mário Reis
10/01/2011
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
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
GOSTEI 0