XML.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. #pragma once
  2. #include <functional>
  3. #include "Array.h"
  4. #include "Maybe.h"
  5. #include "RCPointer.h"
  6. #include "ReferenceCounter.h"
  7. namespace Framework
  8. {
  9. class Text;
  10. namespace XML
  11. {
  12. class Editor;
  13. //! Ein XML element der Form \code <name attribut1
  14. //! attribut2="value">text oder childs</name> \endcode
  15. class Element : public virtual ReferenceCounter
  16. {
  17. private:
  18. RCArray<Element>* children;
  19. RCArray<Text>* attributes;
  20. RCArray<Text>* attributeValues;
  21. Text* name;
  22. Text* text;
  23. Element* parent;
  24. public:
  25. //! Erstellt ein leeres XML Element
  26. DLLEXPORT Element();
  27. //! Erstellt ein XML Element
  28. //! \param string entweder der name des Elements oder ein XML Text
  29. //! der geparsed werden soll
  30. DLLEXPORT Element(Text string);
  31. //! Erstellt ein XML Element
  32. //! \param string entweder der name des Elements oder ein XML Text
  33. //! der geparsed werden soll \param zParent Ein Zeiger auf das
  34. //! eltern element (ohne erhöhten reference Counter)
  35. DLLEXPORT Element(Text string, Element* zParent);
  36. DLLEXPORT ~Element();
  37. //! ändert ein attribut oder fügt eines hinzu
  38. //! \param attribut Der Name des Attributes
  39. //! \param value Der Wert des Attributes
  40. DLLEXPORT void setAttribute(Text attribut, Text value);
  41. //! entfernt ein attribut
  42. //! \param attribut Der Name des Attributes
  43. DLLEXPORT void removeAttribute(Text attribut);
  44. //! fügt ein child hinzu
  45. //! \param child Das neue Child Element
  46. DLLEXPORT void addChild(Element* child);
  47. //! fügt ein child hinzu
  48. //! \param child Das neue Child Element
  49. DLLEXPORT void addChildAtFront(Element* child);
  50. //! entfernt ein child
  51. //! \param zChild das zu entfernende Child
  52. DLLEXPORT void removeChild(Element* child);
  53. //! entfernt das i-te child
  54. //! \param i der Index des childs (bei 0 beginnend)
  55. DLLEXPORT void removeChild(int i);
  56. //! entfernt alle childs
  57. DLLEXPORT void removeAllChilds();
  58. //! entfernt eine Liste mit childs
  59. //! \param childs alle Childs die entfernt werden sollen
  60. DLLEXPORT void removeChilds(RCArray<Element>* childs);
  61. //! entfernt dieses Element vom Eltern element
  62. DLLEXPORT void remove();
  63. //! setzt den Text in dem Element falls es keine childs gibt
  64. //! \param text dert Text
  65. DLLEXPORT void setText(Text text);
  66. //! gibt den Text im Element zurück
  67. DLLEXPORT Text getText() const;
  68. //! gibt die Anzahl der Childs zurück
  69. DLLEXPORT int getChildCount() const;
  70. /// <summary>
  71. /// returns the index of the zChild in the list of children or -1 if
  72. /// zChild is not a child of this element
  73. /// </summary>
  74. /// <param name="zChild">the child element to search for</param>
  75. /// <returns>the index of zChild in the list of children or -1 if
  76. /// zChild is not a child of this element</returns>
  77. DLLEXPORT int getChildIndex(Element* zChild) const;
  78. //! gibt das i-te child zurück
  79. DLLEXPORT Element* getChild(int i) const;
  80. //! gibt das i-te child zurück (ohne erhöhten reference Counter)
  81. DLLEXPORT Element* zChild(int i) const;
  82. //! gibt das parent element zurück
  83. DLLEXPORT Element* getParent() const;
  84. //! gibt das parent element zurück (ohne erhöhten reference Counter)
  85. DLLEXPORT Element* zParent() const;
  86. //! gibt einen iterator zurück mit dem durch alle childs iteriert
  87. //! werden kann
  88. DLLEXPORT ArrayIterator<Element*> getChilds() const;
  89. //! gibt einen Editor für dieses Element zurück
  90. DLLEXPORT Editor select();
  91. //! gibt einen selector zurück der alle childs beinhaltet
  92. DLLEXPORT Editor selectChildren() const;
  93. //! gibt eine Liste mit childs zurück, die einen bestimmten Namen
  94. //! haben \param name der name der Childs
  95. DLLEXPORT Editor selectChildsByName(Text name) const;
  96. //! gibt eine Liste mit childs zurück, die ein bestimmtes Attribut
  97. //! haben \param attribute der name des Attributes
  98. DLLEXPORT Editor selectChildsByAttribute(Text attribute) const;
  99. //! gibt eine Liste mit childs zurück, die ein bestimmtes Attribut
  100. //! mit einem bestimmten wert haben \param attribute der name des
  101. //! Attributes \param value der Wert des Attributes
  102. DLLEXPORT Editor selectChildsByAttribute(
  103. Text attribute, Text value) const;
  104. //! gibt 1 zurück, falls ein Attribut Name existiert, 0 sonnst
  105. DLLEXPORT bool hasAttribute(Text name) const;
  106. //! gibt die Anzahl der Attribute zurück
  107. DLLEXPORT int getAttributeCount() const;
  108. //! gibt den Namen des i-ten Attributes zurück
  109. DLLEXPORT Text getAttributeName(int i) const;
  110. //! gibt den Wert des i-ten Attributes zurück
  111. DLLEXPORT Text getAttributeValue(int i) const;
  112. //! gibt den Wert eines Attributes zurück
  113. //! \param attribut Der Name des Attributes
  114. DLLEXPORT Text getAttributeValue(Text attribut) const;
  115. //! gibt einen iterator zurück mit dem durch alle Attribut Namen
  116. //! iteriert werden kann
  117. DLLEXPORT ArrayIterator<Text*> getAttributeNames() const;
  118. //! gibt einen iterator zurück mit dem durch alle Attribut Werte
  119. //! iteriert werden kann
  120. DLLEXPORT ArrayIterator<Text*> getAttributeValues() const;
  121. //! setzt den Namen des Elementes
  122. DLLEXPORT void setName(Text name);
  123. //! gibt den Namen des Elementes zurück zurück
  124. DLLEXPORT Text getName() const;
  125. //! erzeugt einen XML Text der dieses Element und alle childs
  126. //! beinhaltet
  127. DLLEXPORT Text toString() const;
  128. //! Erzeugt eine Kopie ohne referenzen auf dieses objekt
  129. DLLEXPORT Element* dublicate() const;
  130. friend Editor;
  131. };
  132. //! Ein XML Editor der immer gleich mehrere Elemente editieren kann
  133. class Editor : public virtual ReferenceCounter
  134. {
  135. private:
  136. RCArray<Element>* elements;
  137. public:
  138. //! Erzeugt einen neuen XML Editor mit einer Liste von Objekten die
  139. //! editiert werden sollen
  140. DLLEXPORT Editor(RCArray<Element>* elements);
  141. DLLEXPORT Editor(const Editor& e);
  142. DLLEXPORT ~Editor();
  143. /// <summary>
  144. /// returns the first element in the list
  145. /// </summary>
  146. /// <returns> the first element of a list or an empty object if no
  147. /// elements are present</returns>
  148. DLLEXPORT Maybe<RCPointer<Element>> getFirstElement() const;
  149. //! ändert ein attribut oder fügt eines hinzu (auf allen elementen
  150. //! in der Liste) \param attribut Der Name des Attributes \param
  151. //! value Der Wert des Attributes
  152. DLLEXPORT void setAttribute(Text attribut, Text value);
  153. //! entfernt ein attribut (auf allen elementen in der Liste)
  154. //! \param attribut Der Name des Attributes
  155. DLLEXPORT void removeAttribute(Text attribut);
  156. //! fügt ein child hinzu (auf allen elementen in der Liste)
  157. //! \param child Das neue Child Element
  158. DLLEXPORT void addChild(Element* child);
  159. //! entfernt ein child (auf allen elementen in der Liste)
  160. //! \param zChild das zu entfernende Child
  161. DLLEXPORT void removeChild(Element* child);
  162. //! entfernt das i-te child (auf allen elementen in der Liste)
  163. //! \param i der Index des childs (bei 0 beginnend)
  164. DLLEXPORT void removeChild(int i);
  165. //! entfernt alle childs (auf allen elementen in der Liste)
  166. DLLEXPORT void removeAllChilds();
  167. //! entfernt eine Liste mit childs (auf allen elementen in der
  168. //! Liste) \param childs alle Childs die entfernt werden sollen
  169. DLLEXPORT void removeChilds(RCArray<Element>* childs);
  170. //! entfernt dieses Element vom Eltern element (auf allen elementen
  171. //! in der Liste)
  172. DLLEXPORT void remove();
  173. //! setzt den Text in dem Element falls es keine childs gibt (auf
  174. //! allen elementen in der Liste) \param text dert Text
  175. DLLEXPORT void setText(Text text);
  176. //! Gibt ein Iterator durch alle Elemente zurück
  177. DLLEXPORT ArrayIterator<Element*> begin();
  178. //! Gibt das ende des iterators zurück
  179. DLLEXPORT ArrayIterator<Element*> end();
  180. //! Gibt einen selector zurück der alle elemente beinhaltet die in
  181. //! diesem selector vorkommen und rekursiv alle Kinder der elemente
  182. //! Enthält
  183. DLLEXPORT Editor selectAllElements();
  184. //! gibt einen selector zurück der alle childs beinhaltet
  185. DLLEXPORT Editor selectChildren() const;
  186. //! gibt einen selector zurück der alle parents beinhaltet
  187. DLLEXPORT Editor selectParents() const;
  188. //! gibt eine Liste mit elementen zurück, die einen bestimmten Namen
  189. //! haben \param name der name der Childs
  190. DLLEXPORT Editor whereNameEquals(Text name) const;
  191. //! gibt eine Liste mit elementen zurück, die ein bestimmtes child
  192. //! haben \param name der name des childs
  193. DLLEXPORT Editor whereChildWithNameExists(Text name) const;
  194. //! gibt eine Liste mit elementen zurück, die ein bestimmtes child
  195. //! haben \param attribute der name des attributes
  196. DLLEXPORT Editor whereChildWithAttributeExists(
  197. Text attribute) const;
  198. //! gibt eine Liste mit elementen zurück, die ein bestimmtes child
  199. //! haben \param attribute der name des attributes \param value der
  200. //! Wert des Attributes
  201. DLLEXPORT Editor whereChildWithAttributeExists(
  202. Text attribute, Text value) const;
  203. //! gibt eine Liste mit elementen zurück, die ein bestimmtes
  204. //! Attribut haben \param attribute der name des Attributes
  205. DLLEXPORT Editor whereAttributeExists(Text attribute) const;
  206. //! gibt eine Liste mit elementen zurück, die ein bestimmtes
  207. //! Attribut mit einem bestimmten wert haben \param attribute der
  208. //! name des Attributes \param value der Wert des Attributes
  209. DLLEXPORT Editor whereAttributeEquals(
  210. Text attribute, Text value) const;
  211. //! Gibt einen Editor zurück welcher nurnoch die Elemente enthält
  212. //! die nicht in e sind \param e Ein Editor mit elementen die nicht
  213. //! enthalten sein sollen
  214. DLLEXPORT Editor without(Editor e) const;
  215. //! Ruft eine funktion für jedes Element auf (nimmt als argument ein
  216. //! Element objekt ohne erhöhten reference Counter) \param f die
  217. //! funktion
  218. DLLEXPORT void forEach(std::function<void(Element*)> f) const;
  219. //! gibt 1 zurück, wenn mindestens ein Element gefunden wurde
  220. DLLEXPORT bool exists() const;
  221. //! gibt die anzahl der ausgewählten elemente zurück
  222. DLLEXPORT int getSize() const;
  223. //! assignment operator
  224. DLLEXPORT Editor& operator=(const Editor& e);
  225. };
  226. } // namespace XML
  227. } // namespace Framework