Fórum Access Violation ao tentar lêr ficheiro Xml em Delphi 6 #445168

11/06/2013

0

Necessito de lêr um documento Xml e extrair informação dos nós <DocumentNumber> and <ATDocCodeID>.
Quando tento obter o valor de um nó com o comando 'findnode' dá um erro de ACCESS VIOLATION.
Haverá alguém que me possa ajudar?

Xml file:

<?xml version="1.0" encoding="ISO-8859-1"?>
<FileProcResult xmlns="https://servicos.portaldasfinancas.gov.pt/sgdtpf/fileProcessingResult/">
<DocumentInfo>
<DocumentNumber>GC 1/201300001</DocumentNumber>
<ATDocCodeID>004719433</ATDocCodeID>
</DocumentInfo>
<DocumentInfo>
<DocumentNumber>GC 1/201300002</DocumentNumber>
<ATDocCodeID>004719441</ATDocCodeID>
</DocumentInfo>
</FileProcResult>

meu código usando TxmlDocument :

XMLDoc.LoadFromFile('C:\abcd\Ficheiro.xml');
XMLDoc.LoadFromFile('C:\abcd\Ficheiro.xml');
XMLDoc.Active := true;
with (XMLDoc) do begin
with (DocumentElement.ChildNodes) do begin
memo1.Lines.Add(FindNode('DocumentNumber').Text);
memo1.Lines.Add(FindNode('ATDocCodeID').Text);
end;
end;


Ana Santos

Ana Santos

Responder

Posts

11/06/2013

Rodolpho Silva

Tente assim:

...
if FindNode('DocumentNumber') <> nil then
  memo1.Lines.Add(FindNode('DocumentNumber').Text);

if FindNode('ATDocCodeID') <> nil then
  memo1.Lines.Add(FindNode('ATDocCodeID').Text);
...
Responder

Gostei + 0

12/06/2013

Ana Santos

Com esse teste já não dá o erro nessa linha mas agora dá ao fazer o NextSibling.
Muito obrigado
Responder

Gostei + 0

12/06/2013

Ana Santos

O problema do Nextsibling está resolvido ( eu já estava a tentar outra solução para resolver o problema).
A solução que me propôs funciona muito bem. Mas agora estou com outro problema : apenas consigo lêr o node [DocumentInfo] e o que eu necessito é de ler os filhos desse node. Pode-me ajudar?
Muito obrigado
Responder

Gostei + 0

12/06/2013

Rodolpho Silva

Então você precisará ler o componente de XML de forma recursiva. Segue a função:
procedure LerDeModoRecursivo(node: IXMLNode);
var
 iLevel: Integer;
begin
 for iLevel := 0 to Pred(node.ChildNodes.Count) do
 begin
   // Faça alguma coisa com o nó...
   // node.ChildNodes[iLevel];
   
   if node.ChildNodes[iLevel].HasChildNodes then
	 LocReadChildNodes(node.ChildNodes[iLevel]);
 end;
end;


E sendo a chamada principal...
LerDeModoRecursivo(XMLDocument.DocumentElement);



Desta forma, você consegue ler todos os nós do XML, independente do nível em que se encontra.
Responder

Gostei + 0

12/06/2013

Rodolpho Silva

Ratificando a função....
procedure LerDeModoRecursivo(node: IXMLNode);
var
 iLevel: Integer;
begin
 for iLevel := 0 to Pred(node.ChildNodes.Count) do
 begin
   // Faça alguma coisa com o nó...
   // node.ChildNodes[iLevel];
    
   if node.ChildNodes[iLevel].HasChildNodes then
     LerDeModoRecursivo(node.ChildNodes[iLevel]);
 end;
end;
Responder

Gostei + 0

12/06/2013

Ana Santos

Resolvido


Funcionou na perfeição.
Muito, muito obrigada
Responder

Gostei + 0

27/09/2013

José

Obrigado Ana Santos, por sinalizar que sua duvida foi sanada.
Sendo assim estou marcando o tópico como concluído, fique a vontade para abrir novos.
Responder

Gostei + 0

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

Aceitar