Access Violation ao tentar lêr ficheiro Xml em Delphi 6
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;
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
Curtidas 0
Respostas
Rodolpho Silva
11/06/2013
Tente assim:
...
if FindNode('DocumentNumber') <> nil then
memo1.Lines.Add(FindNode('DocumentNumber').Text);
if FindNode('ATDocCodeID') <> nil then
memo1.Lines.Add(FindNode('ATDocCodeID').Text);
...
GOSTEI 0
Ana Santos
11/06/2013
Com esse teste já não dá o erro nessa linha mas agora dá ao fazer o NextSibling.
Muito obrigado
Muito obrigado
GOSTEI 0
Ana Santos
11/06/2013
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
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
GOSTEI 0
Rodolpho Silva
11/06/2013
Então você precisará ler o componente de XML de forma recursiva. Segue a função:
E sendo a chamada principal...
Desta forma, você consegue ler todos os nós do XML, independente do nível em que se encontra.
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.
GOSTEI 0
Rodolpho Silva
11/06/2013
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;
GOSTEI 0
Ana Santos
11/06/2013
Resolvido
Funcionou na perfeição.
Muito, muito obrigada
Funcionou na perfeição.
Muito, muito obrigada
GOSTEI 0
José
11/06/2013
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.
Sendo assim estou marcando o tópico como concluído, fique a vontade para abrir novos.
GOSTEI 0