blob: 485e00fc8454554869d33ecfbaddcfa514050baa [file] [log] [blame] [view]
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +04001TinyXML-2
2=========
Lee Thomason16881142013-09-12 23:53:08 -07003![TinyXML-2 Logo](http://www.grinninglizard.com/tinyxml2/TinyXML2_small.png)
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -08004
Vasily Biryukov9a975b72013-05-11 21:41:42 +06005TinyXML-2 is a simple, small, efficient, C++ XML parser that can be
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -08006easily integrated into other programs.
7
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -08008The master is hosted on github:
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +04009https://github.com/leethomason/tinyxml2
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -080010
Lee Thomason (grinliz)6a22be22012-04-04 12:39:05 -070011The online HTML version of these docs:
12http://grinninglizard.com/tinyxml2docs/index.html
13
Lee Thomason (grinliz)ae209f62012-04-04 22:00:07 -070014Examples are in the "related pages" tab of the HTML docs.
Lee Thomason (grinliz)6a22be22012-04-04 12:39:05 -070015
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +040016What it does.
17-------------
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -080018
Vasily Biryukov9a975b72013-05-11 21:41:42 +060019In brief, TinyXML-2 parses an XML document, and builds from that a
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -080020Document Object Model (DOM) that can be read, modified, and saved.
21
22XML stands for "eXtensible Markup Language." It is a general purpose
23human and machine readable markup language to describe arbitrary data.
24All those random file formats created to store application data can
25all be replaced with XML. One parser for everything.
26
27http://en.wikipedia.org/wiki/XML
28
29There are different ways to access and interact with XML data.
30TinyXML-2 uses a Document Object Model (DOM), meaning the XML data is parsed
31into a C++ objects that can be browsed and manipulated, and then
32written to disk or another output stream. You can also construct an XML document
33from scratch with C++ objects and write this to disk or another output
34stream. You can even use TinyXML-2 to stream XML programmatically from
35code without creating a document first.
36
37TinyXML-2 is designed to be easy and fast to learn. It is one header and
38one cpp file. Simply add these to your project and off you go.
39There is an example file - xmltest.cpp - to get you started.
40
41TinyXML-2 is released under the ZLib license,
42so you can use it in open source or commercial code. The details
43of the license are at the top of every source file.
44
45TinyXML-2 attempts to be a flexible parser, but with truly correct and
46compliant XML output. TinyXML-2 should compile on any reasonably C++
47compliant system. It does not rely on exceptions, RTTI, or the STL.
48
Kevin Wojniak273f7b42013-01-09 09:21:13 -080049What it doesn't do.
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +040050-------------------
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -080051
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -080052TinyXML-2 doesn't parse or use DTDs (Document Type Definitions) or XSLs
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -080053(eXtensible Stylesheet Language.) There are other parsers out there
Lee Thomason61871d62013-12-05 11:44:38 -080054that are much more fully featured. But they are also much bigger,
55take longer to set up in your project, have a higher learning curve,
56and often have a more restrictive license. If you are working with
57browsers or have more complete XML needs, TinyXML-2 is not the parser for you.
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -080058
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +040059TinyXML-1 vs. TinyXML-2
60-----------------------
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -080061
Lee Thomason74a81cf2013-09-12 23:59:43 -070062TinyXML-2 is now the focus of all development, well tested, and your
63best choice unless you have a requirement to maintain TinyXML-1 code.
64
65TinyXML-2 uses a similar API to TinyXML-1 and the same
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -080066rich test cases. But the implementation of the parser is completely re-written
67to make it more appropriate for use in a game. It uses less memory, is faster,
Kevin Wojniak273f7b42013-01-09 09:21:13 -080068and uses far fewer memory allocations.
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -080069
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -080070TinyXML-2 has no requirement for STL, but has also dropped all STL support. All
71strings are query and set as 'const char*'. This allows the use of internal
72allocators, and keeps the code much simpler.
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -080073
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -080074Both parsers:
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +040075
761. Simple to use with similar APIs.
772. DOM based parser.
783. UTF-8 Unicode support. http://en.wikipedia.org/wiki/UTF-8
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -080079
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -080080Advantages of TinyXML-2
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +040081
821. The focus of all future dev.
832. Many fewer memory allocation (1/10th to 1/100th), uses less memory
84 (about 40% of TinyXML-1), and faster.
853. No STL requirement.
864. More modern C++, including a proper namespace.
875. Proper and useful handling of whitespace
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -080088
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -080089Advantages of TinyXML-1
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -080090
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +0400911. Can report the location of parsing errors.
922. Support for some C++ STL conventions: streams and strings
933. Very mature and well debugged code base.
94
95Features
96--------
97
98### Memory Model
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -080099
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -0800100An XMLDocument is a C++ object like any other, that can be on the stack, or
101new'd and deleted on the heap.
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800102
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -0800103However, any sub-node of the Document, XMLElement, XMLText, etc, can only
104be created by calling the appropriate XMLDocument::NewElement, NewText, etc.
105method. Although you have pointers to these objects, they are still owned
106by the Document. When the Document is deleted, so are all the nodes it contains.
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800107
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +0400108### White Space
Lee Thomason (grinliz)ec7777e2012-02-26 20:51:27 -0800109
Lee Thomason (grinliz)9b6011c2012-09-09 19:12:06 -0700110#### Whitespace Preservation (default)
111
Lee Thomason (grinliz)ec7777e2012-02-26 20:51:27 -0800112Microsoft has an excellent article on white space: http://msdn.microsoft.com/en-us/library/ms256097.aspx
113
Lee Thomason (grinliz)c5defa62012-09-08 22:06:14 -0700114By default, TinyXML-2 preserves white space in a (hopefully) sane way that is almost complient with the
Lee Thomason (grinliz)9b6011c2012-09-09 19:12:06 -0700115spec. (TinyXML-1 used a completely different model, much more similar to 'collapse', below.)
Lee Thomason (grinliz)ec7777e2012-02-26 20:51:27 -0800116
117As a first step, all newlines / carriage-returns / line-feeds are normalized to a
118line-feed character, as required by the XML spec.
119
120White space in text is preserved. For example:
Lee Thomason12d5a032012-02-29 16:19:03 -0800121
Lee Thomason (grinliz)ec7777e2012-02-26 20:51:27 -0800122 <element> Hello, World</element>
Lee Thomason (grinliz)ec7777e2012-02-26 20:51:27 -0800123
Lee Thomasonc50b6b42012-03-24 12:51:47 -0700124The leading space before the "Hello" and the double space after the comma are
125preserved. Line-feeds are preserved, as in this example:
Lee Thomason (grinliz)ec7777e2012-02-26 20:51:27 -0800126
Lee Thomason (grinliz)ec7777e2012-02-26 20:51:27 -0800127 <element> Hello again,
128 World</element>
Lee Thomason (grinliz)ec7777e2012-02-26 20:51:27 -0800129
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +0400130However, white space between elements is **not** preserved. Although not strictly
Lee Thomasonc50b6b42012-03-24 12:51:47 -0700131compliant, tracking and reporting inter-element space is awkward, and not normally
132valuable. TinyXML-2 sees these as the same XML:
Lee Thomason (grinliz)ec7777e2012-02-26 20:51:27 -0800133
Lee Thomason12d5a032012-02-29 16:19:03 -0800134 <document>
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +0400135 <data>1</data>
136 <data>2</data>
137 <data>3</data>
Lee Thomason12d5a032012-02-29 16:19:03 -0800138 </document>
Lee Thomason (grinliz)ec7777e2012-02-26 20:51:27 -0800139
Lee Thomason12d5a032012-02-29 16:19:03 -0800140 <document><data>1</data><data>2</data><data>3</data></document>
Lee Thomason (grinliz)ec7777e2012-02-26 20:51:27 -0800141
Lee Thomason (grinliz)c5defa62012-09-08 22:06:14 -0700142#### Whitespace Collapse
143
Lee Thomason (grinliz)9b6011c2012-09-09 19:12:06 -0700144For some applications, it is preferable to collapse whitespace. Collapsing
145whitespace gives you "HTML-like" behavior, which is sometimes more suitable
146for hand typed documents.
147
148TinyXML-2 supports this with the 'whitespace' parameter to the XMLDocument constructor.
Lee Thomason (grinliz)c5defa62012-09-08 22:06:14 -0700149(The default is to preserve whitespace, as described above.)
150
151However, you may also use COLLAPSE_WHITESPACE, which will:
152
Lee Thomason (grinliz)9b6011c2012-09-09 19:12:06 -0700153* Remove leading and trailing whitespace
154* Convert newlines and line-feeds into a space character
155* Collapse a run of any number of space characters into a single space character
Lee Thomason (grinliz)c5defa62012-09-08 22:06:14 -0700156
157Note that (currently) there is a performance impact for using COLLAPSE_WHITESPACE.
158It essentially causes the XML to be parsed twice.
159
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +0400160### Entities
161
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -0800162TinyXML-2 recognizes the pre-defined "character entities", meaning special
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800163characters. Namely:
164
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800165 &amp; &
166 &lt; <
167 &gt; >
168 &quot; "
169 &apos; '
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800170
Dennis Jenkins68a1c932013-10-25 23:01:34 -0500171These are recognized when the XML document is read, and translated to their
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800172UTF-8 equivalents. For instance, text with the XML of:
173
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800174 Far &amp; Away
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800175
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -0800176will have the Value() of "Far & Away" when queried from the XMLText object,
177and will be written back to the XML stream/file as an ampersand.
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800178
179Additionally, any character can be specified by its Unicode code point:
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -0800180The syntax "&#xA0;" or "&#160;" are both to the non-breaking space characher.
181This is called a 'numeric character reference'. Any numeric character reference
182that isn't one of the special entities above, will be read, but written as a
183regular code point. The output is correct, but the entity syntax isn't preserved.
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800184
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +0400185### Printing
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800186
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +0400187#### Print to file
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -0800188You can directly use the convenience function:
Lee Thomason12d5a032012-02-29 16:19:03 -0800189
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -0800190 XMLDocument doc;
191 ...
Lee Thomason77d7f202012-07-29 18:51:41 -0700192 doc.SaveFile( "foo.xml" );
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800193
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -0800194Or the XMLPrinter class:
Lee Thomason12d5a032012-02-29 16:19:03 -0800195
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -0800196 XMLPrinter printer( fp );
197 doc.Print( &printer );
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800198
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +0400199#### Print to memory
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -0800200Printing to memory is supported by the XMLPrinter.
Lee Thomason12d5a032012-02-29 16:19:03 -0800201
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -0800202 XMLPrinter printer;
Vasily Biryukov9a975b72013-05-11 21:41:42 +0600203 doc.Print( &printer );
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -0800204 // printer.CStr() has a const char* to the XML
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800205
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +0400206#### Print without an XMLDocument
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800207
Lee Thomason12d5a032012-02-29 16:19:03 -0800208When loading, an XML parser is very useful. However, sometimes
209when saving, it just gets in the way. The code is often set up
210for streaming, and constructing the DOM is just overhead.
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800211
Lee Thomason12d5a032012-02-29 16:19:03 -0800212The Printer supports the streaming case. The following code
213prints out a trivially simple XML file without ever creating
214an XML document.
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800215
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -0800216 XMLPrinter printer( fp );
217 printer.OpenElement( "foo" );
218 printer.PushAttribute( "foo", "bar" );
219 printer.CloseElement();
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800220
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +0400221Examples
222--------
Lee Thomason87e475a2012-03-20 11:55:29 -0700223
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +0400224#### Load and parse an XML file.
225
Lee Thomason87e475a2012-03-20 11:55:29 -0700226 /* ------ Example 1: Load and parse an XML file. ---- */
227 {
228 XMLDocument doc;
229 doc.LoadFile( "dream.xml" );
230 }
Lee Thomason87e475a2012-03-20 11:55:29 -0700231
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +0400232#### Lookup information.
233
Lee Thomason87e475a2012-03-20 11:55:29 -0700234 /* ------ Example 2: Lookup information. ---- */
235 {
236 XMLDocument doc;
237 doc.LoadFile( "dream.xml" );
238
239 // Structure of the XML file:
Lee Thomasonc50b6b42012-03-24 12:51:47 -0700240 // - Element "PLAY" the root Element, which is the
241 // FirstChildElement of the Document
242 // - - Element "TITLE" child of the root PLAY Element
243 // - - - Text child of the TITLE Element
Lee Thomason87e475a2012-03-20 11:55:29 -0700244
Lee Thomasonc50b6b42012-03-24 12:51:47 -0700245 // Navigate to the title, using the convenience function,
246 // with a dangerous lack of error checking.
Lee Thomason87e475a2012-03-20 11:55:29 -0700247 const char* title = doc.FirstChildElement( "PLAY" )->FirstChildElement( "TITLE" )->GetText();
248 printf( "Name of play (1): %s\n", title );
249
Lee Thomasonc50b6b42012-03-24 12:51:47 -0700250 // Text is just another Node to TinyXML-2. The more
251 // general way to get to the XMLText:
Lee Thomason87e475a2012-03-20 11:55:29 -0700252 XMLText* textNode = doc.FirstChildElement( "PLAY" )->FirstChildElement( "TITLE" )->FirstChild()->ToText();
253 title = textNode->Value();
254 printf( "Name of play (2): %s\n", title );
255 }
Lee Thomason87e475a2012-03-20 11:55:29 -0700256
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +0400257Using and Installing
258--------------------
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800259
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -0800260There are 2 files in TinyXML-2:
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +0400261* tinyxml2.cpp
262* tinyxml2.h
263
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -0800264And additionally a test file:
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +0400265* xmltest.cpp
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800266
Lee Thomason2f6e4762012-04-05 08:52:07 -0700267Simply compile and run. There is a visual studio 2010 project included, a simple Makefile,
Guillaume Pd60fe352013-05-12 15:11:37 +0200268an XCode project, a Code::Blocks project, and a cmake CMakeLists.txt included to help you.
269The top of tinyxml.h even has a simple g++ command line if you are are *nix and don't want
270to use a build system.
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800271
Lee Thomason433f1272014-03-16 20:22:12 -0700272Versioning
273----------
274
275TinyXML-2 uses semantic versioning. http://semver.org/ Releases are now tagged in github.
276
277Note that the major version will (probably) change fairly rapidly. API changes are fairly
278common.
279
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +0400280Documentation
281-------------
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800282
283The documentation is build with Doxygen, using the 'dox'
284configuration file.
285
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +0400286License
287-------
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800288
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -0800289TinyXML-2 is released under the zlib license:
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800290
291This software is provided 'as-is', without any express or implied
292warranty. In no event will the authors be held liable for any
293damages arising from the use of this software.
294
295Permission is granted to anyone to use this software for any
296purpose, including commercial applications, and to alter it and
297redistribute it freely, subject to the following restrictions:
298
2991. The origin of this software must not be misrepresented; you must
300not claim that you wrote the original software. If you use this
301software in a product, an acknowledgment in the product documentation
302would be appreciated but is not required.
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -08003032. Altered source versions must be plainly marked as such, and
304must not be misrepresented as being the original software.
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -08003053. This notice may not be removed or altered from any source
306distribution.
307
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +0400308Contributors
309------------
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800310
311Thanks very much to everyone who sends suggestions, bugs, ideas, and
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -0800312encouragement. It all helps, and makes this project fun.
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800313
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -0800314The original TinyXML-1 has many contributors, who all deserve thanks
315in shaping what is a very successful library. Extra thanks to Yves
316Berquin and Andrew Ellerton who were key contributors.
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800317
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -0800318TinyXML-2 grew from that effort. Lee Thomason is the original author
Lee Thomason61871d62013-12-05 11:44:38 -0800319of TinyXML-2 (and TinyXML-1) but TinyXML-2 has been and is being improved
Lee Thomason74a81cf2013-09-12 23:59:43 -0700320by many contributors.
321
Lee Thomason61871d62013-12-05 11:44:38 -0800322Thanks to John Mackay at http://john.mackay.rosalilastudio.com for the TinyXML-2 logo!
323
Lee Thomason74a81cf2013-09-12 23:59:43 -0700324