-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathXml.h
More file actions
334 lines (285 loc) · 11.4 KB
/
Xml.h
File metadata and controls
334 lines (285 loc) · 11.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
/************************************
*Author: Thomas Dost
*Datum: 04.04.2015
*Beschr. Wrapper um tinyxml2 um einfachere Bedienung zu ermoeglichen
*Changelog:
Klasse ist nun Funktionsfaehig
XmlElement hinzugefuegt
Conversion Konstruktor fuer XmlElement hinzugefuegt
Funktion aus tinyxml2 zu eigener Klasse hinzugefuegt
--operator und ++ operator hinzugefuegt
getValue hinzugefuegt
isNull hinzugefuegt
Code auskommentiert
getNodeName hinzugefuegt.
14.06.2016
Programm beendet sich nun falls Datei nicht geladen werden kann.
XmlElement operator[] hinzugefuegt
XmlElement firstChildElelemt hinzugefuegt
Xml rootElement hiznugefuegt
15.06.2016
Vermeindlichen CopyCtor hinzugeufuegt
print() -> print() const
20.01.2017
saveFiles gibt jetzt einen Statuswert zurueck ob das Speichern erfolgreich war.
XmlElement operator[] benutzt jetzt XmlElement::firstChildNode stat tinyxml2::firstChildNote
const XMLDocument& getTmxDoc() const hinzugefuegt
01.02.2017
XmlElement(XMLElement& rhs) geloescht
using filepath = const std::string&, using int32 = int_fast32_t hinzugefuegt damit die Header bis auf
tinyXml2 eigenstaendig ist.
*TODO:
Methoden der tinyxml XMLElement Klasse implementieren
http://www.grinninglizard.com/tinyxml2docs/classtinyxml2_1_1_x_m_l_element.html
Sichbarkeit anpassen
Ueberlegen ob alle Klassen eine toXML Funktion erhalten mit
der man sehr einfach den Inhalt dieser Klassen in einer Datei abspeichern kann,
und ob man die dazu passende Ladefunktion hinzufuegen sollte.
PreviousElement failt falls mNode nullptr ist
wie soll das behandelt werden?gar nichts tun? oder Fehlermeldung? Gute Behandlung ausdenken!
toInt(), toDouble(), to... implementieren.
CopyCtr, copy assign ctor fuer XmlElement. Xml schreiben falls moeglich, vielleicht auch den move ctor
Xml Arguemnts support
Tests prorammieren
Component Xml iterieren
LastChildElement
getElemName sollte ne Ref. zurückgeben
Getter und Setter sollte thrown falls der zugegriffene Node null ist
Hab so das Gefühle das die Setter failen, da getFirstChild und operator[] keine Ref, zurückgeben
*************************************/
/***************************************************
*
***************************************************/
#pragma once
#include <string>
#include <iostream>
#include "tinyxml2/tinyxml2.h"
namespace eng
{
using namespace tinyxml2;
using filepath = const std::string&;
using int32 = int_fast32_t;
/*! A test class, document with cmake*/
class XmlElement
{
public:
/********************************************//**
*Conversion Constructor fuer XMLElement Ptr die von allen tinyxml2 funktionen zurueckgegeben werden,
die mit XMLElelement arbeiten
*@param Pointer auf ein XMLElement
***********************************************/
XmlElement(XMLElement* rhs)
{
mNode = rhs;
}
/********************************************//**
*Wert einer XML Node setzen
*@param Wert der gesetzt werden soll;
***********************************************/
void setValue(const std::string& value)
{
if(mNode != nullptr)
{
mNode->SetText(value.c_str());
}
}
void setValue(const double value)
{
if(mNode != nullptr)
{
setValue(std::to_string(value));
}
}
void setValue(const int32 value)
{
if(mNode != nullptr)
{
setValue(std::to_string(value));
}
}
/**********************************************//**
*Funktion um auf Elementinhalt zu zugreifen
*\return Falls mNode == nullptr -> leerer String, sonst Inhalt des Elements
***********************************************/
const std::string getValue() const
{
if(mNode != nullptr)
{
return mNode->GetText();
}
return "";
}
/**********************************************//**
*Funktion um auf Namen einer Node zu aendern
***********************************************/
void setName(const std::string& name)
{
if(mNode != nullptr)
{
mNode->SetName(name.c_str());
}
}
/*********************************************//**
*Funktion um auf Nodename zu zugreifen
*\return Falls mNode == nullptr -> leerer String, sonst Name der Node auf die gezeigt wird
***********************************************/
const std::string getElemName() const
{
if(mNode != nullptr)
{
return mNode->Name();
}
return "";
}
/**********************************************//**
*Setzt den mNode auf das naechste Xml Element auf gleicher Ebene.
*\return Das naechste Element auf gleicher Ebene, falls keine Element vorhanden ist wird mNode zu einen nullptr
***********************************************/
XmlElement& operator++()
{
mNode = mNode->NextSiblingElement();
return *this;
}
/**********************************************//**
*Setzt den mNode auf das vorherige Xml Element auf gleicher Ebene.
*\return Das voherige Element auf gleicher Ebene, falls keine Element vorhanden ist wird mNode zu einen nullptr
***********************************************/
XmlElement& operator--()
{
mNode = mNode->PreviousSiblingElement();
return *this;
}
/********************************************//**
*Checkt ob mNode auf ein Xml Element zeigt
*\return True falls auf ein Element gezeigt wird, sonst false.
***********************************************/
bool isNotNull() const
{
if(mNode == nullptr)
{
return false;
}
return true;
}
/********************************************//**
***********************************************/
const XmlElement firstChildElement(const std::string& ident = "") const
{
//Um die funktionsweise von tinyXml2 zu simulieren
//muss beim Fehlen eines Elem. Names eine 0 uebergeben werden.
if(ident == "")
return mNode->FirstChildElement(nullptr);
return mNode->FirstChildElement(ident.c_str());
}
/********************************************//**
***********************************************/
const XmlElement operator[](const std::string& ident) const
{
return firstChildElement(ident);
}
/********************************************//**
***********************************************/
XMLElement* getXMLElement()
{
return mNode;
}
private:
XMLElement* mNode;
};
/******************************************************************************************************************************************
*******************************************************************************************************************************************
*******************************************************************************************************************************************/
/*!Klasse zum einfacheren Verwalten von XML Dateien
Diese Klasse ermöglicht das Öffnen, Schließen und Bearbeiten vom XML Dateien
*/
class Xml
{
public:
/*************************************************//**
*Standart Konstruktor, zum initialiseren der Klasese wird in disem Fall
*die init() Methode verwendet
***************************************************/
Xml() {}
/************************************************//**
*Konstruktor um ein Xml Dokument zu laden
*************************************************/
Xml(filepath filepath) : mPath(filepath)
{
//Checkt ob das Dokument geladen werden konnte
if(mDoc.LoadFile(filepath.c_str()) != XML_ERROR_FILE_NOT_FOUND)
{
//TODO Sowohl bei Erfolg als auch bei Fehler sollte keine Nachricht aussgegeben sondern was anderes gemacht werden
std::cout << "Die Datei:" << filepath << " ERFOLGREICH geladen werden" << std::endl;
}
else
{
std::cerr << "Die Datei:" << filepath << " konnte nicht GELADEN werden" << std::endl;
//Programm beenden
exit(-1);
}
}
bool init(filepath filepath)
{
//Checkt ob das Dokument geladen werden konnte
if(mDoc.LoadFile(filepath.c_str()) != XML_ERROR_FILE_NOT_FOUND)
{
mPath = filepath;
//TODO Sowohl bei Erfolg als auch bei Fehler sollte keine Nachricht aussgegeben sondern was anderes gemacht werden
return true;
}
else
{
return false;
}
}
/**********************************************
*Copy Konstruktor
***********************************************/
// Xml(const Xml& rhs) :
// mPath(rhs.mPath)
// {
// mDoc.s rhs.mDoc.GetDocument();
// print();
// }
/********************************************//**
*Gibt das ganze Xml Dokument aus
***********************************************/
void print() const
{
mDoc.Print();
}
/********************************************//**
* Speichert das XmlDokument
***********************************************/
bool saveFile()
{
return mDoc.SaveFile(mPath.c_str());
}
/**********************************************
*Gibt das rootElement zurueck
*\return RootElement aka das Element auf hoechster Ebene
*Beispiel
*<options>
* <resX>1920</resX>
* <resY>1200</resY>
*</options>
*Returnwert waere options
***********************************************/
XmlElement rootElement()
{
XmlElement temp = mDoc.RootElement();
return temp;
}
const XMLDocument& getTmxDoc() const
{
return mDoc;
}
private:
XMLDocument mDoc;
std::string mPath;
};
}
/* ATTRIBUTES BEIIIIIIISPIEL
eng::XmlElement test1 = xml.mDoc.FirstChildElement( "options" )->FirstChildElement("note");
std::cout << test1.getNodeName() << test1.mNode->FirstAttribute()->Name() <<std::endl;
*/