Validade do XML via Delphi ????

Delphi

10/04/2007

O ClintDataSet muitas vezes é usado para gerar XML...

Existem algun teste que se possa fazer em um arquivo XML , para ver se a estrtutura desse Xml esta perfeita...

Por exemplo ao tentar abri na mão um XML que foi gerado pelo ClientDataSet tenho a seguinte mensagem : retornado pelo Internet Explorer

Na mão que me refiro é dando um duplo click no Arquivo

A página XML não pode ser exibida Não é possível exibir a entrada XML usando a folha de estilos XSL. Corrija o erro e clique no botão Atualizar ou tente novamente mais tarde. Caractere inválido encontrado no texto. Erro ao processar o recurso ´file:///C:/MovProducao1/Dados/Producao.xml´. Linha 1, posição 1793


com testar isto via delphi ????

Tipo isto

If ArquivoXml Legal clientDataSet.LoadForm := Este Arquivo else Erro No Arquivo .. Não abrir ???



Marco Salles

Marco Salles

Curtidas 0

Respostas

Marco Salles

Marco Salles

10/04/2007

Como validar os dados do ClintDataSet , para poder grava-lo e posteiormente abri-lo com segurança ??


GOSTEI 0
Marco Salles

Marco Salles

10/04/2007

To estudando isto igual loko e ninguem abre uma linha de discussão

as vezes a gente sozinho acha que chega a algum resultado válido , porém não passa de uma fusão a frio

´Fusão a frio ´ esquece ia ser muitas delongas

Mas o que interressa por exemplo é o seguinte

Ao gravar no xml atraves de um campo via clientDataSet o seguinte :

[b:5e784b8097]Saia De[u:5e784b8097] Cós [/u:5e784b8097]Curta Estampada[/b:5e784b8097]

Na hora de abrir na mão o Xml obtenho o erro

Ao gravar no xml atraves de um campo via clientDataSet o seguinte :

[b:5e784b8097]Saia De[u:5e784b8097] Cos [/u:5e784b8097]Curta Estampada[/b:5e784b8097]

sem o acento... o Arquivo Xml abre normalmente... [b:5e784b8097]Vexi[/b:5e784b8097]

é isto mesmo ????


GOSTEI 0
Massuda

Massuda

10/04/2007

Geralmente precisa incluir no início do arquivo qual a codificação que está sendo utilizada, por exemplo...
<?xml version="1.0" encoding="iso-8859-1"?>
...resto do seu arquivo...
...indica que usa codificação ISO-8859-1 (a mais comum).


GOSTEI 0
Marco Salles

Marco Salles

10/04/2007

[b:a80b0f9767]citação de massuda[/b:a80b0f9767]
Geralmente precisa incluir no início do arquivo qual a codificação que está sendo utilizada, por exemplo...Código: <?xml version=´1.0´ encoding=´iso-8859-1´?> ...resto do seu arquivo... ...indica que usa codificação ISO-8859-1 (a mais comum).


os arquivos xml gerados pelo meu Clintdataset estão assim inicilaizados:

<?xml version=´1.0´ standalone=´yes´ ?> - <DATAPACKET Version=´2.0´> - <METADATA> ...resto do seu arquivo...


[b:a80b0f9767]esses Arquivos xml gerados são todos MyBase , sen nehum banco a não ser SQL associado a ele[/b:a80b0f9767]

Eu ainda não testei , mas farei isto, > incluir manualmente esta sintasi
encoding=´iso-8859-1´?
para ver se melhora o problema com relação aos acentos e caracteres especias

Obrigado....


GOSTEI 0
Adriano Santos

Adriano Santos

10/04/2007

Nem esquenta com isso velho, basta usar a constante [b:864b55ca01]dfXMLUTF8[/b:864b55ca01] no segundo parâmetro do SaveToFile do ClientDataSet. Ai já era, fiz isso estes dias e funciona.

Exemplo:

cdsArquivo.SaveToFile(ExtractFilePath(Application.ExeName) + ´Arquivo.xml´, dfXMLUTF8);



GOSTEI 0
Marco Salles

Marco Salles

10/04/2007

Nem esquenta com isso velho, basta usar a constante dfXMLUTF8 no segundo parâmetro do SaveToFile do ClientDataSet. Ai já era, fiz isso estes dias e funciona. Exemplo: Citação: cdsArquivo.SaveToFile(ExtractFilePath(Application.ExeName) + ´Arquivo.xml´, dfXMLUTF8);



[b:d5efe4865d]Acho que voce tem toda razão... [/b:d5efe4865d] :P Realmente o segundo parâmetro é a chave para ´Tudo´ ou quase ´Tudo´

Eu digo [b:d5efe4865d]quase tudo[/b:d5efe4865d] porque a primeira parte do tópico se refere a isto:

Existem algum teste que se possa fazer em um arquivo XML , para ver se a estrtutura desse Xml esta perfeita...


eu não sei se é a melhor solução , mas relendo algumas biografias , encontrei a principio o elemento [b:d5efe4865d]XMLDocument[/b:d5efe4865d]

