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