blob: f985100f4497509b84ec5d2762af6461321e9429 [file] [log] [blame] [view]
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +04001TinyXML-2
2=========
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -08003
4TinyXML is a simple, small, efficient, C++ XML parser that can be
5easily integrated into other programs.
6
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -08007The master is hosted on github:
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +04008https://github.com/leethomason/tinyxml2
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -08009
Lee Thomason (grinliz)6a22be22012-04-04 12:39:05 -070010The online HTML version of these docs:
11http://grinninglizard.com/tinyxml2docs/index.html
12
Lee Thomason (grinliz)ae209f62012-04-04 22:00:07 -070013Examples are in the "related pages" tab of the HTML docs.
Lee Thomason (grinliz)6a22be22012-04-04 12:39:05 -070014
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +040015What it does.
16-------------
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -080017
18In brief, TinyXML parses an XML document, and builds from that a
19Document Object Model (DOM) that can be read, modified, and saved.
20
21XML stands for "eXtensible Markup Language." It is a general purpose
22human and machine readable markup language to describe arbitrary data.
23All those random file formats created to store application data can
24all be replaced with XML. One parser for everything.
25
26http://en.wikipedia.org/wiki/XML
27
28There are different ways to access and interact with XML data.
29TinyXML-2 uses a Document Object Model (DOM), meaning the XML data is parsed
30into a C++ objects that can be browsed and manipulated, and then
31written to disk or another output stream. You can also construct an XML document
32from scratch with C++ objects and write this to disk or another output
33stream. You can even use TinyXML-2 to stream XML programmatically from
34code without creating a document first.
35
36TinyXML-2 is designed to be easy and fast to learn. It is one header and
37one cpp file. Simply add these to your project and off you go.
38There is an example file - xmltest.cpp - to get you started.
39
40TinyXML-2 is released under the ZLib license,
41so you can use it in open source or commercial code. The details
42of the license are at the top of every source file.
43
44TinyXML-2 attempts to be a flexible parser, but with truly correct and
45compliant XML output. TinyXML-2 should compile on any reasonably C++
46compliant system. It does not rely on exceptions, RTTI, or the STL.
47
Kevin Wojniak273f7b42013-01-09 09:21:13 -080048What it doesn't do.
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +040049-------------------
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -080050
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -080051TinyXML-2 doesn't parse or use DTDs (Document Type Definitions) or XSLs
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -080052(eXtensible Stylesheet Language.) There are other parsers out there
53that are much more fully
54featured. But they are also much bigger, take longer to set up in
55your project, have a higher learning curve, and often have a more
56restrictive license. If you are working with browsers or have more
57complete XML needs, TinyXML-2 is not the parser for you.
58
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +040059TinyXML-1 vs. TinyXML-2
60-----------------------
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -080061
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -080062Which should you use? TinyXML-2 uses a similar API to TinyXML-1 and the same
63rich test cases. But the implementation of the parser is completely re-written
64to make it more appropriate for use in a game. It uses less memory, is faster,
Kevin Wojniak273f7b42013-01-09 09:21:13 -080065and uses far fewer memory allocations.
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -080066
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -080067TinyXML-2 has no requirement for STL, but has also dropped all STL support. All
68strings are query and set as 'const char*'. This allows the use of internal
69allocators, and keeps the code much simpler.
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -080070
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -080071Both parsers:
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +040072
731. Simple to use with similar APIs.
742. DOM based parser.
753. UTF-8 Unicode support. http://en.wikipedia.org/wiki/UTF-8
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -080076
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -080077Advantages of TinyXML-2
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +040078
791. The focus of all future dev.
802. Many fewer memory allocation (1/10th to 1/100th), uses less memory
81 (about 40% of TinyXML-1), and faster.
823. No STL requirement.
834. More modern C++, including a proper namespace.
845. Proper and useful handling of whitespace
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -080085
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -080086Advantages of TinyXML-1
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -080087
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +0400881. Can report the location of parsing errors.
892. Support for some C++ STL conventions: streams and strings
903. Very mature and well debugged code base.
91
92Features
93--------
94
95### Memory Model
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -080096
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -080097An XMLDocument is a C++ object like any other, that can be on the stack, or
98new'd and deleted on the heap.
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -080099
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -0800100However, any sub-node of the Document, XMLElement, XMLText, etc, can only
101be created by calling the appropriate XMLDocument::NewElement, NewText, etc.
102method. Although you have pointers to these objects, they are still owned
103by the Document. When the Document is deleted, so are all the nodes it contains.
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800104
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +0400105### White Space
Lee Thomason (grinliz)ec7777e2012-02-26 20:51:27 -0800106
Lee Thomason (grinliz)9b6011c2012-09-09 19:12:06 -0700107#### Whitespace Preservation (default)
108
Lee Thomason (grinliz)ec7777e2012-02-26 20:51:27 -0800109Microsoft has an excellent article on white space: http://msdn.microsoft.com/en-us/library/ms256097.aspx
110
Lee Thomason (grinliz)c5defa62012-09-08 22:06:14 -0700111By 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 -0700112spec. (TinyXML-1 used a completely different model, much more similar to 'collapse', below.)
Lee Thomason (grinliz)ec7777e2012-02-26 20:51:27 -0800113
114As a first step, all newlines / carriage-returns / line-feeds are normalized to a
115line-feed character, as required by the XML spec.
116
117White space in text is preserved. For example:
Lee Thomason12d5a032012-02-29 16:19:03 -0800118
Lee Thomason (grinliz)ec7777e2012-02-26 20:51:27 -0800119 <element> Hello, World</element>
Lee Thomason (grinliz)ec7777e2012-02-26 20:51:27 -0800120
Lee Thomasonc50b6b42012-03-24 12:51:47 -0700121The leading space before the "Hello" and the double space after the comma are
122preserved. Line-feeds are preserved, as in this example:
Lee Thomason (grinliz)ec7777e2012-02-26 20:51:27 -0800123
Lee Thomason (grinliz)ec7777e2012-02-26 20:51:27 -0800124 <element> Hello again,
125 World</element>
Lee Thomason (grinliz)ec7777e2012-02-26 20:51:27 -0800126
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +0400127However, white space between elements is **not** preserved. Although not strictly
Lee Thomasonc50b6b42012-03-24 12:51:47 -0700128compliant, tracking and reporting inter-element space is awkward, and not normally
129valuable. TinyXML-2 sees these as the same XML:
Lee Thomason (grinliz)ec7777e2012-02-26 20:51:27 -0800130
Lee Thomason12d5a032012-02-29 16:19:03 -0800131 <document>
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +0400132 <data>1</data>
133 <data>2</data>
134 <data>3</data>
Lee Thomason12d5a032012-02-29 16:19:03 -0800135 </document>
Lee Thomason (grinliz)ec7777e2012-02-26 20:51:27 -0800136
Lee Thomason12d5a032012-02-29 16:19:03 -0800137 <document><data>1</data><data>2</data><data>3</data></document>
Lee Thomason (grinliz)ec7777e2012-02-26 20:51:27 -0800138
Lee Thomason (grinliz)c5defa62012-09-08 22:06:14 -0700139#### Whitespace Collapse
140
Lee Thomason (grinliz)9b6011c2012-09-09 19:12:06 -0700141For some applications, it is preferable to collapse whitespace. Collapsing
142whitespace gives you "HTML-like" behavior, which is sometimes more suitable
143for hand typed documents.
144
145TinyXML-2 supports this with the 'whitespace' parameter to the XMLDocument constructor.
Lee Thomason (grinliz)c5defa62012-09-08 22:06:14 -0700146(The default is to preserve whitespace, as described above.)
147
148However, you may also use COLLAPSE_WHITESPACE, which will:
149
Lee Thomason (grinliz)9b6011c2012-09-09 19:12:06 -0700150* Remove leading and trailing whitespace
151* Convert newlines and line-feeds into a space character
152* Collapse a run of any number of space characters into a single space character
Lee Thomason (grinliz)c5defa62012-09-08 22:06:14 -0700153
154Note that (currently) there is a performance impact for using COLLAPSE_WHITESPACE.
155It essentially causes the XML to be parsed twice.
156
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +0400157### Entities
158
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -0800159TinyXML-2 recognizes the pre-defined "character entities", meaning special
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800160characters. Namely:
161
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800162 &amp; &
163 &lt; <
164 &gt; >
165 &quot; "
166 &apos; '
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800167
168These are recognized when the XML document is read, and translated to there
169UTF-8 equivalents. For instance, text with the XML of:
170
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800171 Far &amp; Away
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800172
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -0800173will have the Value() of "Far & Away" when queried from the XMLText object,
174and will be written back to the XML stream/file as an ampersand.
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800175
176Additionally, any character can be specified by its Unicode code point:
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -0800177The syntax "&#xA0;" or "&#160;" are both to the non-breaking space characher.
178This is called a 'numeric character reference'. Any numeric character reference
179that isn't one of the special entities above, will be read, but written as a
180regular code point. The output is correct, but the entity syntax isn't preserved.
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800181
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +0400182### Printing
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800183
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +0400184#### Print to file
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -0800185You can directly use the convenience function:
Lee Thomason12d5a032012-02-29 16:19:03 -0800186
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -0800187 XMLDocument doc;
188 ...
Lee Thomason77d7f202012-07-29 18:51:41 -0700189 doc.SaveFile( "foo.xml" );
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800190
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -0800191Or the XMLPrinter class:
Lee Thomason12d5a032012-02-29 16:19:03 -0800192
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -0800193 XMLPrinter printer( fp );
194 doc.Print( &printer );
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800195
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +0400196#### Print to memory
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -0800197Printing to memory is supported by the XMLPrinter.
Lee Thomason12d5a032012-02-29 16:19:03 -0800198
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -0800199 XMLPrinter printer;
200 doc->Print( &printer );
201 // printer.CStr() has a const char* to the XML
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800202
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +0400203#### Print without an XMLDocument
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800204
Lee Thomason12d5a032012-02-29 16:19:03 -0800205When loading, an XML parser is very useful. However, sometimes
206when saving, it just gets in the way. The code is often set up
207for streaming, and constructing the DOM is just overhead.
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800208
Lee Thomason12d5a032012-02-29 16:19:03 -0800209The Printer supports the streaming case. The following code
210prints out a trivially simple XML file without ever creating
211an XML document.
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800212
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -0800213 XMLPrinter printer( fp );
214 printer.OpenElement( "foo" );
215 printer.PushAttribute( "foo", "bar" );
216 printer.CloseElement();
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800217
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +0400218Examples
219--------
Lee Thomason87e475a2012-03-20 11:55:29 -0700220
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +0400221#### Load and parse an XML file.
222
Lee Thomason87e475a2012-03-20 11:55:29 -0700223 /* ------ Example 1: Load and parse an XML file. ---- */
224 {
225 XMLDocument doc;
226 doc.LoadFile( "dream.xml" );
227 }
Lee Thomason87e475a2012-03-20 11:55:29 -0700228
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +0400229#### Lookup information.
230
Lee Thomason87e475a2012-03-20 11:55:29 -0700231 /* ------ Example 2: Lookup information. ---- */
232 {
233 XMLDocument doc;
234 doc.LoadFile( "dream.xml" );
235
236 // Structure of the XML file:
Lee Thomasonc50b6b42012-03-24 12:51:47 -0700237 // - Element "PLAY" the root Element, which is the
238 // FirstChildElement of the Document
239 // - - Element "TITLE" child of the root PLAY Element
240 // - - - Text child of the TITLE Element
Lee Thomason87e475a2012-03-20 11:55:29 -0700241
Lee Thomasonc50b6b42012-03-24 12:51:47 -0700242 // Navigate to the title, using the convenience function,
243 // with a dangerous lack of error checking.
Lee Thomason87e475a2012-03-20 11:55:29 -0700244 const char* title = doc.FirstChildElement( "PLAY" )->FirstChildElement( "TITLE" )->GetText();
245 printf( "Name of play (1): %s\n", title );
246
Lee Thomasonc50b6b42012-03-24 12:51:47 -0700247 // Text is just another Node to TinyXML-2. The more
248 // general way to get to the XMLText:
Lee Thomason87e475a2012-03-20 11:55:29 -0700249 XMLText* textNode = doc.FirstChildElement( "PLAY" )->FirstChildElement( "TITLE" )->FirstChild()->ToText();
250 title = textNode->Value();
251 printf( "Name of play (2): %s\n", title );
252 }
Lee Thomason87e475a2012-03-20 11:55:29 -0700253
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +0400254Using and Installing
255--------------------
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800256
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -0800257There are 2 files in TinyXML-2:
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +0400258* tinyxml2.cpp
259* tinyxml2.h
260
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -0800261And additionally a test file:
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +0400262* xmltest.cpp
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800263
Lee Thomason2f6e4762012-04-05 08:52:07 -0700264Simply compile and run. There is a visual studio 2010 project included, a simple Makefile,
265an XCode project, and a cmake CMakeLists.txt included to help you. The top of tinyxml.h
266even has a simple g++ command line if you are are *nix and don't want to use a build system.
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800267
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +0400268Documentation
269-------------
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800270
271The documentation is build with Doxygen, using the 'dox'
272configuration file.
273
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +0400274License
275-------
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800276
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -0800277TinyXML-2 is released under the zlib license:
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800278
279This software is provided 'as-is', without any express or implied
280warranty. In no event will the authors be held liable for any
281damages arising from the use of this software.
282
283Permission is granted to anyone to use this software for any
284purpose, including commercial applications, and to alter it and
285redistribute it freely, subject to the following restrictions:
286
2871. The origin of this software must not be misrepresented; you must
288not claim that you wrote the original software. If you use this
289software in a product, an acknowledgment in the product documentation
290would be appreciated but is not required.
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -08002912. Altered source versions must be plainly marked as such, and
292must not be misrepresented as being the original software.
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -08002933. This notice may not be removed or altered from any source
294distribution.
295
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +0400296Contributors
297------------
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800298
299Thanks very much to everyone who sends suggestions, bugs, ideas, and
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -0800300encouragement. It all helps, and makes this project fun.
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800301
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -0800302The original TinyXML-1 has many contributors, who all deserve thanks
303in shaping what is a very successful library. Extra thanks to Yves
304Berquin and Andrew Ellerton who were key contributors.
Lee Thomason (grinliz)9c38d132012-02-24 21:50:50 -0800305
Lee Thomason (grinliz)28129862012-02-25 21:11:20 -0800306TinyXML-2 grew from that effort. Lee Thomason is the original author
307of TinyXML-2 (and TinyXML-1) but hopefully TinyXML-2 will be improved
Arkadiy Shapkin2204dda2012-07-21 02:15:50 +0400308by many contributors.