mais ou menos assim:

[u:d5efe4865d]caminho do arquivo XML no meu diretório[/u:d5efe4865d]

try XMLDocument1.Active:=false; XMLDocument1.LoadFromFile(´[b:d5efe4865d]caminho[/b:d5efe4865d]´); XMLDocument1.Active:=True; erro:=False; except result:=erro; end;


O problema é que os dados do Arquivo XML que será gerado estão no ClintDataSet . Eu teria que Salva-los em um Diretorio , para ter um Caminho... e de posse deste caminho efetuar um Teste com o XMLDocument1 para saber se o XML gerado é válido ou não

Eu gostaria que este teste fossem com os [b:d5efe4865d]dados[/b:d5efe4865d] do Clientdataset , sem passar por esta etapa de salvar.. Imagine ficar salvando vários Arquivos , e fazer a verificação nesses Arquivos para saber se são válidos ou não... Parece não ser uma boa idéia

Tudo isto parece estranho , mas vou tentar explicar melhor

Tenho varios ClientDataSet , todos eles desconectados No inicio do Programa carrego eles com uma base de dados válida Ao longo do programa tenho relacionamentos , crio indices dinamicos , gero exceçoes , finalizo bruscamente o Programa etc... E na hora de fechar o Programa principal os dados desses ClintDataSet , tem que respeitar a formatação do XML , para que eu possa valida-los ou não na minha Base de dados , para que eu possa carrega-los ao abrir o programa futuramente..


:cry: :cry:
[b:d5efe4865d]Ai surge uma duvida [/b:d5efe4865d], será que há pssibilidades destes ClintDataSet , por algum risco que não é de meu inteiro conhecimento , ter em seus Dados , algo que possa criar um XML que não esteja no [b:d5efe4865d]Padrão Adequado[/b:d5efe4865d] :?: :?: :?:

Ai vem alguem que conhece mais do assunto do que eu , ou mesmo que possa ter um opinião a respeito e diz o seguinte:
"Não Marco Salles , esta possibilidade não existe , a Estrutura dos Dados doClietDataSet , sempre Serão válidos .. naõ corre o Risco por exemplo de se ter um Ruptura nestas Estrutura..."


:arrow: Se for esta a opinião , da integridade da estrutura dos Dados do ClintDataSet , eu confesso que estou [u:d5efe4865d][b:d5efe4865d]me procupando a Toa[/b:d5efe4865d][/u:d5efe4865d]...
:arrow: Se por outro lado , não se tiver certeza disso , acho que devo tentar fazer esta validaçao , porque ai eu so vou sobrepor a base de dados antiga por uma nova Base de dados válida

Esta é minha Duvida , Quero finalizar o programa sem correr o Risco de ter que dar manutenção no mesmo por eventuais erros deste tipo

[b:d5efe4865d]Obrigado massuda e Adriano[/b:d5efe4865d]


GOSTEI 0
Sremulador

Sremulador

10/04/2007

Amigo, tente..

  Result.async := False;
  Result.resolveExternals := False;
  Result.validateOnParse := True;
  Result.load(FileName);
end;

{ Validate }

procedure InternalValidateXMLDoc(const Doc: IDOMDocument; const SchemaDoc: IXMLDOMDocument2; const SchemaNS: WideString);
var
  MsxmlDoc: IXMLDOMDocument2;
  SchemaCache: IXMLDOMSchemaCollection;
  Error: IXMLDOMParseError;
begin
  MsxmlDoc := DOMToMSDom(Doc);
  SchemaCache := CoXMLSchemaCache40.Create;
  SchemaCache.add(SchemaNS, SchemaDoc);
  MsxmlDoc.schemas := SchemaCache;
  Error := MsxmlDoc.validate;
  if Error.errorCode <> S_OK then
    raise EValidateXMLError.Create(Error.errorCode, Error.reason);
end;

procedure ValidateXMLDoc(const Doc: IDOMDocument; const SchemaLocation, SchemaNS: WideString);
begin
  InternalValidateXMLDoc(Doc, LoadMSDom(SchemaLocation), SchemaNS);
end;

procedure ValidateXMLDoc(const Doc: XMLIntf.IXMLDocument; const SchemaLocation, SchemaNS: WideString);
begin
  InternalValidateXMLDoc(Doc.DOMDocument, LoadMSDom(SchemaLocation), SchemaNS);
end;

procedure ValidateXMLDoc(const Doc: IDOMDocument; const Schema: IXMLSchemaDoc);
begin
  InternalValidateXMLDoc(Doc, DOMToMSDom(Schema.DOMDocument), ´´);
end;

procedure ValidateXMLDoc(const Doc: XMLIntf.IXMLDocument; const Schema: IXMLSchemaDoc);
begin
  InternalValidateXMLDoc(Doc.DOMDocument, DOMToMSDom(Schema.DOMDocument), ´´);
end;

end.



GOSTEI 0
POSTAR