Arkadiy Shapkin | 2204dda | 2012-07-21 02:15:50 +0400 | [diff] [blame] | 1 | TinyXML-2 |
| 2 | ========= |
Lee Thomason | 1688114 | 2013-09-12 23:53:08 -0700 | [diff] [blame] | 3 |  |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 4 | |
Vasily Biryukov | 9a975b7 | 2013-05-11 21:41:42 +0600 | [diff] [blame] | 5 | TinyXML-2 is a simple, small, efficient, C++ XML parser that can be |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 6 | easily integrated into other programs. |
| 7 | |
Lee Thomason (grinliz) | 2812986 | 2012-02-25 21:11:20 -0800 | [diff] [blame] | 8 | The master is hosted on github: |
Arkadiy Shapkin | 2204dda | 2012-07-21 02:15:50 +0400 | [diff] [blame] | 9 | https://github.com/leethomason/tinyxml2 |
Lee Thomason (grinliz) | 2812986 | 2012-02-25 21:11:20 -0800 | [diff] [blame] | 10 | |
Lee Thomason (grinliz) | 6a22be2 | 2012-04-04 12:39:05 -0700 | [diff] [blame] | 11 | The online HTML version of these docs: |
| 12 | http://grinninglizard.com/tinyxml2docs/index.html |
| 13 | |
Lee Thomason (grinliz) | ae209f6 | 2012-04-04 22:00:07 -0700 | [diff] [blame] | 14 | Examples are in the "related pages" tab of the HTML docs. |
Lee Thomason (grinliz) | 6a22be2 | 2012-04-04 12:39:05 -0700 | [diff] [blame] | 15 | |
Arkadiy Shapkin | 2204dda | 2012-07-21 02:15:50 +0400 | [diff] [blame] | 16 | What it does. |
| 17 | ------------- |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 18 | |
Vasily Biryukov | 9a975b7 | 2013-05-11 21:41:42 +0600 | [diff] [blame] | 19 | In brief, TinyXML-2 parses an XML document, and builds from that a |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 20 | Document Object Model (DOM) that can be read, modified, and saved. |
| 21 | |
| 22 | XML stands for "eXtensible Markup Language." It is a general purpose |
| 23 | human and machine readable markup language to describe arbitrary data. |
| 24 | All those random file formats created to store application data can |
| 25 | all be replaced with XML. One parser for everything. |
| 26 | |
| 27 | http://en.wikipedia.org/wiki/XML |
| 28 | |
| 29 | There are different ways to access and interact with XML data. |
| 30 | TinyXML-2 uses a Document Object Model (DOM), meaning the XML data is parsed |
| 31 | into a C++ objects that can be browsed and manipulated, and then |
| 32 | written to disk or another output stream. You can also construct an XML document |
| 33 | from scratch with C++ objects and write this to disk or another output |
| 34 | stream. You can even use TinyXML-2 to stream XML programmatically from |
| 35 | code without creating a document first. |
| 36 | |
| 37 | TinyXML-2 is designed to be easy and fast to learn. It is one header and |
| 38 | one cpp file. Simply add these to your project and off you go. |
| 39 | There is an example file - xmltest.cpp - to get you started. |
| 40 | |
| 41 | TinyXML-2 is released under the ZLib license, |
| 42 | so you can use it in open source or commercial code. The details |
| 43 | of the license are at the top of every source file. |
| 44 | |
| 45 | TinyXML-2 attempts to be a flexible parser, but with truly correct and |
| 46 | compliant XML output. TinyXML-2 should compile on any reasonably C++ |
| 47 | compliant system. It does not rely on exceptions, RTTI, or the STL. |
| 48 | |
Kevin Wojniak | 273f7b4 | 2013-01-09 09:21:13 -0800 | [diff] [blame] | 49 | What it doesn't do. |
Arkadiy Shapkin | 2204dda | 2012-07-21 02:15:50 +0400 | [diff] [blame] | 50 | ------------------- |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 51 | |
Lee Thomason (grinliz) | 2812986 | 2012-02-25 21:11:20 -0800 | [diff] [blame] | 52 | TinyXML-2 doesn't parse or use DTDs (Document Type Definitions) or XSLs |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 53 | (eXtensible Stylesheet Language.) There are other parsers out there |
Lee Thomason | 61871d6 | 2013-12-05 11:44:38 -0800 | [diff] [blame^] | 54 | that are much more fully featured. But they are also much bigger, |
| 55 | take longer to set up in your project, have a higher learning curve, |
| 56 | and often have a more restrictive license. If you are working with |
| 57 | browsers or have more complete XML needs, TinyXML-2 is not the parser for you. |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 58 | |
Arkadiy Shapkin | 2204dda | 2012-07-21 02:15:50 +0400 | [diff] [blame] | 59 | TinyXML-1 vs. TinyXML-2 |
| 60 | ----------------------- |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 61 | |
Lee Thomason | 74a81cf | 2013-09-12 23:59:43 -0700 | [diff] [blame] | 62 | TinyXML-2 is now the focus of all development, well tested, and your |
| 63 | best choice unless you have a requirement to maintain TinyXML-1 code. |
| 64 | |
| 65 | TinyXML-2 uses a similar API to TinyXML-1 and the same |
Lee Thomason (grinliz) | 2812986 | 2012-02-25 21:11:20 -0800 | [diff] [blame] | 66 | rich test cases. But the implementation of the parser is completely re-written |
| 67 | to make it more appropriate for use in a game. It uses less memory, is faster, |
Kevin Wojniak | 273f7b4 | 2013-01-09 09:21:13 -0800 | [diff] [blame] | 68 | and uses far fewer memory allocations. |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 69 | |
Lee Thomason (grinliz) | 2812986 | 2012-02-25 21:11:20 -0800 | [diff] [blame] | 70 | TinyXML-2 has no requirement for STL, but has also dropped all STL support. All |
| 71 | strings are query and set as 'const char*'. This allows the use of internal |
| 72 | allocators, and keeps the code much simpler. |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 73 | |
Lee Thomason (grinliz) | 2812986 | 2012-02-25 21:11:20 -0800 | [diff] [blame] | 74 | Both parsers: |
Arkadiy Shapkin | 2204dda | 2012-07-21 02:15:50 +0400 | [diff] [blame] | 75 | |
| 76 | 1. Simple to use with similar APIs. |
| 77 | 2. DOM based parser. |
| 78 | 3. UTF-8 Unicode support. http://en.wikipedia.org/wiki/UTF-8 |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 79 | |
Lee Thomason (grinliz) | 2812986 | 2012-02-25 21:11:20 -0800 | [diff] [blame] | 80 | Advantages of TinyXML-2 |
Arkadiy Shapkin | 2204dda | 2012-07-21 02:15:50 +0400 | [diff] [blame] | 81 | |
| 82 | 1. The focus of all future dev. |
| 83 | 2. Many fewer memory allocation (1/10th to 1/100th), uses less memory |
| 84 | (about 40% of TinyXML-1), and faster. |
| 85 | 3. No STL requirement. |
| 86 | 4. More modern C++, including a proper namespace. |
| 87 | 5. Proper and useful handling of whitespace |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 88 | |
Lee Thomason (grinliz) | 2812986 | 2012-02-25 21:11:20 -0800 | [diff] [blame] | 89 | Advantages of TinyXML-1 |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 90 | |
Arkadiy Shapkin | 2204dda | 2012-07-21 02:15:50 +0400 | [diff] [blame] | 91 | 1. Can report the location of parsing errors. |
| 92 | 2. Support for some C++ STL conventions: streams and strings |
| 93 | 3. Very mature and well debugged code base. |
| 94 | |
| 95 | Features |
| 96 | -------- |
| 97 | |
| 98 | ### Memory Model |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 99 | |
Lee Thomason (grinliz) | 2812986 | 2012-02-25 21:11:20 -0800 | [diff] [blame] | 100 | An XMLDocument is a C++ object like any other, that can be on the stack, or |
| 101 | new'd and deleted on the heap. |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 102 | |
Lee Thomason (grinliz) | 2812986 | 2012-02-25 21:11:20 -0800 | [diff] [blame] | 103 | However, any sub-node of the Document, XMLElement, XMLText, etc, can only |
| 104 | be created by calling the appropriate XMLDocument::NewElement, NewText, etc. |
| 105 | method. Although you have pointers to these objects, they are still owned |
| 106 | by the Document. When the Document is deleted, so are all the nodes it contains. |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 107 | |
Arkadiy Shapkin | 2204dda | 2012-07-21 02:15:50 +0400 | [diff] [blame] | 108 | ### White Space |
Lee Thomason (grinliz) | ec7777e | 2012-02-26 20:51:27 -0800 | [diff] [blame] | 109 | |
Lee Thomason (grinliz) | 9b6011c | 2012-09-09 19:12:06 -0700 | [diff] [blame] | 110 | #### Whitespace Preservation (default) |
| 111 | |
Lee Thomason (grinliz) | ec7777e | 2012-02-26 20:51:27 -0800 | [diff] [blame] | 112 | Microsoft has an excellent article on white space: http://msdn.microsoft.com/en-us/library/ms256097.aspx |
| 113 | |
Lee Thomason (grinliz) | c5defa6 | 2012-09-08 22:06:14 -0700 | [diff] [blame] | 114 | By default, TinyXML-2 preserves white space in a (hopefully) sane way that is almost complient with the |
Lee Thomason (grinliz) | 9b6011c | 2012-09-09 19:12:06 -0700 | [diff] [blame] | 115 | spec. (TinyXML-1 used a completely different model, much more similar to 'collapse', below.) |
Lee Thomason (grinliz) | ec7777e | 2012-02-26 20:51:27 -0800 | [diff] [blame] | 116 | |
| 117 | As a first step, all newlines / carriage-returns / line-feeds are normalized to a |
| 118 | line-feed character, as required by the XML spec. |
| 119 | |
| 120 | White space in text is preserved. For example: |
Lee Thomason | 12d5a03 | 2012-02-29 16:19:03 -0800 | [diff] [blame] | 121 | |
Lee Thomason (grinliz) | ec7777e | 2012-02-26 20:51:27 -0800 | [diff] [blame] | 122 | <element> Hello, World</element> |
Lee Thomason (grinliz) | ec7777e | 2012-02-26 20:51:27 -0800 | [diff] [blame] | 123 | |
Lee Thomason | c50b6b4 | 2012-03-24 12:51:47 -0700 | [diff] [blame] | 124 | The leading space before the "Hello" and the double space after the comma are |
| 125 | preserved. Line-feeds are preserved, as in this example: |
Lee Thomason (grinliz) | ec7777e | 2012-02-26 20:51:27 -0800 | [diff] [blame] | 126 | |
Lee Thomason (grinliz) | ec7777e | 2012-02-26 20:51:27 -0800 | [diff] [blame] | 127 | <element> Hello again, |
| 128 | World</element> |
Lee Thomason (grinliz) | ec7777e | 2012-02-26 20:51:27 -0800 | [diff] [blame] | 129 | |
Arkadiy Shapkin | 2204dda | 2012-07-21 02:15:50 +0400 | [diff] [blame] | 130 | However, white space between elements is **not** preserved. Although not strictly |
Lee Thomason | c50b6b4 | 2012-03-24 12:51:47 -0700 | [diff] [blame] | 131 | compliant, tracking and reporting inter-element space is awkward, and not normally |
| 132 | valuable. TinyXML-2 sees these as the same XML: |
Lee Thomason (grinliz) | ec7777e | 2012-02-26 20:51:27 -0800 | [diff] [blame] | 133 | |
Lee Thomason | 12d5a03 | 2012-02-29 16:19:03 -0800 | [diff] [blame] | 134 | <document> |
Arkadiy Shapkin | 2204dda | 2012-07-21 02:15:50 +0400 | [diff] [blame] | 135 | <data>1</data> |
| 136 | <data>2</data> |
| 137 | <data>3</data> |
Lee Thomason | 12d5a03 | 2012-02-29 16:19:03 -0800 | [diff] [blame] | 138 | </document> |
Lee Thomason (grinliz) | ec7777e | 2012-02-26 20:51:27 -0800 | [diff] [blame] | 139 | |
Lee Thomason | 12d5a03 | 2012-02-29 16:19:03 -0800 | [diff] [blame] | 140 | <document><data>1</data><data>2</data><data>3</data></document> |
Lee Thomason (grinliz) | ec7777e | 2012-02-26 20:51:27 -0800 | [diff] [blame] | 141 | |
Lee Thomason (grinliz) | c5defa6 | 2012-09-08 22:06:14 -0700 | [diff] [blame] | 142 | #### Whitespace Collapse |
| 143 | |
Lee Thomason (grinliz) | 9b6011c | 2012-09-09 19:12:06 -0700 | [diff] [blame] | 144 | For some applications, it is preferable to collapse whitespace. Collapsing |
| 145 | whitespace gives you "HTML-like" behavior, which is sometimes more suitable |
| 146 | for hand typed documents. |
| 147 | |
| 148 | TinyXML-2 supports this with the 'whitespace' parameter to the XMLDocument constructor. |
Lee Thomason (grinliz) | c5defa6 | 2012-09-08 22:06:14 -0700 | [diff] [blame] | 149 | (The default is to preserve whitespace, as described above.) |
| 150 | |
| 151 | However, you may also use COLLAPSE_WHITESPACE, which will: |
| 152 | |
Lee Thomason (grinliz) | 9b6011c | 2012-09-09 19:12:06 -0700 | [diff] [blame] | 153 | * 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) | c5defa6 | 2012-09-08 22:06:14 -0700 | [diff] [blame] | 156 | |
| 157 | Note that (currently) there is a performance impact for using COLLAPSE_WHITESPACE. |
| 158 | It essentially causes the XML to be parsed twice. |
| 159 | |
Arkadiy Shapkin | 2204dda | 2012-07-21 02:15:50 +0400 | [diff] [blame] | 160 | ### Entities |
| 161 | |
Lee Thomason (grinliz) | 2812986 | 2012-02-25 21:11:20 -0800 | [diff] [blame] | 162 | TinyXML-2 recognizes the pre-defined "character entities", meaning special |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 163 | characters. Namely: |
| 164 | |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 165 | & & |
| 166 | < < |
| 167 | > > |
| 168 | " " |
| 169 | ' ' |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 170 | |
Dennis Jenkins | 68a1c93 | 2013-10-25 23:01:34 -0500 | [diff] [blame] | 171 | These are recognized when the XML document is read, and translated to their |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 172 | UTF-8 equivalents. For instance, text with the XML of: |
| 173 | |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 174 | Far & Away |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 175 | |
Lee Thomason (grinliz) | 2812986 | 2012-02-25 21:11:20 -0800 | [diff] [blame] | 176 | will have the Value() of "Far & Away" when queried from the XMLText object, |
| 177 | and will be written back to the XML stream/file as an ampersand. |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 178 | |
| 179 | Additionally, any character can be specified by its Unicode code point: |
Lee Thomason (grinliz) | 2812986 | 2012-02-25 21:11:20 -0800 | [diff] [blame] | 180 | The syntax " " or " " are both to the non-breaking space characher. |
| 181 | This is called a 'numeric character reference'. Any numeric character reference |
| 182 | that isn't one of the special entities above, will be read, but written as a |
| 183 | regular code point. The output is correct, but the entity syntax isn't preserved. |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 184 | |
Arkadiy Shapkin | 2204dda | 2012-07-21 02:15:50 +0400 | [diff] [blame] | 185 | ### Printing |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 186 | |
Arkadiy Shapkin | 2204dda | 2012-07-21 02:15:50 +0400 | [diff] [blame] | 187 | #### Print to file |
Lee Thomason (grinliz) | 2812986 | 2012-02-25 21:11:20 -0800 | [diff] [blame] | 188 | You can directly use the convenience function: |
Lee Thomason | 12d5a03 | 2012-02-29 16:19:03 -0800 | [diff] [blame] | 189 | |
Lee Thomason (grinliz) | 2812986 | 2012-02-25 21:11:20 -0800 | [diff] [blame] | 190 | XMLDocument doc; |
| 191 | ... |
Lee Thomason | 77d7f20 | 2012-07-29 18:51:41 -0700 | [diff] [blame] | 192 | doc.SaveFile( "foo.xml" ); |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 193 | |
Lee Thomason (grinliz) | 2812986 | 2012-02-25 21:11:20 -0800 | [diff] [blame] | 194 | Or the XMLPrinter class: |
Lee Thomason | 12d5a03 | 2012-02-29 16:19:03 -0800 | [diff] [blame] | 195 | |
Lee Thomason (grinliz) | 2812986 | 2012-02-25 21:11:20 -0800 | [diff] [blame] | 196 | XMLPrinter printer( fp ); |
| 197 | doc.Print( &printer ); |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 198 | |
Arkadiy Shapkin | 2204dda | 2012-07-21 02:15:50 +0400 | [diff] [blame] | 199 | #### Print to memory |
Lee Thomason (grinliz) | 2812986 | 2012-02-25 21:11:20 -0800 | [diff] [blame] | 200 | Printing to memory is supported by the XMLPrinter. |
Lee Thomason | 12d5a03 | 2012-02-29 16:19:03 -0800 | [diff] [blame] | 201 | |
Lee Thomason (grinliz) | 2812986 | 2012-02-25 21:11:20 -0800 | [diff] [blame] | 202 | XMLPrinter printer; |
Vasily Biryukov | 9a975b7 | 2013-05-11 21:41:42 +0600 | [diff] [blame] | 203 | doc.Print( &printer ); |
Lee Thomason (grinliz) | 2812986 | 2012-02-25 21:11:20 -0800 | [diff] [blame] | 204 | // printer.CStr() has a const char* to the XML |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 205 | |
Arkadiy Shapkin | 2204dda | 2012-07-21 02:15:50 +0400 | [diff] [blame] | 206 | #### Print without an XMLDocument |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 207 | |
Lee Thomason | 12d5a03 | 2012-02-29 16:19:03 -0800 | [diff] [blame] | 208 | When loading, an XML parser is very useful. However, sometimes |
| 209 | when saving, it just gets in the way. The code is often set up |
| 210 | for streaming, and constructing the DOM is just overhead. |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 211 | |
Lee Thomason | 12d5a03 | 2012-02-29 16:19:03 -0800 | [diff] [blame] | 212 | The Printer supports the streaming case. The following code |
| 213 | prints out a trivially simple XML file without ever creating |
| 214 | an XML document. |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 215 | |
Lee Thomason (grinliz) | 2812986 | 2012-02-25 21:11:20 -0800 | [diff] [blame] | 216 | XMLPrinter printer( fp ); |
| 217 | printer.OpenElement( "foo" ); |
| 218 | printer.PushAttribute( "foo", "bar" ); |
| 219 | printer.CloseElement(); |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 220 | |
Arkadiy Shapkin | 2204dda | 2012-07-21 02:15:50 +0400 | [diff] [blame] | 221 | Examples |
| 222 | -------- |
Lee Thomason | 87e475a | 2012-03-20 11:55:29 -0700 | [diff] [blame] | 223 | |
Arkadiy Shapkin | 2204dda | 2012-07-21 02:15:50 +0400 | [diff] [blame] | 224 | #### Load and parse an XML file. |
| 225 | |
Lee Thomason | 87e475a | 2012-03-20 11:55:29 -0700 | [diff] [blame] | 226 | /* ------ Example 1: Load and parse an XML file. ---- */ |
| 227 | { |
| 228 | XMLDocument doc; |
| 229 | doc.LoadFile( "dream.xml" ); |
| 230 | } |
Lee Thomason | 87e475a | 2012-03-20 11:55:29 -0700 | [diff] [blame] | 231 | |
Arkadiy Shapkin | 2204dda | 2012-07-21 02:15:50 +0400 | [diff] [blame] | 232 | #### Lookup information. |
| 233 | |
Lee Thomason | 87e475a | 2012-03-20 11:55:29 -0700 | [diff] [blame] | 234 | /* ------ Example 2: Lookup information. ---- */ |
| 235 | { |
| 236 | XMLDocument doc; |
| 237 | doc.LoadFile( "dream.xml" ); |
| 238 | |
| 239 | // Structure of the XML file: |
Lee Thomason | c50b6b4 | 2012-03-24 12:51:47 -0700 | [diff] [blame] | 240 | // - 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 Thomason | 87e475a | 2012-03-20 11:55:29 -0700 | [diff] [blame] | 244 | |
Lee Thomason | c50b6b4 | 2012-03-24 12:51:47 -0700 | [diff] [blame] | 245 | // Navigate to the title, using the convenience function, |
| 246 | // with a dangerous lack of error checking. |
Lee Thomason | 87e475a | 2012-03-20 11:55:29 -0700 | [diff] [blame] | 247 | const char* title = doc.FirstChildElement( "PLAY" )->FirstChildElement( "TITLE" )->GetText(); |
| 248 | printf( "Name of play (1): %s\n", title ); |
| 249 | |
Lee Thomason | c50b6b4 | 2012-03-24 12:51:47 -0700 | [diff] [blame] | 250 | // Text is just another Node to TinyXML-2. The more |
| 251 | // general way to get to the XMLText: |
Lee Thomason | 87e475a | 2012-03-20 11:55:29 -0700 | [diff] [blame] | 252 | XMLText* textNode = doc.FirstChildElement( "PLAY" )->FirstChildElement( "TITLE" )->FirstChild()->ToText(); |
| 253 | title = textNode->Value(); |
| 254 | printf( "Name of play (2): %s\n", title ); |
| 255 | } |
Lee Thomason | 87e475a | 2012-03-20 11:55:29 -0700 | [diff] [blame] | 256 | |
Arkadiy Shapkin | 2204dda | 2012-07-21 02:15:50 +0400 | [diff] [blame] | 257 | Using and Installing |
| 258 | -------------------- |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 259 | |
Lee Thomason (grinliz) | 2812986 | 2012-02-25 21:11:20 -0800 | [diff] [blame] | 260 | There are 2 files in TinyXML-2: |
Arkadiy Shapkin | 2204dda | 2012-07-21 02:15:50 +0400 | [diff] [blame] | 261 | * tinyxml2.cpp |
| 262 | * tinyxml2.h |
| 263 | |
Lee Thomason (grinliz) | 2812986 | 2012-02-25 21:11:20 -0800 | [diff] [blame] | 264 | And additionally a test file: |
Arkadiy Shapkin | 2204dda | 2012-07-21 02:15:50 +0400 | [diff] [blame] | 265 | * xmltest.cpp |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 266 | |
Lee Thomason | 2f6e476 | 2012-04-05 08:52:07 -0700 | [diff] [blame] | 267 | Simply compile and run. There is a visual studio 2010 project included, a simple Makefile, |
Guillaume P | d60fe35 | 2013-05-12 15:11:37 +0200 | [diff] [blame] | 268 | an XCode project, a Code::Blocks project, and a cmake CMakeLists.txt included to help you. |
| 269 | The top of tinyxml.h even has a simple g++ command line if you are are *nix and don't want |
| 270 | to use a build system. |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 271 | |
Arkadiy Shapkin | 2204dda | 2012-07-21 02:15:50 +0400 | [diff] [blame] | 272 | Documentation |
| 273 | ------------- |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 274 | |
| 275 | The documentation is build with Doxygen, using the 'dox' |
| 276 | configuration file. |
| 277 | |
Arkadiy Shapkin | 2204dda | 2012-07-21 02:15:50 +0400 | [diff] [blame] | 278 | License |
| 279 | ------- |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 280 | |
Lee Thomason (grinliz) | 2812986 | 2012-02-25 21:11:20 -0800 | [diff] [blame] | 281 | TinyXML-2 is released under the zlib license: |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 282 | |
| 283 | This software is provided 'as-is', without any express or implied |
| 284 | warranty. In no event will the authors be held liable for any |
| 285 | damages arising from the use of this software. |
| 286 | |
| 287 | Permission is granted to anyone to use this software for any |
| 288 | purpose, including commercial applications, and to alter it and |
| 289 | redistribute it freely, subject to the following restrictions: |
| 290 | |
| 291 | 1. The origin of this software must not be misrepresented; you must |
| 292 | not claim that you wrote the original software. If you use this |
| 293 | software in a product, an acknowledgment in the product documentation |
| 294 | would be appreciated but is not required. |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 295 | 2. Altered source versions must be plainly marked as such, and |
| 296 | must not be misrepresented as being the original software. |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 297 | 3. This notice may not be removed or altered from any source |
| 298 | distribution. |
| 299 | |
Arkadiy Shapkin | 2204dda | 2012-07-21 02:15:50 +0400 | [diff] [blame] | 300 | Contributors |
| 301 | ------------ |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 302 | |
| 303 | Thanks very much to everyone who sends suggestions, bugs, ideas, and |
Lee Thomason (grinliz) | 2812986 | 2012-02-25 21:11:20 -0800 | [diff] [blame] | 304 | encouragement. It all helps, and makes this project fun. |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 305 | |
Lee Thomason (grinliz) | 2812986 | 2012-02-25 21:11:20 -0800 | [diff] [blame] | 306 | The original TinyXML-1 has many contributors, who all deserve thanks |
| 307 | in shaping what is a very successful library. Extra thanks to Yves |
| 308 | Berquin and Andrew Ellerton who were key contributors. |
Lee Thomason (grinliz) | 9c38d13 | 2012-02-24 21:50:50 -0800 | [diff] [blame] | 309 | |
Lee Thomason (grinliz) | 2812986 | 2012-02-25 21:11:20 -0800 | [diff] [blame] | 310 | TinyXML-2 grew from that effort. Lee Thomason is the original author |
Lee Thomason | 61871d6 | 2013-12-05 11:44:38 -0800 | [diff] [blame^] | 311 | of TinyXML-2 (and TinyXML-1) but TinyXML-2 has been and is being improved |
Lee Thomason | 74a81cf | 2013-09-12 23:59:43 -0700 | [diff] [blame] | 312 | by many contributors. |
| 313 | |
Lee Thomason | 61871d6 | 2013-12-05 11:44:38 -0800 | [diff] [blame^] | 314 | Thanks to John Mackay at http://john.mackay.rosalilastudio.com for the TinyXML-2 logo! |
| 315 | |
Lee Thomason | 74a81cf | 2013-09-12 23:59:43 -0700 | [diff] [blame] | 316 | |