133 lines
3.8 KiB
C++
133 lines
3.8 KiB
C++
//------------------------------------------------------------------------------
|
||
#include "xmltools.h"
|
||
#include "wxTools.h"
|
||
#include "tcDebug.h"
|
||
|
||
//------------------------------------------------------------------------------
|
||
wxXmlNode* findNode(wxXmlNode* node,wxString nodename)
|
||
{
|
||
if(node==NULL) return NULL;
|
||
wxXmlNode* iNode;
|
||
iNode=node->GetChildren();
|
||
while (iNode != NULL)
|
||
{
|
||
wxString name=iNode->GetName();
|
||
if(name==nodename) return iNode;
|
||
iNode=iNode->GetNext();
|
||
}
|
||
return NULL;
|
||
}
|
||
//------------------------------------------------------------------------------
|
||
wxXmlNode* findNodeOnAttribute(wxXmlNode* node,wxString nodename,wxString Attribute,wxString val)
|
||
{
|
||
/*wxXmlNode* iNode;
|
||
iNode=node->GetChildren();
|
||
while (iNode != NULL)
|
||
{
|
||
if((iNode->GetName()==nodename)&&(iNode->GetPropVal(Attribute,_T(""))==val)) return iNode;
|
||
iNode=iNode->GetNext();
|
||
}*/
|
||
return NULL;
|
||
}
|
||
//------------------------------------------------------------------------------
|
||
wxXmlNode* findFirstNode(wxXmlNode* node,wxString nodename)
|
||
{
|
||
wxXmlNode* mas[10]; //макс уровень вложенности
|
||
int pos=0;
|
||
mas[pos] = node->GetChildren();
|
||
while (mas[pos] != NULL)
|
||
{
|
||
if(mas[pos]->GetName()==nodename) return mas[pos];
|
||
if(mas[pos]->GetChildren()!=NULL)
|
||
{
|
||
pos++;
|
||
mas[pos]=mas[pos-1]->GetChildren();
|
||
} else
|
||
{
|
||
//если не идёт дальше пытаемся подняться в верх по дереву
|
||
while (true)
|
||
{
|
||
mas[pos] = mas[pos]->GetNext();
|
||
if(mas[pos]==NULL)
|
||
{
|
||
if(pos>0) pos--; else break;
|
||
} else
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return NULL;
|
||
}
|
||
//------------------------------------------------------------------------------
|
||
//Найти первый узел с заданным атрибутом без рекурсии
|
||
wxXmlNode* findFirstNodeOnAttribute(wxXmlNode* node,wxString nodename,wxString Attribute,wxString val)
|
||
{
|
||
/*
|
||
wxXmlNode* mas[10]; //макс уровень вложенности
|
||
int pos=0;
|
||
mas[pos] = node->GetChildren();
|
||
while (mas[pos] != NULL)
|
||
{
|
||
if((mas[pos]->GetName()==nodename)&&(mas[pos]->GetPropVal(Attribute,_T(""))==val)) return mas[pos];
|
||
if(mas[pos]->GetChildren()!=NULL)
|
||
{
|
||
pos++;
|
||
mas[pos]=mas[pos-1]->GetChildren();
|
||
} else
|
||
{
|
||
//если не идёт дальше пытаемся подняться в верх по дереву
|
||
while (true)
|
||
{
|
||
mas[pos] = mas[pos]->GetNext();
|
||
if(mas[pos]==NULL)
|
||
{
|
||
if(pos>0) pos--; else break;
|
||
} else
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
*/
|
||
return NULL;
|
||
}
|
||
|
||
//------------------------------------------------------------------------------
|
||
//поиск узла по пути "type->objects->list->filter->column"
|
||
wxXmlNode* findNodeOnPath(wxXmlNode* node,wxString path)
|
||
{
|
||
if(node==NULL) return NULL;
|
||
path=path+_T("->");
|
||
while(true)
|
||
{
|
||
wxString name=getBeforeFirst(path,_T("->"));
|
||
node=findNode(node,name);
|
||
if(node==NULL) return NULL;
|
||
path=getAfterFirst(path,_T("->"));
|
||
if(path==_T("")) break;
|
||
}
|
||
return node;
|
||
}
|
||
//------------------------------------------------------------------------------
|
||
//Ищет первый CDATA и возврещяет его содержимое
|
||
wxString getCdataValue(wxXmlNode* node)
|
||
{
|
||
if(node==NULL) return _T("");
|
||
wxXmlNode* cdata=findNode(node,_T("cdata"));
|
||
if(cdata==NULL) return _T("");
|
||
return cdata->GetContent();
|
||
}
|
||
//------------------------------------------------------------------------------
|
||
//Присвоить значение первому CDATA узлу если его нет то создать
|
||
void setCdataValue(wxXmlNode* node,wxString val)
|
||
{
|
||
if(node==NULL) return;
|
||
wxXmlNode* cdata=findNode(node,_T("cdata"));
|
||
if(cdata==NULL) cdata=new wxXmlNode(node,wxXML_CDATA_SECTION_NODE, wxS("cdata"), wxS(""));
|
||
cdata->SetContent(val);
|
||
}
|
||
//------------------------------------------------------------------------------
|