Files
Tools_CPP/lib/xmlTools.cpp
2024-11-01 12:23:13 +05:00

133 lines
3.8 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//------------------------------------------------------------------------------
#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);
}
//------------------------------------------------------------------------------