哎,老了!这是我写的一个解析xml的程序,编译,运行没有问题,就是内存一直在增加,??开源的,想要留下mail
hx_zm 2004-06-29 11:03:11 //DTD struct
typedef struct DTDNode
{
int NodeIx;
char Name[20];
int Arity;
struct DTDNode *Children[50];
struct DTDNode *Parent;
} STRUCTDTD;
在遇到新元素时
void SAX2CountHandlers::startElement(const XMLCh* const uri
, const XMLCh* const localname
, const XMLCh* const qname
, const Attributes& attrs)
{
StackElement *FirstSib=new StackElement;
STRUCTDTD *NodeTmp;
FirstSib->ElementName="NULL";
FirstSib->NodeIx=0;
FirstSib->position=0;
StackElement *elemTmp=new StackElement;
elemTmp->ElementName=XMLString::transcode(localname);
elemTmp->NodeIx=m_nodeIx;
elemTmp->position=SibilingStack.SearchPosition(elemTmp->ElementName);
DP.AppendPosition(elemTmp->position);
// Insert a node into DTD and a data path node
NodeTmp=MyDTD.GetCurrentNode();
STRUCTDTD *Tmp;
if (!MyDTD.SearchName(NodeTmp,elemTmp->ElementName))
{
++m_nodeIx;
m_DTDNode = new STRUCTDTD;
strcpy(m_DTDNode->Name,elemTmp->ElementName);
m_DTDNode->NodeIx=m_nodeIx;
m_DTDNode->Arity=0;
MyDTD.InsertNode(m_DTDNode);
MyDP.InsertNode(m_nodeIx);
char *ssTmp=DP.GetDP();
MyDP.InsertDP(m_nodeIx,ssTmp,m_ValueIx);
}
else // if there is node named ElementName, itis only to add a new data path
{
Tmp=MyDTD.GetCurrentNode();
if (Tmp->Arity<elemTmp->position)
MyDTD.UpdateArity(elemTmp->position);
unsigned int NodeIx=Tmp->NodeIx;
char *ssTmp=DP.GetDP();
MyDP.InsertDP(NodeIx,ssTmp,m_ValueIx);
}
// int parent=(ElemStack.Peek()).NodeIx;
// int priorSib=(SibilingStack.Peek()).NodeIx;
SibilingStack.Push(elemTmp);
SibilingStack.Push(FirstSib);
fElementCount++;
ElemStack.Push(elemTmp);
fAttrCount += attrs.getLength();
if (attrs.getLength()!=0)
for (int i=0;i<attrs.getLength();i++)
{
NodeTmp=MyDTD.GetCurrentNode();
DP.AppendPosition(0);
char *sTmp=XMLString::transcode(attrs.getLocalName(i));
if (!MyDTD.SearchName(NodeTmp,sTmp))
{
++m_nodeIx;
m_DTDNode = new STRUCTDTD;
strcpy(m_DTDNode->Name,sTmp);
m_DTDNode->NodeIx=m_nodeIx;
m_DTDNode->Arity=0; //how to compute arity of an attribute???
MyDTD.InsertNode(m_DTDNode);
MyDP.InsertNode(m_nodeIx);
char *ssTmp=DP.GetDP();
MyDP.InsertDP(m_nodeIx,ssTmp,m_ValueIx);
}
else
{
Tmp=MyDTD.GetCurrentNode();
if (Tmp->Arity<elemTmp->position)
MyDTD.UpdateArity(elemTmp->position);
unsigned int NodeIx=Tmp->NodeIx;
char *ssTmp=DP.GetDP();
MyDP.InsertDP(NodeIx,ssTmp,m_ValueIx);
}
MyDTD.ReturnParent();
DP.DeletePosition();
}
delete FirstSib;
FirstSib=NULL;
delete elemTmp;
elemTmp=NULL;
}