1 | /** @mainpage |
---|
2 | |
---|
3 | <h1> TinyXML </h1> |
---|
4 | |
---|
5 | TinyXML is a simple, small, C++ XML parser that can be easily |
---|
6 | integrated into other programs. |
---|
7 | |
---|
8 | <h2> What it does. </h2> |
---|
9 | |
---|
10 | In brief, TinyXML parses an XML document, and builds from that a |
---|
11 | Document Object Model (DOM) that can be read, modified, and saved. |
---|
12 | |
---|
13 | XML stands for "eXtensible Markup Language." It allows you to create |
---|
14 | your own document markups. Where HTML does a very good job of marking |
---|
15 | documents for browsers, XML allows you to define any kind of document |
---|
16 | markup, for example a document that describes a "to do" list for an |
---|
17 | organizer application. XML is a very structured and convenient format. |
---|
18 | All those random file formats created to store application data can |
---|
19 | all be replaced with XML. One parser for everything. |
---|
20 | |
---|
21 | The best place for the complete, correct, and quite frankly hard to |
---|
22 | read spec is at <a href="http://www.w3.org/TR/2004/REC-xml-20040204/"> |
---|
23 | http://www.w3.org/TR/2004/REC-xml-20040204/</a>. An intro to XML |
---|
24 | (that I really like) can be found at |
---|
25 | <a href="http://skew.org/xml/tutorial/">http://skew.org/xml/tutorial</a>. |
---|
26 | |
---|
27 | There are different ways to access and interact with XML data. |
---|
28 | TinyXML uses a Document Object Model (DOM), meaning the XML data is parsed |
---|
29 | into a C++ objects that can be browsed and manipulated, and then |
---|
30 | written to disk or another output stream. You can also construct an XML document |
---|
31 | from scratch with C++ objects and write this to disk or another output |
---|
32 | stream. |
---|
33 | |
---|
34 | TinyXML is designed to be easy and fast to learn. It is two headers |
---|
35 | and four cpp files. Simply add these to your project and off you go. |
---|
36 | There is an example file - xmltest.cpp - to get you started. |
---|
37 | |
---|
38 | TinyXML is released under the ZLib license, |
---|
39 | so you can use it in open source or commercial code. The details |
---|
40 | of the license are at the top of every source file. |
---|
41 | |
---|
42 | TinyXML attempts to be a flexible parser, but with truly correct and |
---|
43 | compliant XML output. TinyXML should compile on any reasonably C++ |
---|
44 | compliant system. It does not rely on exceptions or RTTI. It can be |
---|
45 | compiled with or without STL support. TinyXML fully supports |
---|
46 | the UTF-8 encoding, and the first 64k character entities. |
---|
47 | |
---|
48 | |
---|
49 | <h2> What it doesn't do. </h2> |
---|
50 | |
---|
51 | TinyXML doesn't parse or use DTDs (Document Type Definitions) or XSLs |
---|
52 | (eXtensible Stylesheet Language.) There are other parsers out there |
---|
53 | (check out www.sourceforge.org, search for XML) that are much more fully |
---|
54 | featured. But they are also much bigger, take longer to set up in |
---|
55 | your project, have a higher learning curve, and often have a more |
---|
56 | restrictive license. If you are working with browsers or have more |
---|
57 | complete XML needs, TinyXML is not the parser for you. |
---|
58 | |
---|
59 | The following DTD syntax will not parse at this time in TinyXML: |
---|
60 | |
---|
61 | @verbatim |
---|
62 | <!DOCTYPE Archiv [ |
---|
63 | <!ELEMENT Comment (#PCDATA)> |
---|
64 | ]> |
---|
65 | @endverbatim |
---|
66 | |
---|
67 | because TinyXML sees this as a !DOCTYPE node with an illegally |
---|
68 | embedded !ELEMENT node. This may be addressed in the future. |
---|
69 | |
---|
70 | <h2> Tutorials. </h2> |
---|
71 | |
---|
72 | For the impatient, here are some tutorials to get you going. A great way to get started, |
---|
73 | but it is worth your time to read this (very short) manual completely. |
---|
74 | |
---|
75 | - @subpage ticppTutorial |
---|
76 | - @subpage tutorial0 |
---|
77 | |
---|
78 | <h2> Code Status. </h2> |
---|
79 | |
---|
80 | TinyXML is mature, tested code. It is very stable. If you find |
---|
81 | bugs, please file a bug report on the sourceforge web site |
---|
82 | (www.sourceforge.net/projects/tinyxml). We'll get them straightened |
---|
83 | out as soon as possible. |
---|
84 | |
---|
85 | There are some areas of improvement; please check sourceforge if you are |
---|
86 | interested in working on TinyXML. |
---|
87 | |
---|
88 | <h2> Related Projects </h2> |
---|
89 | |
---|
90 | TinyXML projects you may find useful! (Descriptions provided by the projects.) |
---|
91 | |
---|
92 | <ul> |
---|
93 | <li> <b>TinyXPath</b> (http://tinyxpath.sourceforge.net). TinyXPath is a small footprint |
---|
94 | XPath syntax decoder, written in C++.</li> |
---|
95 | <li> <b>@subpage ticpp</b> (http://code.google.com/p/ticpp/). TinyXML++ is a completely new |
---|
96 | interface to TinyXML that uses MANY of the C++ strengths. Templates, |
---|
97 | exceptions, and much better error handling.</li> |
---|
98 | </ul> |
---|
99 | |
---|
100 | <h2> Features </h2> |
---|
101 | |
---|
102 | <h3> Using STL </h3> |
---|
103 | |
---|
104 | TinyXML can be compiled to use or not use STL. When using STL, TinyXML |
---|
105 | uses the std::string class, and fully supports std::istream, std::ostream, |
---|
106 | operator<<, and operator>>. Many API methods have both 'const char*' and |
---|
107 | 'const std::string&' forms. |
---|
108 | |
---|
109 | When STL support is compiled out, no STL files are included whatsoever. All |
---|
110 | the string classes are implemented by TinyXML itself. API methods |
---|
111 | all use the 'const char*' form for input. |
---|
112 | |
---|
113 | Use the compile time #define: |
---|
114 | |
---|
115 | TIXML_USE_STL |
---|
116 | |
---|
117 | to compile one version or the other. This can be passed by the compiler, |
---|
118 | or set as the first line of "tinyxml.h". |
---|
119 | |
---|
120 | Note: If compiling the test code in Linux, setting the environment |
---|
121 | variable TINYXML_USE_STL=YES/NO will control STL compilation. In the |
---|
122 | Windows project file, STL and non STL targets are provided. In your project, |
---|
123 | It's probably easiest to add the line "#define TIXML_USE_STL" as the first |
---|
124 | line of tinyxml.h. |
---|
125 | |
---|
126 | <h3> UTF-8 </h3> |
---|
127 | |
---|
128 | TinyXML supports UTF-8 allowing to manipulate XML files in any language. TinyXML |
---|
129 | also supports "legacy mode" - the encoding used before UTF-8 support and |
---|
130 | probably best described as "extended ascii". |
---|
131 | |
---|
132 | Normally, TinyXML will try to detect the correct encoding and use it. However, |
---|
133 | by setting the value of TIXML_DEFAULT_ENCODING in the header file, TinyXML |
---|
134 | can be forced to always use one encoding. |
---|
135 | |
---|
136 | TinyXML will assume Legacy Mode until one of the following occurs: |
---|
137 | <ol> |
---|
138 | <li> If the non-standard but common "UTF-8 lead bytes" (0xef 0xbb 0xbf) |
---|
139 | begin the file or data stream, TinyXML will read it as UTF-8. </li> |
---|
140 | <li> If the declaration tag is read, and it has an encoding="UTF-8", then |
---|
141 | TinyXML will read it as UTF-8. </li> |
---|
142 | <li> If the declaration tag is read, and it has no encoding specified, then TinyXML will |
---|
143 | read it as UTF-8. </li> |
---|
144 | <li> If the declaration tag is read, and it has an encoding="something else", then TinyXML |
---|
145 | will read it as Legacy Mode. In legacy mode, TinyXML will work as it did before. It's |
---|
146 | not clear what that mode does exactly, but old content should keep working.</li> |
---|
147 | <li> Until one of the above criteria is met, TinyXML runs in Legacy Mode.</li> |
---|
148 | </ol> |
---|
149 | |
---|
150 | What happens if the encoding is incorrectly set or detected? TinyXML will try |
---|
151 | to read and pass through text seen as improperly encoded. You may get some strange results or |
---|
152 | mangled characters. You may want to force TinyXML to the correct mode. |
---|
153 | |
---|
154 | You may force TinyXML to Legacy Mode by using LoadFile( TIXML_ENCODING_LEGACY ) or |
---|
155 | LoadFile( filename, TIXML_ENCODING_LEGACY ). You may force it to use legacy mode all |
---|
156 | the time by setting TIXML_DEFAULT_ENCODING = TIXML_ENCODING_LEGACY. Likewise, you may |
---|
157 | force it to TIXML_ENCODING_UTF8 with the same technique. |
---|
158 | |
---|
159 | For English users, using English XML, UTF-8 is the same as low-ASCII. You |
---|
160 | don't need to be aware of UTF-8 or change your code in any way. You can think |
---|
161 | of UTF-8 as a "superset" of ASCII. |
---|
162 | |
---|
163 | UTF-8 is not a double byte format - but it is a standard encoding of Unicode! |
---|
164 | TinyXML does not use or directly support wchar, TCHAR, or Microsoft's _UNICODE at this time. |
---|
165 | It is common to see the term "Unicode" improperly refer to UTF-16, a wide byte encoding |
---|
166 | of unicode. This is a source of confusion. |
---|
167 | |
---|
168 | For "high-ascii" languages - everything not English, pretty much - TinyXML can |
---|
169 | handle all languages, at the same time, as long as the XML is encoded |
---|
170 | in UTF-8. That can be a little tricky, older programs and operating systems |
---|
171 | tend to use the "default" or "traditional" code page. Many apps (and almost all |
---|
172 | modern ones) can output UTF-8, but older or stubborn (or just broken) ones |
---|
173 | still output text in the default code page. |
---|
174 | |
---|
175 | For example, Japanese systems traditionally use SHIFT-JIS encoding. |
---|
176 | Text encoded as SHIFT-JIS can not be read by TinyXML. |
---|
177 | A good text editor can import SHIFT-JIS and then save as UTF-8. |
---|
178 | |
---|
179 | The <a href="http://skew.org/xml/tutorial/">Skew.org link</a> does a great |
---|
180 | job covering the encoding issue. |
---|
181 | |
---|
182 | The test file "utf8test.xml" is an XML containing English, Spanish, Russian, |
---|
183 | and Simplified Chinese. (Hopefully they are translated correctly). The file |
---|
184 | "utf8test.gif" is a screen capture of the XML file, rendered in IE. Note that |
---|
185 | if you don't have the correct fonts (Simplified Chinese or Russian) on your |
---|
186 | system, you won't see output that matches the GIF file even if you can parse |
---|
187 | it correctly. Also note that (at least on my Windows machine) console output |
---|
188 | is in a Western code page, so that Print() or printf() cannot correctly display |
---|
189 | the file. This is not a bug in TinyXML - just an OS issue. No data is lost or |
---|
190 | destroyed by TinyXML. The console just doesn't render UTF-8. |
---|
191 | |
---|
192 | |
---|
193 | <h3> Entities </h3> |
---|
194 | TinyXML recognizes the pre-defined "character entities", meaning special |
---|
195 | characters. Namely: |
---|
196 | |
---|
197 | @verbatim |
---|
198 | & & |
---|
199 | < < |
---|
200 | > > |
---|
201 | " " |
---|
202 | ' ' |
---|
203 | @endverbatim |
---|
204 | |
---|
205 | These are recognized when the XML document is read, and translated to there |
---|
206 | UTF-8 equivalents. For instance, text with the XML of: |
---|
207 | |
---|
208 | @verbatim |
---|
209 | Far & Away |
---|
210 | @endverbatim |
---|
211 | |
---|
212 | will have the Value() of "Far & Away" when queried from the TiXmlText object, |
---|
213 | and will be written back to the XML stream/file as an ampersand. Older versions |
---|
214 | of TinyXML "preserved" character entities, but the newer versions will translate |
---|
215 | them into characters. |
---|
216 | |
---|
217 | Additionally, any character can be specified by its Unicode code point: |
---|
218 | The syntax " " or " " are both to the non-breaking space characher. |
---|
219 | |
---|
220 | <h3> Printing </h3> |
---|
221 | TinyXML can print output in several different ways that all have strengths and limitations. |
---|
222 | |
---|
223 | - Print( FILE* ). Output to a std-C stream, which includes all C files as well as stdout. |
---|
224 | - "Pretty prints", but you don't have control over printing options. |
---|
225 | - The output is streamed directly to the FILE object, so there is no memory overhead |
---|
226 | in the TinyXML code. |
---|
227 | - used by Print() and SaveFile() |
---|
228 | |
---|
229 | - operator<<. Output to a c++ stream. |
---|
230 | - Integrates with standart C++ iostreams. |
---|
231 | - Outputs in "network printing" mode without line breaks. Good for network transmission |
---|
232 | and moving XML between C++ objects, but hard for a human to read. |
---|
233 | |
---|
234 | - TiXmlPrinter. Output to a std::string or memory buffer. |
---|
235 | - API is less concise |
---|
236 | - Future printing options will be put here. |
---|
237 | - Printing may change slightly in future versions as it is refined and expanded. |
---|
238 | |
---|
239 | <h3> Streams </h3> |
---|
240 | With TIXML_USE_STL on TinyXML supports C++ streams (operator <<,>>) streams as well |
---|
241 | as C (FILE*) streams. There are some differences that you may need to be aware of. |
---|
242 | |
---|
243 | C style output: |
---|
244 | - based on FILE* |
---|
245 | - the Print() and SaveFile() methods |
---|
246 | |
---|
247 | Generates formatted output, with plenty of white space, intended to be as |
---|
248 | human-readable as possible. They are very fast, and tolerant of ill formed |
---|
249 | XML documents. For example, an XML document that contains 2 root elements |
---|
250 | and 2 declarations, will still print. |
---|
251 | |
---|
252 | C style input: |
---|
253 | - based on FILE* |
---|
254 | - the Parse() and LoadFile() methods |
---|
255 | |
---|
256 | A fast, tolerant read. Use whenever you don't need the C++ streams. |
---|
257 | |
---|
258 | C++ style output: |
---|
259 | - based on std::ostream |
---|
260 | - operator<< |
---|
261 | |
---|
262 | Generates condensed output, intended for network transmission rather than |
---|
263 | readability. Depending on your system's implementation of the ostream class, |
---|
264 | these may be somewhat slower. (Or may not.) Not tolerant of ill formed XML: |
---|
265 | a document should contain the correct one root element. Additional root level |
---|
266 | elements will not be streamed out. |
---|
267 | |
---|
268 | C++ style input: |
---|
269 | - based on std::istream |
---|
270 | - operator>> |
---|
271 | |
---|
272 | Reads XML from a stream, making it useful for network transmission. The tricky |
---|
273 | part is knowing when the XML document is complete, since there will almost |
---|
274 | certainly be other data in the stream. TinyXML will assume the XML data is |
---|
275 | complete after it reads the root element. Put another way, documents that |
---|
276 | are ill-constructed with more than one root element will not read correctly. |
---|
277 | Also note that operator>> is somewhat slower than Parse, due to both |
---|
278 | implementation of the STL and limitations of TinyXML. |
---|
279 | |
---|
280 | <h3> White space </h3> |
---|
281 | The world simply does not agree on whether white space should be kept, or condensed. |
---|
282 | For example, pretend the '_' is a space, and look at "Hello____world". HTML, and |
---|
283 | at least some XML parsers, will interpret this as "Hello_world". They condense white |
---|
284 | space. Some XML parsers do not, and will leave it as "Hello____world". (Remember |
---|
285 | to keep pretending the _ is a space.) Others suggest that __Hello___world__ should become |
---|
286 | Hello___world. |
---|
287 | |
---|
288 | It's an issue that hasn't been resolved to my satisfaction. TinyXML supports the |
---|
289 | first 2 approaches. Call TiXmlBase::SetCondenseWhiteSpace( bool ) to set the desired behavior. |
---|
290 | The default is to condense white space. |
---|
291 | |
---|
292 | If you change the default, you should call TiXmlBase::SetCondenseWhiteSpace( bool ) |
---|
293 | before making any calls to Parse XML data, and I don't recommend changing it after |
---|
294 | it has been set. |
---|
295 | |
---|
296 | |
---|
297 | <h3> Handles </h3> |
---|
298 | |
---|
299 | Where browsing an XML document in a robust way, it is important to check |
---|
300 | for null returns from method calls. An error safe implementation can |
---|
301 | generate a lot of code like: |
---|
302 | |
---|
303 | @verbatim |
---|
304 | TiXmlElement* root = document.FirstChildElement( "Document" ); |
---|
305 | if ( root ) |
---|
306 | { |
---|
307 | TiXmlElement* element = root->FirstChildElement( "Element" ); |
---|
308 | if ( element ) |
---|
309 | { |
---|
310 | TiXmlElement* child = element->FirstChildElement( "Child" ); |
---|
311 | if ( child ) |
---|
312 | { |
---|
313 | TiXmlElement* child2 = child->NextSiblingElement( "Child" ); |
---|
314 | if ( child2 ) |
---|
315 | { |
---|
316 | // Finally do something useful. |
---|
317 | @endverbatim |
---|
318 | |
---|
319 | Handles have been introduced to clean this up. Using the TiXmlHandle class, |
---|
320 | the previous code reduces to: |
---|
321 | |
---|
322 | @verbatim |
---|
323 | TiXmlHandle docHandle( &document ); |
---|
324 | TiXmlElement* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", 1 ).ToElement(); |
---|
325 | if ( child2 ) |
---|
326 | { |
---|
327 | // do something useful |
---|
328 | @endverbatim |
---|
329 | |
---|
330 | Which is much easier to deal with. See TiXmlHandle for more information. |
---|
331 | |
---|
332 | |
---|
333 | <h3> Row and Column tracking </h3> |
---|
334 | Being able to track nodes and attributes back to their origin location |
---|
335 | in source files can be very important for some applications. Additionally, |
---|
336 | knowing where parsing errors occured in the original source can be very |
---|
337 | time saving. |
---|
338 | |
---|
339 | TinyXML can tracks the row and column origin of all nodes and attributes |
---|
340 | in a text file. The TiXmlBase::Row() and TiXmlBase::Column() methods return |
---|
341 | the origin of the node in the source text. The correct tabs can be |
---|
342 | configured in TiXmlDocument::SetTabSize(). |
---|
343 | |
---|
344 | |
---|
345 | <h2> Using and Installing </h2> |
---|
346 | |
---|
347 | To Compile and Run xmltest: |
---|
348 | |
---|
349 | A Linux Makefile and a Windows Visual C++ .dsw file is provided. |
---|
350 | Simply compile and run. It will write the file demotest.xml to your |
---|
351 | disk and generate output on the screen. It also tests walking the |
---|
352 | DOM by printing out the number of nodes found using different |
---|
353 | techniques. |
---|
354 | |
---|
355 | The Linux makefile is very generic and runs on many systems - it |
---|
356 | is currently tested on mingw and |
---|
357 | MacOSX. You do not need to run 'make depend'. The dependecies have been |
---|
358 | hard coded. |
---|
359 | |
---|
360 | <h3>Windows project file for VC6</h3> |
---|
361 | <ul> |
---|
362 | <li>tinyxml: tinyxml library, non-STL </li> |
---|
363 | <li>tinyxmlSTL: tinyxml library, STL </li> |
---|
364 | <li>tinyXmlTest: test app, non-STL </li> |
---|
365 | <li>tinyXmlTestSTL: test app, STL </li> |
---|
366 | </ul> |
---|
367 | |
---|
368 | <h3>Makefile</h3> |
---|
369 | At the top of the makefile you can set: |
---|
370 | |
---|
371 | PROFILE, DEBUG, and TINYXML_USE_STL. Details (such that they are) are in |
---|
372 | the makefile. |
---|
373 | |
---|
374 | In the tinyxml directory, type "make clean" then "make". The executable |
---|
375 | file 'xmltest' will be created. |
---|
376 | |
---|
377 | |
---|
378 | |
---|
379 | <h3>To Use in an Application:</h3> |
---|
380 | |
---|
381 | Add tinyxml.cpp, tinyxml.h, tinyxmlerror.cpp, tinyxmlparser.cpp, tinystr.cpp, and tinystr.h to your |
---|
382 | project or make file. That's it! It should compile on any reasonably |
---|
383 | compliant C++ system. You do not need to enable exceptions or |
---|
384 | RTTI for TinyXML. |
---|
385 | |
---|
386 | |
---|
387 | <h2> How TinyXML works. </h2> |
---|
388 | |
---|
389 | An example is probably the best way to go. Take: |
---|
390 | @verbatim |
---|
391 | <?xml version="1.0" standalone=no> |
---|
392 | <!-- Our to do list data --> |
---|
393 | <ToDo> |
---|
394 | <Item priority="1"> Go to the <bold>Toy store!</bold></Item> |
---|
395 | <Item priority="2"> Do bills</Item> |
---|
396 | </ToDo> |
---|
397 | @endverbatim |
---|
398 | |
---|
399 | Its not much of a To Do list, but it will do. To read this file |
---|
400 | (say "demo.xml") you would create a document, and parse it in: |
---|
401 | @verbatim |
---|
402 | TiXmlDocument doc( "demo.xml" ); |
---|
403 | doc.LoadFile(); |
---|
404 | @endverbatim |
---|
405 | |
---|
406 | And its ready to go. Now lets look at some lines and how they |
---|
407 | relate to the DOM. |
---|
408 | |
---|
409 | @verbatim |
---|
410 | <?xml version="1.0" standalone=no> |
---|
411 | @endverbatim |
---|
412 | |
---|
413 | The first line is a declaration, and gets turned into the |
---|
414 | TiXmlDeclaration class. It will be the first child of the |
---|
415 | document node. |
---|
416 | |
---|
417 | This is the only directive/special tag parsed by by TinyXML. |
---|
418 | Generally directive tags are stored in TiXmlUnknown so the |
---|
419 | commands wont be lost when it is saved back to disk. |
---|
420 | |
---|
421 | @verbatim |
---|
422 | <!-- Our to do list data --> |
---|
423 | @endverbatim |
---|
424 | |
---|
425 | A comment. Will become a TiXmlComment object. |
---|
426 | |
---|
427 | @verbatim |
---|
428 | <ToDo> |
---|
429 | @endverbatim |
---|
430 | |
---|
431 | The "ToDo" tag defines a TiXmlElement object. This one does not have |
---|
432 | any attributes, but does contain 2 other elements. |
---|
433 | |
---|
434 | @verbatim |
---|
435 | <Item priority="1"> |
---|
436 | @endverbatim |
---|
437 | |
---|
438 | Creates another TiXmlElement which is a child of the "ToDo" element. |
---|
439 | This element has 1 attribute, with the name "priority" and the value |
---|
440 | "1". |
---|
441 | |
---|
442 | @verbatim |
---|
443 | Go to the |
---|
444 | @endverbatim |
---|
445 | |
---|
446 | A TiXmlText. This is a leaf node and cannot contain other nodes. |
---|
447 | It is a child of the "Item" TiXmlElement. |
---|
448 | |
---|
449 | @verbatim |
---|
450 | <bold> |
---|
451 | @endverbatim |
---|
452 | |
---|
453 | |
---|
454 | Another TiXmlElement, this one a child of the "Item" element. |
---|
455 | |
---|
456 | Etc. |
---|
457 | |
---|
458 | Looking at the entire object tree, you end up with: |
---|
459 | @verbatim |
---|
460 | TiXmlDocument "demo.xml" |
---|
461 | TiXmlDeclaration "version='1.0'" "standalone=no" |
---|
462 | TiXmlComment " Our to do list data" |
---|
463 | TiXmlElement "ToDo" |
---|
464 | TiXmlElement "Item" Attribtutes: priority = 1 |
---|
465 | TiXmlText "Go to the " |
---|
466 | TiXmlElement "bold" |
---|
467 | TiXmlText "Toy store!" |
---|
468 | TiXmlElement "Item" Attributes: priority=2 |
---|
469 | TiXmlText "Do bills" |
---|
470 | @endverbatim |
---|
471 | |
---|
472 | <h2> Documentation </h2> |
---|
473 | |
---|
474 | The documentation is build with Doxygen, using the 'dox' |
---|
475 | configuration file. |
---|
476 | |
---|
477 | <h2> License </h2> |
---|
478 | |
---|
479 | TinyXML is released under the zlib license: |
---|
480 | |
---|
481 | This software is provided 'as-is', without any express or implied |
---|
482 | warranty. In no event will the authors be held liable for any |
---|
483 | damages arising from the use of this software. |
---|
484 | |
---|
485 | Permission is granted to anyone to use this software for any |
---|
486 | purpose, including commercial applications, and to alter it and |
---|
487 | redistribute it freely, subject to the following restrictions: |
---|
488 | |
---|
489 | 1. The origin of this software must not be misrepresented; you must |
---|
490 | not claim that you wrote the original software. If you use this |
---|
491 | software in a product, an acknowledgment in the product documentation |
---|
492 | would be appreciated but is not required. |
---|
493 | |
---|
494 | 2. Altered source versions must be plainly marked as such, and |
---|
495 | must not be misrepresented as being the original software. |
---|
496 | |
---|
497 | 3. This notice may not be removed or altered from any source |
---|
498 | distribution. |
---|
499 | |
---|
500 | <h2> References </h2> |
---|
501 | |
---|
502 | The World Wide Web Consortium is the definitive standard body for |
---|
503 | XML, and there web pages contain huge amounts of information. |
---|
504 | |
---|
505 | The definitive spec: <a href="http://www.w3.org/TR/2004/REC-xml-20040204/"> |
---|
506 | http://www.w3.org/TR/2004/REC-xml-20040204/</a> |
---|
507 | |
---|
508 | I also recommend "XML Pocket Reference" by Robert Eckstein and published by |
---|
509 | OReilly...the book that got the whole thing started. |
---|
510 | |
---|
511 | <h2> Contributors, Contacts, and a Brief History </h2> |
---|
512 | |
---|
513 | Thanks very much to everyone who sends suggestions, bugs, ideas, and |
---|
514 | encouragement. It all helps, and makes this project fun. A special thanks |
---|
515 | to the contributors on the web pages that keep it lively. |
---|
516 | |
---|
517 | So many people have sent in bugs and ideas, that rather than list here |
---|
518 | we try to give credit due in the "changes.txt" file. |
---|
519 | |
---|
520 | TinyXML was originally written by Lee Thomason. (Often the "I" still |
---|
521 | in the documentation.) Lee reviews changes and releases new versions, |
---|
522 | with the help of Yves Berquin, Andrew Ellerton, and the tinyXml community. |
---|
523 | |
---|
524 | We appreciate your suggestions, and would love to know if you |
---|
525 | use TinyXML. Hopefully you will enjoy it and find it useful. |
---|
526 | Please post questions, comments, file bugs, or contact us at: |
---|
527 | |
---|
528 | www.sourceforge.net/projects/tinyxml |
---|
529 | |
---|
530 | Lee Thomason, Yves Berquin, Andrew Ellerton |
---|
531 | */ |
---|