//+------------------------------------------------------------------+ //| XmlElement.mqh | //| yu-sha@ukr.net | //+------------------------------------------------------------------+ //----------------------------------------------------------------------------- // CXmlElement ! //----------------------------------------------------------------------------- class CXmlElement { private: string FName; CXmlAttribute *FAttributes[]; CXmlElement *FElements[]; string FText; CXmlElement *FParent; public: //--- constructor methods void CXmlElement(); void ~CXmlElement(); void Init( string aName, CXmlElement *aParent=NULL, string aText=""); void CopyTo(CXmlElement &aDst); virtual void Clear(); //--- main service methods string GetName() ; void SetName( string aName); string GetText() ; void SetText( string aText); CXmlElement *GetParent() ; void SetParent(CXmlElement *aParent); //--- attribute service methods int GetAttributeCount() ; int GetAttributeIndex(CXmlAttribute *aAttr) ; CXmlAttribute *GetAttribute( string aName) ; CXmlAttribute *GetAttribute(int aPos) ; string GetAttributeValue( string aName) ; CXmlAttribute *AttributeInsertAt(CXmlAttribute *aAttr,int aPos); CXmlAttribute *AttributeAdd(CXmlAttribute *aAttr); CXmlAttribute *AttributeInsertAfter(CXmlAttribute *aAfter,CXmlAttribute *aAttr); CXmlAttribute *AttributeInsertBefore(CXmlAttribute *aBefore,CXmlAttribute *aAttr); CXmlAttribute *AttributeRemove(CXmlAttribute *aAttr); CXmlAttribute *AttributeRemove(int aPos); void AttributeDelete(CXmlAttribute *aAttr); void AttributeDelete(int aPos); void AttributeDeleteAll(); //--- child service methods int GetChildCount() ; int GetChildIndex(CXmlElement *aElement) ; CXmlElement *GetChild( string aName) ; CXmlElement *GetChild(int aPos) ; string GetChildText( string aName) ; CXmlElement *ChildInsertAt(CXmlElement *aElement,int aPos); CXmlElement *ChildAdd(CXmlElement *aElement); CXmlElement *ChildInsertAfter(CXmlElement *aAfter,CXmlElement *aElement); CXmlElement *ChildInsertBefore(CXmlElement *aBefore,CXmlElement *aElement); CXmlElement *ChildRemove(CXmlElement *aElement); CXmlElement *ChildRemove(int aPos); void ChildDelete(CXmlElement *aElement); void ChildDelete(int aPos); void ChildDeleteAll(); string GetXml(int aLevel); }; //--------------------------------------------------------------------------------/ // CXmlElement :: implementation / //--------------------------------------------------------------------------------/ //+------------------------------------------------------------------+ //| Constructor | //+------------------------------------------------------------------+ void CXmlElement::CXmlElement() { FParent=NULL; }; //+------------------------------------------------------------------+ //| Destructor | //+------------------------------------------------------------------+ void CXmlElement::~CXmlElement() { Clear(); }; //+------------------------------------------------------------------+ //| Init | //+------------------------------------------------------------------+ void CXmlElement::Init( string aName, CXmlElement *aParent=NULL, string aText="") { Clear(); SetName(aName); SetParent(aParent); SetText(aText); }; //+------------------------------------------------------------------+ //| CopyTo | //+------------------------------------------------------------------+ void CXmlElement::CopyTo(CXmlElement &aDst) { aDst.Clear(); aDst.FName = FName; aDst.FText = FText; aDst.FParent=NULL; for(int i=0; i(aPos); --i) FAttributes[i]=FAttributes[i-1]; FAttributes[aPos]=aAttr; return aAttr; }; //+------------------------------------------------------------------+ //| AttributeAdd | //+------------------------------------------------------------------+ CXmlAttribute *CXmlElement::AttributeAdd(CXmlAttribute *aAttr) { return AttributeInsertAt(aAttr,GetAttributeCount()); }; //+------------------------------------------------------------------+ //| AttributeInsertAfter | //+------------------------------------------------------------------+ CXmlAttribute *CXmlElement::AttributeInsertAfter(CXmlAttribute *aAfter,CXmlAttribute *aAttr) { return AttributeInsertAt(aAttr,GetAttributeIndex(aAfter)+1); }; //+------------------------------------------------------------------+ //| AttributeInsertBefore | //+------------------------------------------------------------------+ CXmlAttribute *CXmlElement::AttributeInsertBefore(CXmlAttribute *aBefore,CXmlAttribute *aAttr) { return AttributeInsertAt(aAttr,GetAttributeIndex(aBefore)); }; //+------------------------------------------------------------------+ //| AttributeRemove | //+------------------------------------------------------------------+ CXmlAttribute *CXmlElement::AttributeRemove(CXmlAttribute *aAttr) { return AttributeRemove(GetAttributeIndex(aAttr)); }; //+------------------------------------------------------------------+ //| AttributeRemove | //+------------------------------------------------------------------+ CXmlAttribute *CXmlElement::AttributeRemove(int aPos) { CXmlAttribute *attr=FAttributes[aPos]; for(int i=aPos; i=0; i--) delete FAttributes[i]; ArrayResize(FAttributes,0); }; // Child service methods //+------------------------------------------------------------------+ //| GetChildCount | //+------------------------------------------------------------------+ int CXmlElement::GetChildCount() { return ArraySize(FElements); }; //+------------------------------------------------------------------+ //| GetChildIndex | //+------------------------------------------------------------------+ int CXmlElement::GetChildIndex(CXmlElement *aElement) { int i=0; while((i(aPos); --i) FElements[i]=FElements[i-1]; FElements[aPos]=aElement; aElement.SetParent(GetPointer(this)); return aElement; }; //+------------------------------------------------------------------+ //| ChildAdd | //+------------------------------------------------------------------+ CXmlElement *CXmlElement::ChildAdd(CXmlElement *aElement) { return ChildInsertAt(aElement,GetChildCount()); }; //+------------------------------------------------------------------+ //| ChildInsertAfter | //+------------------------------------------------------------------+ CXmlElement *CXmlElement::ChildInsertAfter(CXmlElement *aAfter,CXmlElement *aElement) { return ChildInsertAt(aElement,GetChildIndex(aAfter)+1); }; //+------------------------------------------------------------------+ //| ChildInsertBefore | //+------------------------------------------------------------------+ CXmlElement *CXmlElement::ChildInsertBefore(CXmlElement *aBefore,CXmlElement *aElement) { return ChildInsertAt(aElement,GetChildIndex(aBefore)); }; //+------------------------------------------------------------------+ //| ChildRemove | //+------------------------------------------------------------------+ CXmlElement *CXmlElement::ChildRemove(CXmlElement *aElement) { return ChildRemove(GetChildIndex(aElement)); }; //+------------------------------------------------------------------+ //| ChildRemove | //+------------------------------------------------------------------+ CXmlElement *CXmlElement::ChildRemove(int aPos) { //delete FElements[aPos]; //for(int i=aPos; i=0; i--) delete FElements[i]; ArrayResize(FElements,0); }; //+------------------------------------------------------------------+ //| GetXml | //+------------------------------------------------------------------+ string CXmlElement::GetXml(int aLevel) { string t="";; for(int i=0; i"); else { StringAdd(s,">"); for(int i=0; i0) && (FText!="")) StringAdd(s,"\r\n"); // StringAdd(s,TextPreProcess(FText)); StringAdd(s,FText); //FText="*"+FText+"*"; if((ArraySize(FElements)>0)) StringAdd(s,"\r\n"+t); StringAdd(s,""); } return(s); }; //+------------------------------------------------------------------+ //| TextPreProcess | //+------------------------------------------------------------------+ string TextPreProcess( string s) { // Replace " & < > with "e, ... return(s); }; //+------------------------------------------------------------------+