Percebi que ao processar aquivos XML usando a classe TXMLDOCUMENT est�
acumulando memoria.
Simulei o erro neste fonte em anexo com o proprio exemplo XMLTEST.PRG da
pasta SAMPLES do xHarbour.
Para simular o problema compile e execute o XMLTEST.EXE passando como
parametro o RECEBE.XML
A memoria vai se acumulando e chega uma hora que estoura.
Alguem tendo alguma dica me avise.
Obrigado,
Eduardo Motta
SOURCE CODE: XMLTEST.PRG
************************************************************
* xmltest.prg
* $Id: xmltest.prg,v 1.1 2009/05/12 01:31:08 modalsist Exp $
*
* Test for XML routines of Xharbour rtl (MXML/HBXML)
*
* USAGE: xmltext <cFileName> <cNode> <cAttrib> <cValue> <cData>
* cFileName: the XML to parse (defaults to xmltest.xml)
* cNode: if you want to test regex match on node name
* cNode: if you want to test if a node has an attribute
* cValue: if you want to test if a node has an attribute with a given
value
* cData: if you want to test regex match on node content
* (You can pass NIL/unused elements by setting them to "" on the command
line)
*
* (C) Giancarlo Niccolai
*
#include "fileio.ch"
#include "hbxml.ch"
#include "common.ch"
Function Main( cFileName, cNode, cAttrib, cValue, cData )
Local nCont := 0
Default cFileName to "recebe.xml"
While LastKey() # 27
TestXml( cFileName, cNode, cAttrib, cValue, cData )
ThreadSleep(1)
Inkey()
? nCont++
HB_GCAll(.t.)
EndDo
Return
Function TestXml( cFileName, cNode, cAttrib, cValue, cData )
Private hFile, cXml
Private xmlDoc, xmlNode, lFind := .f.
SET EXACT OFF
// CLS
? "X H A R B O U R - XML Test "
IF cFileName == NIL
cFileName := "xmltest.xml"
ENDIF
// this can happen if I call xmltest filename "" cdata
IF ValType( cNode ) == "C" .and. Len( cNode ) == 0
cNode := NIL
ENDIF
// this can happen if I call xmltest filename "" cdata
IF ValType( cAttrib ) == "C" .and. Len( cAttrib ) == 0
cAttrib := NIL
ENDIF
// this can happen if I call xmltest filename "" cdata
IF ValType( cValue ) == "C" .and. Len( cValue ) == 0
cValue := NIL
ENDIF
if ! file( cFileName )
@3, 10 SAY "File not found: " + cFileName
@4,10 SAY "Terminating, press any key to continue"
Inkey( .1 )
RETURN
ENDIF
lFind := (cNode != NIL .or. cAttrib != NIL .or. cValue != NIL .or. cData
!= NIL )
? "Processing "+cFileName+"..."
oDoc := TXmlDocument():New( cFileName )
//oNode := oDoc:oRoot:oChild
oNode := oDoc:CurNode
IF oDoc:nStatus != HBXML_STATUS_OK
@4,10 SAY "Error While Processing File: "
@5,10 SAY "On Line: " + AllTrim( Str( oDoc:nLine ) )
@6,10 SAY "Error: " + oDoc:ErrorMsg
@10,10 SAY "Program Terminating, press any key"
Inkey( .1 )
RETURN
ENDIF
if ! lfind
? "XML Dump beginning here"
? "-----------------------"
? ""
cXml := oDoc:ToString( HBXML_STYLE_NOINDENT )
? cXml
? "--- Press any key for next test"
// Inkey(0)
? "-----------------------"
? "Navigating all nodes"
? ""
DO WHILE oNode != NIL
cXml := oNode:Path()
IF cXml == NIL
cXml := "(Node without path)"
ENDIF
? Alltrim( Str( oNode:nType ) ), ", ", oNode:cName, " = ", ;
ValToPrg( oNode:aAttributes ), ", ", oNode:cData, ": ", cXml
oNode := oDoc:Next()
ENDDO
else
?
? "Searching for node named", cNode, ",", cAttrib, "=", cValue,;
" with data having", cData
? ""
IF cNode != NIL
cNode := HB_RegexComp( cNode )
ENDIF
IF cAttrib != NIL
cAttrib := HB_RegexComp( cAttrib )
ENDIF
IF cValue != NIL
cValue := HB_RegexComp( cValue )
ENDIF
IF cData != NIL
cData := HB_RegexComp( cData )
ENDIF
oNode := oDoc:FindFirstRegex( cNode, cAttrib, cValue, cData )
WHILE oNode != NIL
? "Found node ", oNode:Path() , ValToPrg( oNode:ToArray() )
oNode := oDoc:FindNext()
ENDDO
endif
?
? "Terminated. Press any key to continue"
// Inkey( 0 )
?
Release xmlDoc
Release xmlNode
RETURN
// RECEBE.XML
<?xml version="1.0"?>
<coletor codigo="000030">
<propriedades msgace="ACESSO LIBERADO BOM APETITE !! " msgpad="RESTAURANTE
GRSA" msgrec="ACESSO BLOQUEA DO NO PER�ODO " numreg="" status="0"
ultmsg="NAO CONECTADO [-24]" ultreg=""/>
</coletor>
|