//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;
}
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;
}
解决方案 »
- 如何触发 CToolTipCtrl 的功能
- Tab Ctrol控件的问题,在线等
- Gdiplus Image::FromFile() 共享违例
- win32sdk编程中,如果我要在窗口中显示文字或者图像,是不是窗口过程函数里一定要有处理WM_PAINT的case语句啊?
- 召唤vcleaner
- 请帮忙看一下DEBUG下的出错信息:
- 如何用CString类构造一个超出其最大值的字符串
- 要取得屏幕上某个窗口的位图,并且把它转换成 32 位怎么办?
- 那个好心的大哥捐我点分。我没有分了。
- 请问 _splitpath(const char *,char *,char *,char *,char *) 怎么用???
- 请教一个Windows的消息问题,看来简单,其实很深奥,请高手指教,100分相送!谢谢!
- 大家来谈谈Windows和MFC中的消息吧!
微软的msxml.dll在使用时,他自身是没有内存问题的,所以碰到内存不断增长的问题,原因是出现在我们的代码中,如果没有内存泄漏,那么一定是在内存该释放的地方没有释放,你可以追查一下代码,把某些公共变量修改为局部变量(根据我的经验,这很重要,在解析xml文件的时候尽可能少用全局变量),从而可以在某个函数执行完毕的时候马上释放,另外,尽可能的使用指针对象,这样可以及时delete掉指针,从而避免那些实例对象在内存中等到程序退出才释放占有的内存。你的StackElement类是什么样子的,我觉得可能出在这里。
thanks。1,我用的是sax不是msxml.dll。2,内存该释放的地方我已经释放了:-)。
3,我可以给你代码,要sax的支持。
[email protected]
[email protected]