summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/html/annotated.html37
-rw-r--r--docs/html/classpugi_1_1xml__attribute-members.html52
-rw-r--r--docs/html/classpugi_1_1xml__attribute.html881
-rw-r--r--docs/html/classpugi_1_1xml__attribute__coll__graph.map1
-rw-r--r--docs/html/classpugi_1_1xml__attribute__coll__graph.md51
-rw-r--r--docs/html/classpugi_1_1xml__attribute__coll__graph.pngbin0 -> 876 bytes
-rw-r--r--docs/html/classpugi_1_1xml__attribute__iterator-members.html37
-rw-r--r--docs/html/classpugi_1_1xml__attribute__iterator.html414
-rw-r--r--docs/html/classpugi_1_1xml__attribute__iterator__coll__graph.map2
-rw-r--r--docs/html/classpugi_1_1xml__attribute__iterator__coll__graph.md51
-rw-r--r--docs/html/classpugi_1_1xml__attribute__iterator__coll__graph.pngbin0 -> 3027 bytes
-rw-r--r--docs/html/classpugi_1_1xml__attribute__iterator__inherit__graph.map1
-rw-r--r--docs/html/classpugi_1_1xml__attribute__iterator__inherit__graph.md51
-rw-r--r--docs/html/classpugi_1_1xml__attribute__iterator__inherit__graph.pngbin0 -> 1386 bytes
-rw-r--r--docs/html/classpugi_1_1xml__document-members.html103
-rw-r--r--docs/html/classpugi_1_1xml__document.html365
-rw-r--r--docs/html/classpugi_1_1xml__document__coll__graph.map2
-rw-r--r--docs/html/classpugi_1_1xml__document__coll__graph.md51
-rw-r--r--docs/html/classpugi_1_1xml__document__coll__graph.pngbin0 -> 2396 bytes
-rw-r--r--docs/html/classpugi_1_1xml__document__inherit__graph.map2
-rw-r--r--docs/html/classpugi_1_1xml__document__inherit__graph.md51
-rw-r--r--docs/html/classpugi_1_1xml__document__inherit__graph.pngbin0 -> 697 bytes
-rw-r--r--docs/html/classpugi_1_1xml__node-members.html95
-rw-r--r--docs/html/classpugi_1_1xml__node.html2473
-rw-r--r--docs/html/classpugi_1_1xml__node__coll__graph.map1
-rw-r--r--docs/html/classpugi_1_1xml__node__coll__graph.md51
-rw-r--r--docs/html/classpugi_1_1xml__node__coll__graph.pngbin0 -> 756 bytes
-rw-r--r--docs/html/classpugi_1_1xml__node__inherit__graph.map2
-rw-r--r--docs/html/classpugi_1_1xml__node__inherit__graph.md51
-rw-r--r--docs/html/classpugi_1_1xml__node__inherit__graph.pngbin0 -> 704 bytes
-rw-r--r--docs/html/classpugi_1_1xml__node__iterator-members.html37
-rw-r--r--docs/html/classpugi_1_1xml__node__iterator.html414
-rw-r--r--docs/html/classpugi_1_1xml__node__iterator__coll__graph.map2
-rw-r--r--docs/html/classpugi_1_1xml__node__iterator__coll__graph.md51
-rw-r--r--docs/html/classpugi_1_1xml__node__iterator__coll__graph.pngbin0 -> 2813 bytes
-rw-r--r--docs/html/classpugi_1_1xml__node__iterator__inherit__graph.map1
-rw-r--r--docs/html/classpugi_1_1xml__node__iterator__inherit__graph.md51
-rw-r--r--docs/html/classpugi_1_1xml__node__iterator__inherit__graph.pngbin0 -> 1300 bytes
-rw-r--r--docs/html/classpugi_1_1xml__tree__walker-members.html32
-rw-r--r--docs/html/classpugi_1_1xml__tree__walker.html186
-rw-r--r--docs/html/classpugi_1_1xml__tree__walker__coll__graph.map1
-rw-r--r--docs/html/classpugi_1_1xml__tree__walker__coll__graph.md51
-rw-r--r--docs/html/classpugi_1_1xml__tree__walker__coll__graph.pngbin0 -> 738 bytes
-rw-r--r--docs/html/classpugi_1_1xpath__exception-members.html27
-rw-r--r--docs/html/classpugi_1_1xpath__exception.html108
-rw-r--r--docs/html/classpugi_1_1xpath__exception__coll__graph.map1
-rw-r--r--docs/html/classpugi_1_1xpath__exception__coll__graph.md51
-rw-r--r--docs/html/classpugi_1_1xpath__exception__coll__graph.pngbin0 -> 1442 bytes
-rw-r--r--docs/html/classpugi_1_1xpath__exception__inherit__graph.map1
-rw-r--r--docs/html/classpugi_1_1xpath__exception__inherit__graph.md51
-rw-r--r--docs/html/classpugi_1_1xpath__exception__inherit__graph.pngbin0 -> 764 bytes
-rw-r--r--docs/html/classpugi_1_1xpath__node-members.html34
-rw-r--r--docs/html/classpugi_1_1xpath__node.html341
-rw-r--r--docs/html/classpugi_1_1xpath__node__coll__graph.map3
-rw-r--r--docs/html/classpugi_1_1xpath__node__coll__graph.md51
-rw-r--r--docs/html/classpugi_1_1xpath__node__coll__graph.pngbin0 -> 2333 bytes
-rw-r--r--docs/html/classpugi_1_1xpath__node__set-members.html42
-rw-r--r--docs/html/classpugi_1_1xpath__node__set.html413
-rw-r--r--docs/html/classpugi_1_1xpath__node__set__coll__graph.map4
-rw-r--r--docs/html/classpugi_1_1xpath__node__set__coll__graph.md51
-rw-r--r--docs/html/classpugi_1_1xpath__node__set__coll__graph.pngbin0 -> 4399 bytes
-rw-r--r--docs/html/classpugi_1_1xpath__query-members.html31
-rw-r--r--docs/html/classpugi_1_1xpath__query.html239
-rw-r--r--docs/html/classpugi_1_1xpath__query__coll__graph.map1
-rw-r--r--docs/html/classpugi_1_1xpath__query__coll__graph.md51
-rw-r--r--docs/html/classpugi_1_1xpath__query__coll__graph.pngbin0 -> 1519 bytes
-rw-r--r--docs/html/doxygen.css310
-rw-r--r--docs/html/doxygen.pngbin0 -> 1281 bytes
-rw-r--r--docs/html/functions.html195
-rw-r--r--docs/html/functions_enum.html38
-rw-r--r--docs/html/functions_eval.html40
-rw-r--r--docs/html/functions_func.html188
-rw-r--r--docs/html/functions_type.html40
-rw-r--r--docs/html/graph_legend.dot22
-rw-r--r--docs/html/graph_legend.html80
-rw-r--r--docs/html/graph_legend.pngbin0 -> 3938 bytes
-rw-r--r--docs/html/hierarchy.html45
-rw-r--r--docs/html/index.html20
-rw-r--r--docs/html/inherit__graph__0.map2
-rw-r--r--docs/html/inherit__graph__0.md51
-rw-r--r--docs/html/inherit__graph__0.pngbin0 -> 582 bytes
-rw-r--r--docs/html/inherit__graph__1.map2
-rw-r--r--docs/html/inherit__graph__1.md51
-rw-r--r--docs/html/inherit__graph__1.pngbin0 -> 428 bytes
-rw-r--r--docs/html/inherit__graph__2.map3
-rw-r--r--docs/html/inherit__graph__2.md51
-rw-r--r--docs/html/inherit__graph__2.pngbin0 -> 1068 bytes
-rw-r--r--docs/html/inherit__graph__3.map3
-rw-r--r--docs/html/inherit__graph__3.md51
-rw-r--r--docs/html/inherit__graph__3.pngbin0 -> 596 bytes
-rw-r--r--docs/html/inherit__graph__4.map2
-rw-r--r--docs/html/inherit__graph__4.md51
-rw-r--r--docs/html/inherit__graph__4.pngbin0 -> 485 bytes
-rw-r--r--docs/html/inherit__graph__5.map2
-rw-r--r--docs/html/inherit__graph__5.md51
-rw-r--r--docs/html/inherit__graph__5.pngbin0 -> 644 bytes
-rw-r--r--docs/html/inherit__graph__6.map2
-rw-r--r--docs/html/inherit__graph__6.md51
-rw-r--r--docs/html/inherit__graph__6.pngbin0 -> 404 bytes
-rw-r--r--docs/html/inherit__graph__7.map2
-rw-r--r--docs/html/inherit__graph__7.md51
-rw-r--r--docs/html/inherit__graph__7.pngbin0 -> 470 bytes
-rw-r--r--docs/html/inherit__graph__8.map2
-rw-r--r--docs/html/inherit__graph__8.md51
-rw-r--r--docs/html/inherit__graph__8.pngbin0 -> 437 bytes
-rw-r--r--docs/html/inherits.html66
-rw-r--r--docs/html/namespacemembers.html62
-rw-r--r--docs/html/namespacemembers_enum.html37
-rw-r--r--docs/html/namespacemembers_eval.html43
-rw-r--r--docs/html/namespacemembers_func.html38
-rw-r--r--docs/html/namespacemembers_vars.html52
-rw-r--r--docs/html/namespacepugi.html668
-rw-r--r--docs/html/namespaces.html26
-rw-r--r--docs/html/structpugi_1_1transfer__ownership__tag.html35
-rw-r--r--docs/html/tab_b.gifbin0 -> 35 bytes
-rw-r--r--docs/html/tab_l.gifbin0 -> 706 bytes
-rw-r--r--docs/html/tab_r.gifbin0 -> 2585 bytes
-rw-r--r--docs/html/tabs.css102
-rw-r--r--docs/index.html1059
-rw-r--r--src/pugiconfig.hpp23
-rw-r--r--src/pugixml.cpp4697
-rw-r--r--src/pugixml.hpp2399
-rw-r--r--src/pugixpath.cpp3537
123 files changed, 16700 insertions, 3552 deletions
diff --git a/docs/html/annotated.html b/docs/html/annotated.html
new file mode 100644
index 0000000..92baeb6
--- /dev/null
+++ b/docs/html/annotated.html
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pugixml: Class List</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6-NO -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li id="current"><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul></div>
+<h1>pugixml Class List</h1>Here are the classes, structs, unions and interfaces with brief descriptions:<table>
+ <tr><td class="indexkey"><a class="el" href="structpugi_1_1transfer__ownership__tag.html">pugi::transfer_ownership_tag</a></td><td class="indexvalue">Struct used to distinguish parsing with ownership transfer from parsing without it </td></tr>
+ <tr><td class="indexkey"><a class="el" href="classpugi_1_1xml__attribute.html">pugi::xml_attribute</a></td><td class="indexvalue">A light-weight wrapper for manipulating attributes in DOM tree </td></tr>
+ <tr><td class="indexkey"><a class="el" href="classpugi_1_1xml__attribute__iterator.html">pugi::xml_attribute_iterator</a></td><td class="indexvalue">Attribute iterator </td></tr>
+ <tr><td class="indexkey"><a class="el" href="classpugi_1_1xml__document.html">pugi::xml_document</a></td><td class="indexvalue">Document class (DOM tree root) </td></tr>
+ <tr><td class="indexkey"><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td class="indexvalue">A light-weight wrapper for manipulating nodes in DOM tree </td></tr>
+ <tr><td class="indexkey"><a class="el" href="classpugi_1_1xml__node__iterator.html">pugi::xml_node_iterator</a></td><td class="indexvalue">Child node iterator </td></tr>
+ <tr><td class="indexkey"><a class="el" href="classpugi_1_1xml__tree__walker.html">pugi::xml_tree_walker</a></td><td class="indexvalue">Abstract tree walker class </td></tr>
+ <tr><td class="indexkey"><a class="el" href="classpugi_1_1xpath__exception.html">pugi::xpath_exception</a></td><td class="indexvalue">XPath exception class </td></tr>
+ <tr><td class="indexkey"><a class="el" href="classpugi_1_1xpath__node.html">pugi::xpath_node</a></td><td class="indexvalue">XPath node class </td></tr>
+ <tr><td class="indexkey"><a class="el" href="classpugi_1_1xpath__node__set.html">pugi::xpath_node_set</a></td><td class="indexvalue">Not necessarily ordered constant collection of XPath nodes </td></tr>
+ <tr><td class="indexkey"><a class="el" href="classpugi_1_1xpath__query.html">pugi::xpath_query</a></td><td class="indexvalue">A class that holds compiled XPath query and allows to evaluate query result </td></tr>
+</table>
+<hr size="1"><address style="align: right;"><small>Generated on Wed Feb 21 22:19:50 2007 for pugixml by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6-NO </small></address>
+</body>
+</html>
diff --git a/docs/html/classpugi_1_1xml__attribute-members.html b/docs/html/classpugi_1_1xml__attribute-members.html
new file mode 100644
index 0000000..83c136c
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__attribute-members.html
@@ -0,0 +1,52 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pugixml: Member List</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6-NO -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul></div>
+<h1>pugi::xml_attribute Member List</h1>This is the complete list of members for <a class="el" href="classpugi_1_1xml__attribute.html">pugi::xml_attribute</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__attribute.html#f512177dd662f69c4259bc15312c54f0">as_bool</a>() const </td><td><a class="el" href="classpugi_1_1xml__attribute.html">pugi::xml_attribute</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__attribute.html#e3bdc34a10c904a95c066b49249e75bd">as_double</a>() const </td><td><a class="el" href="classpugi_1_1xml__attribute.html">pugi::xml_attribute</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__attribute.html#6de96400d33e382db1c30dba9302604c">as_float</a>() const </td><td><a class="el" href="classpugi_1_1xml__attribute.html">pugi::xml_attribute</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__attribute.html#9f11964a8cef05be2c3410fc5da69064">as_int</a>() const </td><td><a class="el" href="classpugi_1_1xml__attribute.html">pugi::xml_attribute</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>document_order</b>() const (defined in <a class="el" href="classpugi_1_1xml__attribute.html">pugi::xml_attribute</a>)</td><td><a class="el" href="classpugi_1_1xml__attribute.html">pugi::xml_attribute</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__attribute.html#5578d661daebb2188ea8856805e6be2f">empty</a>() const </td><td><a class="el" href="classpugi_1_1xml__attribute.html">pugi::xml_attribute</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__attribute.html#b28b196c03b0a10f7c113ba6694a4cd0">name</a>() const </td><td><a class="el" href="classpugi_1_1xml__attribute.html">pugi::xml_attribute</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__attribute.html#37ac446a8892430783382d0e40396d6b">next_attribute</a>() const </td><td><a class="el" href="classpugi_1_1xml__attribute.html">pugi::xml_attribute</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__attribute.html#176a1a482f838100f1147401f81de430">operator unspecified_bool_type</a>() const </td><td><a class="el" href="classpugi_1_1xml__attribute.html">pugi::xml_attribute</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>operator!</b>() const (defined in <a class="el" href="classpugi_1_1xml__attribute.html">pugi::xml_attribute</a>)</td><td><a class="el" href="classpugi_1_1xml__attribute.html">pugi::xml_attribute</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__attribute.html#3904027c125612776ad4bf834ad73761">operator!=</a>(const xml_attribute &amp;r) const </td><td><a class="el" href="classpugi_1_1xml__attribute.html">pugi::xml_attribute</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__attribute.html#8ae8a5e3fc967d42d9c830e4fbde0fe2">operator&lt;</a>(const xml_attribute &amp;r) const </td><td><a class="el" href="classpugi_1_1xml__attribute.html">pugi::xml_attribute</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__attribute.html#4cf978e6d5bfc56952f9d5b4eebfe68e">operator&lt;=</a>(const xml_attribute &amp;r) const </td><td><a class="el" href="classpugi_1_1xml__attribute.html">pugi::xml_attribute</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__attribute.html#101c22c37e2a8351b9eb5777d3ae28e4">operator=</a>(const char *rhs)</td><td><a class="el" href="classpugi_1_1xml__attribute.html">pugi::xml_attribute</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__attribute.html#e39b0c95fe3a0a5fe852ca73230620c3">operator=</a>(int rhs)</td><td><a class="el" href="classpugi_1_1xml__attribute.html">pugi::xml_attribute</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__attribute.html#c6ad3bddf25651a059239ec01123f087">operator=</a>(double rhs)</td><td><a class="el" href="classpugi_1_1xml__attribute.html">pugi::xml_attribute</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__attribute.html#79df9ba6c6d7adc08ea5bb9d214a11e8">operator=</a>(bool rhs)</td><td><a class="el" href="classpugi_1_1xml__attribute.html">pugi::xml_attribute</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__attribute.html#26431cc9dae292a7ae629138969e3824">operator==</a>(const xml_attribute &amp;r) const </td><td><a class="el" href="classpugi_1_1xml__attribute.html">pugi::xml_attribute</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__attribute.html#be8436c6a7fb6a151bfc160989b0948a">operator&gt;</a>(const xml_attribute &amp;r) const </td><td><a class="el" href="classpugi_1_1xml__attribute.html">pugi::xml_attribute</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__attribute.html#6f52a1362f7f8564f75e39e35e87d4ef">operator&gt;=</a>(const xml_attribute &amp;r) const </td><td><a class="el" href="classpugi_1_1xml__attribute.html">pugi::xml_attribute</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__attribute.html#584444ba6bcb328cfa9cd5c6cf08ef7f">previous_attribute</a>() const </td><td><a class="el" href="classpugi_1_1xml__attribute.html">pugi::xml_attribute</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__attribute.html#959bc0ffe307e16b1c19da6611005a3e">set_name</a>(const char *rhs)</td><td><a class="el" href="classpugi_1_1xml__attribute.html">pugi::xml_attribute</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__attribute.html#2d4f2552eeb4a51a8126f228c03a400e">set_value</a>(const char *rhs)</td><td><a class="el" href="classpugi_1_1xml__attribute.html">pugi::xml_attribute</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__attribute.html#5867b6362af3e7419199d4c58384b92a">value</a>() const </td><td><a class="el" href="classpugi_1_1xml__attribute.html">pugi::xml_attribute</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__attribute.html#a555fccff52247e39f823d564a31e4d8">xml_attribute</a>()</td><td><a class="el" href="classpugi_1_1xml__attribute.html">pugi::xml_attribute</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>xml_attribute_iterator</b> (defined in <a class="el" href="classpugi_1_1xml__attribute.html">pugi::xml_attribute</a>)</td><td><a class="el" href="classpugi_1_1xml__attribute.html">pugi::xml_attribute</a></td><td><code> [friend]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>xml_node</b> (defined in <a class="el" href="classpugi_1_1xml__attribute.html">pugi::xml_attribute</a>)</td><td><a class="el" href="classpugi_1_1xml__attribute.html">pugi::xml_attribute</a></td><td><code> [friend]</code></td></tr>
+</table><hr size="1"><address style="align: right;"><small>Generated on Wed Feb 21 22:19:51 2007 for pugixml by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6-NO </small></address>
+</body>
+</html>
diff --git a/docs/html/classpugi_1_1xml__attribute.html b/docs/html/classpugi_1_1xml__attribute.html
new file mode 100644
index 0000000..840a4a7
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__attribute.html
@@ -0,0 +1,881 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pugixml: pugi::xml_attribute Class Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6-NO -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul></div>
+<div class="nav">
+<a class="el" href="namespacepugi.html">pugi</a>::<a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a></div>
+<h1>pugi::xml_attribute Class Reference</h1><!-- doxytag: class="pugi::xml_attribute" -->Collaboration diagram for pugi::xml_attribute:<p><center><img src="classpugi_1_1xml__attribute__coll__graph.png" border="0" usemap="#pugi_1_1xml__attribute__coll__map" alt="Collaboration graph"></center>
+<center><font size="2">[<a href="graph_legend.html">legend</a>]</font></center><a href="classpugi_1_1xml__attribute-members.html">List of all members.</a><hr><a name="_details"></a><h2>Detailed Description</h2>
+A light-weight wrapper for manipulating attributes in DOM tree.
+<p>
+Note: <a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> does not allocate any memory for the attribute it wraps; it only wraps a pointer to existing attribute.
+<p>
+<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__attribute.html#a555fccff52247e39f823d564a31e4d8">xml_attribute</a> ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Default ctor. <a href="#a555fccff52247e39f823d564a31e4d8"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__attribute.html#176a1a482f838100f1147401f81de430">operator unspecified_bool_type</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Safe bool conversion. <a href="#176a1a482f838100f1147401f81de430"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bfb0498834bdf289d079504dacb34268"></a><!-- doxytag: member="pugi::xml_attribute::operator!" ref="bfb0498834bdf289d079504dacb34268" args="() const " -->
+bool&nbsp;</td><td class="memItemRight" valign="bottom"><b>operator!</b> () const </td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__attribute.html#26431cc9dae292a7ae629138969e3824">operator==</a> (const <a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> &amp;r) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Compare wrapped pointer to the attribute to the pointer that is wrapped by <em>r</em>. <a href="#26431cc9dae292a7ae629138969e3824"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__attribute.html#3904027c125612776ad4bf834ad73761">operator!=</a> (const <a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> &amp;r) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Compare wrapped pointer to the attribute to the pointer that is wrapped by <em>r</em>. <a href="#3904027c125612776ad4bf834ad73761"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__attribute.html#8ae8a5e3fc967d42d9c830e4fbde0fe2">operator&lt;</a> (const <a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> &amp;r) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Compare wrapped pointer to the attribute to the pointer that is wrapped by <em>r</em>. <a href="#8ae8a5e3fc967d42d9c830e4fbde0fe2"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__attribute.html#be8436c6a7fb6a151bfc160989b0948a">operator&gt;</a> (const <a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> &amp;r) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Compare wrapped pointer to the attribute to the pointer that is wrapped by <em>r</em>. <a href="#be8436c6a7fb6a151bfc160989b0948a"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__attribute.html#4cf978e6d5bfc56952f9d5b4eebfe68e">operator&lt;=</a> (const <a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> &amp;r) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Compare wrapped pointer to the attribute to the pointer that is wrapped by <em>r</em>. <a href="#4cf978e6d5bfc56952f9d5b4eebfe68e"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__attribute.html#6f52a1362f7f8564f75e39e35e87d4ef">operator&gt;=</a> (const <a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> &amp;r) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Compare wrapped pointer to the attribute to the pointer that is wrapped by <em>r</em>. <a href="#6f52a1362f7f8564f75e39e35e87d4ef"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__attribute.html#37ac446a8892430783382d0e40396d6b">next_attribute</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get next attribute in attribute list of node that contains the attribute. <a href="#37ac446a8892430783382d0e40396d6b"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__attribute.html#584444ba6bcb328cfa9cd5c6cf08ef7f">previous_attribute</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get previous attribute in attribute list of node that contains the attribute. <a href="#584444ba6bcb328cfa9cd5c6cf08ef7f"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__attribute.html#9f11964a8cef05be2c3410fc5da69064">as_int</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Cast attribute value as int. <a href="#9f11964a8cef05be2c3410fc5da69064"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">double&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__attribute.html#e3bdc34a10c904a95c066b49249e75bd">as_double</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Cast attribute value as double. <a href="#e3bdc34a10c904a95c066b49249e75bd"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">float&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__attribute.html#6de96400d33e382db1c30dba9302604c">as_float</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Cast attribute value as float. <a href="#6de96400d33e382db1c30dba9302604c"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__attribute.html#f512177dd662f69c4259bc15312c54f0">as_bool</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Cast attribute value as bool. <a href="#f512177dd662f69c4259bc15312c54f0"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7b974e0171f14d61f39bce1240d1d37c"></a><!-- doxytag: member="pugi::xml_attribute::document_order" ref="7b974e0171f14d61f39bce1240d1d37c" args="() const " -->
+unsigned int&nbsp;</td><td class="memItemRight" valign="bottom"><b>document_order</b> () const </td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> &amp;&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__attribute.html#101c22c37e2a8351b9eb5777d3ae28e4">operator=</a> (const char *rhs)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Set attribute value to <em>rhs</em>. <a href="#101c22c37e2a8351b9eb5777d3ae28e4"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> &amp;&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__attribute.html#e39b0c95fe3a0a5fe852ca73230620c3">operator=</a> (int rhs)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Set attribute value to <em>rhs</em>. <a href="#e39b0c95fe3a0a5fe852ca73230620c3"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> &amp;&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__attribute.html#c6ad3bddf25651a059239ec01123f087">operator=</a> (double rhs)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Set attribute value to <em>rhs</em>. <a href="#c6ad3bddf25651a059239ec01123f087"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> &amp;&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__attribute.html#79df9ba6c6d7adc08ea5bb9d214a11e8">operator=</a> (bool rhs)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Set attribute value to either 'true' or 'false' (depends on whether <em>rhs</em> is true or false). <a href="#79df9ba6c6d7adc08ea5bb9d214a11e8"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__attribute.html#959bc0ffe307e16b1c19da6611005a3e">set_name</a> (const char *rhs)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Set attribute name to <em>rhs</em>. <a href="#959bc0ffe307e16b1c19da6611005a3e"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__attribute.html#2d4f2552eeb4a51a8126f228c03a400e">set_value</a> (const char *rhs)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Set attribute value to <em>rhs</em>. <a href="#2d4f2552eeb4a51a8126f228c03a400e"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__attribute.html#5578d661daebb2188ea8856805e6be2f">empty</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Check if attribute is empty. <a href="#5578d661daebb2188ea8856805e6be2f"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">const char *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__attribute.html#b28b196c03b0a10f7c113ba6694a4cd0">name</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get attribute name. <a href="#b28b196c03b0a10f7c113ba6694a4cd0"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">const char *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__attribute.html#5867b6362af3e7419199d4c58384b92a">value</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get attribute value. <a href="#5867b6362af3e7419199d4c58384b92a"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eff34dec57ee910e3344631528969539"></a><!-- doxytag: member="pugi::xml_attribute::xml_attribute_iterator" ref="eff34dec57ee910e3344631528969539" args="" -->
+class&nbsp;</td><td class="memItemRight" valign="bottom"><b>xml_attribute_iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="156d917a92815c7b593bd5ef19f6d5fb"></a><!-- doxytag: member="pugi::xml_attribute::xml_node" ref="156d917a92815c7b593bd5ef19f6d5fb" args="" -->
+class&nbsp;</td><td class="memItemRight" valign="bottom"><b>xml_node</b></td></tr>
+
+</table>
+<hr><h2>Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" name="a555fccff52247e39f823d564a31e4d8"></a><!-- doxytag: member="pugi::xml_attribute::xml_attribute" ref="a555fccff52247e39f823d564a31e4d8" args="()" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">pugi::xml_attribute::xml_attribute </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Default ctor.
+<p>
+Constructs an empty attribute. </td>
+ </tr>
+</table>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="176a1a482f838100f1147401f81de430"></a><!-- doxytag: member="pugi::xml_attribute::operator unspecified_bool_type" ref="176a1a482f838100f1147401f81de430" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">pugi::xml_attribute::operator unspecified_bool_type </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Safe bool conversion.
+<p>
+Allows <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> to be used in a context where boolean variable is expected, such as 'if (node)'. </td>
+ </tr>
+</table>
+<a class="anchor" name="26431cc9dae292a7ae629138969e3824"></a><!-- doxytag: member="pugi::xml_attribute::operator==" ref="26431cc9dae292a7ae629138969e3824" args="(const xml_attribute &amp;r) const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">bool pugi::xml_attribute::operator== </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const <a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> &amp;&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>r</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Compare wrapped pointer to the attribute to the pointer that is wrapped by <em>r</em>.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>r</em>&nbsp;</td><td>- value to compare to </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>comparison result </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="3904027c125612776ad4bf834ad73761"></a><!-- doxytag: member="pugi::xml_attribute::operator!=" ref="3904027c125612776ad4bf834ad73761" args="(const xml_attribute &amp;r) const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">bool pugi::xml_attribute::operator!= </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const <a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> &amp;&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>r</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Compare wrapped pointer to the attribute to the pointer that is wrapped by <em>r</em>.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>r</em>&nbsp;</td><td>- value to compare to </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>comparison result </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="8ae8a5e3fc967d42d9c830e4fbde0fe2"></a><!-- doxytag: member="pugi::xml_attribute::operator&lt;" ref="8ae8a5e3fc967d42d9c830e4fbde0fe2" args="(const xml_attribute &amp;r) const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">bool pugi::xml_attribute::operator&lt; </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const <a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> &amp;&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>r</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Compare wrapped pointer to the attribute to the pointer that is wrapped by <em>r</em>.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>r</em>&nbsp;</td><td>- value to compare to </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>comparison result </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="be8436c6a7fb6a151bfc160989b0948a"></a><!-- doxytag: member="pugi::xml_attribute::operator&gt;" ref="be8436c6a7fb6a151bfc160989b0948a" args="(const xml_attribute &amp;r) const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">bool pugi::xml_attribute::operator&gt; </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const <a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> &amp;&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>r</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Compare wrapped pointer to the attribute to the pointer that is wrapped by <em>r</em>.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>r</em>&nbsp;</td><td>- value to compare to </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>comparison result </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="4cf978e6d5bfc56952f9d5b4eebfe68e"></a><!-- doxytag: member="pugi::xml_attribute::operator&lt;=" ref="4cf978e6d5bfc56952f9d5b4eebfe68e" args="(const xml_attribute &amp;r) const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">bool pugi::xml_attribute::operator&lt;= </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const <a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> &amp;&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>r</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Compare wrapped pointer to the attribute to the pointer that is wrapped by <em>r</em>.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>r</em>&nbsp;</td><td>- value to compare to </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>comparison result </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="6f52a1362f7f8564f75e39e35e87d4ef"></a><!-- doxytag: member="pugi::xml_attribute::operator&gt;=" ref="6f52a1362f7f8564f75e39e35e87d4ef" args="(const xml_attribute &amp;r) const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">bool pugi::xml_attribute::operator&gt;= </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const <a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> &amp;&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>r</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Compare wrapped pointer to the attribute to the pointer that is wrapped by <em>r</em>.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>r</em>&nbsp;</td><td>- value to compare to </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>comparison result </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="37ac446a8892430783382d0e40396d6b"></a><!-- doxytag: member="pugi::xml_attribute::next_attribute" ref="37ac446a8892430783382d0e40396d6b" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> pugi::xml_attribute::next_attribute </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Get next attribute in attribute list of node that contains the attribute.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>next attribute, if any; empty attribute otherwise </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="584444ba6bcb328cfa9cd5c6cf08ef7f"></a><!-- doxytag: member="pugi::xml_attribute::previous_attribute" ref="584444ba6bcb328cfa9cd5c6cf08ef7f" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> pugi::xml_attribute::previous_attribute </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Get previous attribute in attribute list of node that contains the attribute.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>previous attribute, if any; empty attribute otherwise </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="9f11964a8cef05be2c3410fc5da69064"></a><!-- doxytag: member="pugi::xml_attribute::as_int" ref="9f11964a8cef05be2c3410fc5da69064" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">int pugi::xml_attribute::as_int </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Cast attribute value as int.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>attribute value as int, or 0 if conversion did not succeed or attribute is empty </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="e3bdc34a10c904a95c066b49249e75bd"></a><!-- doxytag: member="pugi::xml_attribute::as_double" ref="e3bdc34a10c904a95c066b49249e75bd" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">double pugi::xml_attribute::as_double </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Cast attribute value as double.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>attribute value as double, or 0.0 if conversion did not succeed or attribute is empty </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="6de96400d33e382db1c30dba9302604c"></a><!-- doxytag: member="pugi::xml_attribute::as_float" ref="6de96400d33e382db1c30dba9302604c" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">float pugi::xml_attribute::as_float </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Cast attribute value as float.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>attribute value as float, or 0.0f if conversion did not succeed or attribute is empty </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="f512177dd662f69c4259bc15312c54f0"></a><!-- doxytag: member="pugi::xml_attribute::as_bool" ref="f512177dd662f69c4259bc15312c54f0" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">bool pugi::xml_attribute::as_bool </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Cast attribute value as bool.
+<p>
+Returns true for attributes with values that start with '1', 't', 'T', 'y', 'Y', returns false for other attributes.<p>
+<dl compact><dt><b>Returns:</b></dt><dd>attribute value as bool, or false if conversion did not succeed or attribute is empty </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="101c22c37e2a8351b9eb5777d3ae28e4"></a><!-- doxytag: member="pugi::xml_attribute::operator=" ref="101c22c37e2a8351b9eb5777d3ae28e4" args="(const char *rhs)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a>&amp; pugi::xml_attribute::operator= </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const char *&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>rhs</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Set attribute value to <em>rhs</em>.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>rhs</em>&nbsp;</td><td>- new attribute value </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>self </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="e39b0c95fe3a0a5fe852ca73230620c3"></a><!-- doxytag: member="pugi::xml_attribute::operator=" ref="e39b0c95fe3a0a5fe852ca73230620c3" args="(int rhs)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a>&amp; pugi::xml_attribute::operator= </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">int&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>rhs</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Set attribute value to <em>rhs</em>.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>rhs</em>&nbsp;</td><td>- new attribute value </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>self </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="c6ad3bddf25651a059239ec01123f087"></a><!-- doxytag: member="pugi::xml_attribute::operator=" ref="c6ad3bddf25651a059239ec01123f087" args="(double rhs)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a>&amp; pugi::xml_attribute::operator= </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">double&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>rhs</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Set attribute value to <em>rhs</em>.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>rhs</em>&nbsp;</td><td>- new attribute value </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>self </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="79df9ba6c6d7adc08ea5bb9d214a11e8"></a><!-- doxytag: member="pugi::xml_attribute::operator=" ref="79df9ba6c6d7adc08ea5bb9d214a11e8" args="(bool rhs)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a>&amp; pugi::xml_attribute::operator= </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">bool&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>rhs</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Set attribute value to either 'true' or 'false' (depends on whether <em>rhs</em> is true or false).
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>rhs</em>&nbsp;</td><td>- new attribute value </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>self </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="959bc0ffe307e16b1c19da6611005a3e"></a><!-- doxytag: member="pugi::xml_attribute::set_name" ref="959bc0ffe307e16b1c19da6611005a3e" args="(const char *rhs)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">bool pugi::xml_attribute::set_name </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const char *&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>rhs</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Set attribute name to <em>rhs</em>.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>rhs</em>&nbsp;</td><td>- new attribute name </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>success flag (call fails if attribute is empty or there is not enough memory) </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="2d4f2552eeb4a51a8126f228c03a400e"></a><!-- doxytag: member="pugi::xml_attribute::set_value" ref="2d4f2552eeb4a51a8126f228c03a400e" args="(const char *rhs)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">bool pugi::xml_attribute::set_value </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const char *&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>rhs</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Set attribute value to <em>rhs</em>.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>rhs</em>&nbsp;</td><td>- new attribute value </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>success flag (call fails if attribute is empty or there is not enough memory) </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="5578d661daebb2188ea8856805e6be2f"></a><!-- doxytag: member="pugi::xml_attribute::empty" ref="5578d661daebb2188ea8856805e6be2f" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">bool pugi::xml_attribute::empty </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Check if attribute is empty.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>true if attribute is empty, false otherwise </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="b28b196c03b0a10f7c113ba6694a4cd0"></a><!-- doxytag: member="pugi::xml_attribute::name" ref="b28b196c03b0a10f7c113ba6694a4cd0" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">const char* pugi::xml_attribute::name </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Get attribute name.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>attribute name, or "" if attribute is empty </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="5867b6362af3e7419199d4c58384b92a"></a><!-- doxytag: member="pugi::xml_attribute::value" ref="5867b6362af3e7419199d4c58384b92a" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">const char* pugi::xml_attribute::value </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Get attribute value.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>attribute value, or "" if attribute is empty </dd></dl>
+ </td>
+ </tr>
+</table>
+<hr size="1"><address style="align: right;"><small>Generated on Wed Feb 21 22:19:51 2007 for pugixml by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6-NO </small></address>
+</body>
+</html>
diff --git a/docs/html/classpugi_1_1xml__attribute__coll__graph.map b/docs/html/classpugi_1_1xml__attribute__coll__graph.map
new file mode 100644
index 0000000..5a14779
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__attribute__coll__graph.map
@@ -0,0 +1 @@
+base referer
diff --git a/docs/html/classpugi_1_1xml__attribute__coll__graph.md5 b/docs/html/classpugi_1_1xml__attribute__coll__graph.md5
new file mode 100644
index 0000000..5c6e354
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__attribute__coll__graph.md5
@@ -0,0 +1 @@
+bbcc1bb9d46dc6d7963d87bb57d9c972 \ No newline at end of file
diff --git a/docs/html/classpugi_1_1xml__attribute__coll__graph.png b/docs/html/classpugi_1_1xml__attribute__coll__graph.png
new file mode 100644
index 0000000..92a5dc0
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__attribute__coll__graph.png
Binary files differ
diff --git a/docs/html/classpugi_1_1xml__attribute__iterator-members.html b/docs/html/classpugi_1_1xml__attribute__iterator-members.html
new file mode 100644
index 0000000..48c5720
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__attribute__iterator-members.html
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pugixml: Member List</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6-NO -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul></div>
+<h1>pugi::xml_attribute_iterator Member List</h1>This is the complete list of members for <a class="el" href="classpugi_1_1xml__attribute__iterator.html">pugi::xml_attribute_iterator</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__attribute__iterator.html#ef0da918a50b53390faef17f6c81ce58">operator *</a>()</td><td><a class="el" href="classpugi_1_1xml__attribute__iterator.html">pugi::xml_attribute_iterator</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__attribute__iterator.html#ff31d15fb408f567e8aaa03569865c87">operator!=</a>(const xml_attribute_iterator &amp;rhs) const </td><td><a class="el" href="classpugi_1_1xml__attribute__iterator.html">pugi::xml_attribute_iterator</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__attribute__iterator.html#3104784f527c4318e1b7718a9a327868">operator++</a>()</td><td><a class="el" href="classpugi_1_1xml__attribute__iterator.html">pugi::xml_attribute_iterator</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__attribute__iterator.html#6b97c3b1a278c668240d7ab0b20d77ae">operator++</a>(int)</td><td><a class="el" href="classpugi_1_1xml__attribute__iterator.html">pugi::xml_attribute_iterator</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__attribute__iterator.html#45bf4e45a807a8c23a10b80c8b8930bd">operator--</a>()</td><td><a class="el" href="classpugi_1_1xml__attribute__iterator.html">pugi::xml_attribute_iterator</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__attribute__iterator.html#4b172ad267089d166221967c3b3a05ae">operator--</a>(int)</td><td><a class="el" href="classpugi_1_1xml__attribute__iterator.html">pugi::xml_attribute_iterator</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__attribute__iterator.html#205b888a86103197a70f57860c4c2ae4">operator-&gt;</a>()</td><td><a class="el" href="classpugi_1_1xml__attribute__iterator.html">pugi::xml_attribute_iterator</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__attribute__iterator.html#6478076e6a12f5900992008311e42963">operator==</a>(const xml_attribute_iterator &amp;rhs) const </td><td><a class="el" href="classpugi_1_1xml__attribute__iterator.html">pugi::xml_attribute_iterator</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__attribute__iterator.html#bdc6df1b586551706b124eed1badaafd">xml_attribute_iterator</a>()</td><td><a class="el" href="classpugi_1_1xml__attribute__iterator.html">pugi::xml_attribute_iterator</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__attribute__iterator.html#4595648e3aa06a3209f200c69805ed47">xml_attribute_iterator</a>(const xml_attribute &amp;node)</td><td><a class="el" href="classpugi_1_1xml__attribute__iterator.html">pugi::xml_attribute_iterator</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__attribute__iterator.html#c99270b894dd2faeab9fc6eb3832dc94">xml_attribute_iterator</a>(xml_attribute_struct *ref, xml_attribute_struct *prev)</td><td><a class="el" href="classpugi_1_1xml__attribute__iterator.html">pugi::xml_attribute_iterator</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>xml_node</b> (defined in <a class="el" href="classpugi_1_1xml__attribute__iterator.html">pugi::xml_attribute_iterator</a>)</td><td><a class="el" href="classpugi_1_1xml__attribute__iterator.html">pugi::xml_attribute_iterator</a></td><td><code> [friend]</code></td></tr>
+</table><hr size="1"><address style="align: right;"><small>Generated on Wed Feb 21 22:19:51 2007 for pugixml by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6-NO </small></address>
+</body>
+</html>
diff --git a/docs/html/classpugi_1_1xml__attribute__iterator.html b/docs/html/classpugi_1_1xml__attribute__iterator.html
new file mode 100644
index 0000000..81b80cb
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__attribute__iterator.html
@@ -0,0 +1,414 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pugixml: pugi::xml_attribute_iterator Class Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6-NO -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul></div>
+<div class="nav">
+<a class="el" href="namespacepugi.html">pugi</a>::<a class="el" href="classpugi_1_1xml__attribute__iterator.html">xml_attribute_iterator</a></div>
+<h1>pugi::xml_attribute_iterator Class Reference</h1><!-- doxytag: class="pugi::xml_attribute_iterator" --><!-- doxytag: inherits="std::iterator" -->Inheritance diagram for pugi::xml_attribute_iterator:<p><center><img src="classpugi_1_1xml__attribute__iterator__inherit__graph.png" border="0" usemap="#pugi_1_1xml__attribute__iterator__inherit__map" alt="Inheritance graph"></center>
+<center><font size="2">[<a href="graph_legend.html">legend</a>]</font></center>Collaboration diagram for pugi::xml_attribute_iterator:<p><center><img src="classpugi_1_1xml__attribute__iterator__coll__graph.png" border="0" usemap="#pugi_1_1xml__attribute__iterator__coll__map" alt="Collaboration graph"></center>
+<map name="pugi_1_1xml__attribute__iterator__coll__map">
+<area href="classpugi_1_1xml__attribute.html" shape="rect" coords="394,98,528,125" alt="">
+</map>
+<center><font size="2">[<a href="graph_legend.html">legend</a>]</font></center><a href="classpugi_1_1xml__attribute__iterator-members.html">List of all members.</a><hr><a name="_details"></a><h2>Detailed Description</h2>
+Attribute iterator.
+<p>
+It's a bidirectional iterator with value type 'xml_attribute'.
+<p>
+<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bdc6df1b586551706b124eed1badaafd"></a><!-- doxytag: member="pugi::xml_attribute_iterator::xml_attribute_iterator" ref="bdc6df1b586551706b124eed1badaafd" args="()" -->
+&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__attribute__iterator.html#bdc6df1b586551706b124eed1badaafd">xml_attribute_iterator</a> ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Default ctor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__attribute__iterator.html#4595648e3aa06a3209f200c69805ed47">xml_attribute_iterator</a> (const <a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> &amp;node)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Initializing ctor. <a href="#4595648e3aa06a3209f200c69805ed47"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__attribute__iterator.html#c99270b894dd2faeab9fc6eb3832dc94">xml_attribute_iterator</a> (xml_attribute_struct *ref, xml_attribute_struct *prev)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Initializing ctor (for past-the-end). <a href="#c99270b894dd2faeab9fc6eb3832dc94"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__attribute__iterator.html#6478076e6a12f5900992008311e42963">operator==</a> (const <a class="el" href="classpugi_1_1xml__attribute__iterator.html">xml_attribute_iterator</a> &amp;rhs) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Check if this iterator is equal to <em>rhs</em>. <a href="#6478076e6a12f5900992008311e42963"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__attribute__iterator.html#ff31d15fb408f567e8aaa03569865c87">operator!=</a> (const <a class="el" href="classpugi_1_1xml__attribute__iterator.html">xml_attribute_iterator</a> &amp;rhs) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Check if this iterator is not equal to <em>rhs</em>. <a href="#ff31d15fb408f567e8aaa03569865c87"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> &amp;&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__attribute__iterator.html#ef0da918a50b53390faef17f6c81ce58">operator *</a> ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Dereferencing operator. <a href="#ef0da918a50b53390faef17f6c81ce58"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__attribute__iterator.html#205b888a86103197a70f57860c4c2ae4">operator-&gt;</a> ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Member access operator. <a href="#205b888a86103197a70f57860c4c2ae4"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">const <a class="el" href="classpugi_1_1xml__attribute__iterator.html">xml_attribute_iterator</a> &amp;&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__attribute__iterator.html#3104784f527c4318e1b7718a9a327868">operator++</a> ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Pre-increment operator. <a href="#3104784f527c4318e1b7718a9a327868"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__attribute__iterator.html">xml_attribute_iterator</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__attribute__iterator.html#6b97c3b1a278c668240d7ab0b20d77ae">operator++</a> (int)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Post-increment operator. <a href="#6b97c3b1a278c668240d7ab0b20d77ae"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">const <a class="el" href="classpugi_1_1xml__attribute__iterator.html">xml_attribute_iterator</a> &amp;&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__attribute__iterator.html#45bf4e45a807a8c23a10b80c8b8930bd">operator--</a> ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Pre-decrement operator. <a href="#45bf4e45a807a8c23a10b80c8b8930bd"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__attribute__iterator.html">xml_attribute_iterator</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__attribute__iterator.html#4b172ad267089d166221967c3b3a05ae">operator--</a> (int)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Post-decrement operator. <a href="#4b172ad267089d166221967c3b3a05ae"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="156d917a92815c7b593bd5ef19f6d5fb"></a><!-- doxytag: member="pugi::xml_attribute_iterator::xml_node" ref="156d917a92815c7b593bd5ef19f6d5fb" args="" -->
+class&nbsp;</td><td class="memItemRight" valign="bottom"><b>xml_node</b></td></tr>
+
+</table>
+<hr><h2>Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" name="4595648e3aa06a3209f200c69805ed47"></a><!-- doxytag: member="pugi::xml_attribute_iterator::xml_attribute_iterator" ref="4595648e3aa06a3209f200c69805ed47" args="(const xml_attribute &amp;node)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">pugi::xml_attribute_iterator::xml_attribute_iterator </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const <a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> &amp;&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>node</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Initializing ctor.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>node</em>&nbsp;</td><td>- node that iterator will point at </td></tr>
+ </table>
+</dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="c99270b894dd2faeab9fc6eb3832dc94"></a><!-- doxytag: member="pugi::xml_attribute_iterator::xml_attribute_iterator" ref="c99270b894dd2faeab9fc6eb3832dc94" args="(xml_attribute_struct *ref, xml_attribute_struct *prev)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">pugi::xml_attribute_iterator::xml_attribute_iterator </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">xml_attribute_struct *&nbsp;</td>
+ <td class="mdname" nowrap> <em>ref</em>, </td>
+ </tr>
+ <tr>
+ <td class="md" nowrap align="right"></td>
+ <td class="md"></td>
+ <td class="md" nowrap>xml_attribute_struct *&nbsp;</td>
+ <td class="mdname" nowrap> <em>prev</em></td>
+ </tr>
+ <tr>
+ <td class="md"></td>
+ <td class="md">)&nbsp;</td>
+ <td class="md" colspan="2"></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Initializing ctor (for past-the-end).
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>ref</em>&nbsp;</td><td>- should be 0 </td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>prev</em>&nbsp;</td><td>- previous node </td></tr>
+ </table>
+</dl>
+ </td>
+ </tr>
+</table>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="6478076e6a12f5900992008311e42963"></a><!-- doxytag: member="pugi::xml_attribute_iterator::operator==" ref="6478076e6a12f5900992008311e42963" args="(const xml_attribute_iterator &amp;rhs) const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">bool pugi::xml_attribute_iterator::operator== </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const <a class="el" href="classpugi_1_1xml__attribute__iterator.html">xml_attribute_iterator</a> &amp;&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>rhs</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Check if this iterator is equal to <em>rhs</em>.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>rhs</em>&nbsp;</td><td>- other iterator </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>comparison result </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="ff31d15fb408f567e8aaa03569865c87"></a><!-- doxytag: member="pugi::xml_attribute_iterator::operator!=" ref="ff31d15fb408f567e8aaa03569865c87" args="(const xml_attribute_iterator &amp;rhs) const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">bool pugi::xml_attribute_iterator::operator!= </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const <a class="el" href="classpugi_1_1xml__attribute__iterator.html">xml_attribute_iterator</a> &amp;&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>rhs</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Check if this iterator is not equal to <em>rhs</em>.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>rhs</em>&nbsp;</td><td>- other iterator </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>comparison result </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="ef0da918a50b53390faef17f6c81ce58"></a><!-- doxytag: member="pugi::xml_attribute_iterator::operator *" ref="ef0da918a50b53390faef17f6c81ce58" args="()" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a>&amp; pugi::xml_attribute_iterator::operator * </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Dereferencing operator.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>reference to the node iterator points at </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="205b888a86103197a70f57860c4c2ae4"></a><!-- doxytag: member="pugi::xml_attribute_iterator::operator-&gt;" ref="205b888a86103197a70f57860c4c2ae4" args="()" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a>* pugi::xml_attribute_iterator::operator-&gt; </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Member access operator.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>poitner to the node iterator points at </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="3104784f527c4318e1b7718a9a327868"></a><!-- doxytag: member="pugi::xml_attribute_iterator::operator++" ref="3104784f527c4318e1b7718a9a327868" args="()" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">const <a class="el" href="classpugi_1_1xml__attribute__iterator.html">xml_attribute_iterator</a>&amp; pugi::xml_attribute_iterator::operator++ </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Pre-increment operator.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>self </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="6b97c3b1a278c668240d7ab0b20d77ae"></a><!-- doxytag: member="pugi::xml_attribute_iterator::operator++" ref="6b97c3b1a278c668240d7ab0b20d77ae" args="(int)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__attribute__iterator.html">xml_attribute_iterator</a> pugi::xml_attribute_iterator::operator++ </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">int&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Post-increment operator.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>old value </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="45bf4e45a807a8c23a10b80c8b8930bd"></a><!-- doxytag: member="pugi::xml_attribute_iterator::operator--" ref="45bf4e45a807a8c23a10b80c8b8930bd" args="()" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">const <a class="el" href="classpugi_1_1xml__attribute__iterator.html">xml_attribute_iterator</a>&amp; pugi::xml_attribute_iterator::operator-- </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Pre-decrement operator.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>self </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="4b172ad267089d166221967c3b3a05ae"></a><!-- doxytag: member="pugi::xml_attribute_iterator::operator--" ref="4b172ad267089d166221967c3b3a05ae" args="(int)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__attribute__iterator.html">xml_attribute_iterator</a> pugi::xml_attribute_iterator::operator-- </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">int&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Post-decrement operator.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>old value </dd></dl>
+ </td>
+ </tr>
+</table>
+<hr size="1"><address style="align: right;"><small>Generated on Wed Feb 21 22:19:51 2007 for pugixml by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6-NO </small></address>
+</body>
+</html>
diff --git a/docs/html/classpugi_1_1xml__attribute__iterator__coll__graph.map b/docs/html/classpugi_1_1xml__attribute__iterator__coll__graph.map
new file mode 100644
index 0000000..8ab0214
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__attribute__iterator__coll__graph.map
@@ -0,0 +1,2 @@
+base referer
+rect $classpugi_1_1xml__attribute.html 394,98 528,125
diff --git a/docs/html/classpugi_1_1xml__attribute__iterator__coll__graph.md5 b/docs/html/classpugi_1_1xml__attribute__iterator__coll__graph.md5
new file mode 100644
index 0000000..374ea03
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__attribute__iterator__coll__graph.md5
@@ -0,0 +1 @@
+fca591ae465868d5d6efde7fe15693de \ No newline at end of file
diff --git a/docs/html/classpugi_1_1xml__attribute__iterator__coll__graph.png b/docs/html/classpugi_1_1xml__attribute__iterator__coll__graph.png
new file mode 100644
index 0000000..d188df2
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__attribute__iterator__coll__graph.png
Binary files differ
diff --git a/docs/html/classpugi_1_1xml__attribute__iterator__inherit__graph.map b/docs/html/classpugi_1_1xml__attribute__iterator__inherit__graph.map
new file mode 100644
index 0000000..5a14779
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__attribute__iterator__inherit__graph.map
@@ -0,0 +1 @@
+base referer
diff --git a/docs/html/classpugi_1_1xml__attribute__iterator__inherit__graph.md5 b/docs/html/classpugi_1_1xml__attribute__iterator__inherit__graph.md5
new file mode 100644
index 0000000..c6bbcb8
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__attribute__iterator__inherit__graph.md5
@@ -0,0 +1 @@
+4426af196a7b9222c3d5e7c1a18fcd84 \ No newline at end of file
diff --git a/docs/html/classpugi_1_1xml__attribute__iterator__inherit__graph.png b/docs/html/classpugi_1_1xml__attribute__iterator__inherit__graph.png
new file mode 100644
index 0000000..8b08b13
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__attribute__iterator__inherit__graph.png
Binary files differ
diff --git a/docs/html/classpugi_1_1xml__document-members.html b/docs/html/classpugi_1_1xml__document-members.html
new file mode 100644
index 0000000..e25d78d
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__document-members.html
@@ -0,0 +1,103 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pugixml: Member List</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6-NO -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul></div>
+<h1>pugi::xml_document Member List</h1>This is the complete list of members for <a class="el" href="classpugi_1_1xml__document.html">pugi::xml_document</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>_root</b> (defined in <a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a>)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#21a123c51fa592b6f2ceb2e22411edd9">all_elements_by_name</a>(const char *name, OutputIterator it) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#90347629066ca2eedeaee4d5d4038fe7">all_elements_by_name_w</a>(const char *name, OutputIterator it) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#645c4d7283f755a7b25839667a5fd9c7">append_attribute</a>(const char *name)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#498e41f14a04014eaf5d6af3ae8f9d99">append_child</a>(xml_node_type type=node_element)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#974b051c270013d889d57cda2e8af669">attribute</a>(const char *name) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#9084f97350ffc64af1eaf7c17c57f4ba">attribute_iterator</a> typedef</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#690982cdfd2c6181e1118d8238d64a54">attribute_w</a>(const char *name) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#b62a944c00d7ed00519e83c23bed0675">attributes_begin</a>() const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#3dffd0eff455030c2075451327403beb">attributes_end</a>() const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#af4acdf745dfb4b01e3f144ed314d28a">begin</a>() const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#eecbadd7bdc18c503064f7c47efe067a">child</a>(const char *name) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#6726059659e4df0aaa9c2f9fd1053e98">child_value</a>() const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#be85f5f7160c0b314691d4a45fb61151">child_value</a>(const char *name) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#441dfaf2aa8435154674cae81e5fb77c">child_value_w</a>(const char *name) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#961024c2c8424a01a8528c96f520c05f">child_w</a>(const char *name) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>document_order</b>() const (defined in <a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a>)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#3516f879718f3ea1782a0324cb31f798">empty</a>() const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#1cfc6360de985d724812f67650892658">end</a>() const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#6b921b19dbf2c792daaf46544df44fb6">find_attribute</a>(Predicate pred) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#132ca635cc0ab99180be0ffcc156a616">find_child</a>(Predicate pred) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#f3a5796f1c99df52244f3c73f5c03d8e">find_node</a>(Predicate pred) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#aae0bdb0c69fb895f66b239720d5d2d0">first_attribute</a>() const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#da6e0ce4318d7f72f8b037e39433b298">first_child</a>() const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#4be3a6da6307a33954fbdc5f210de209">first_element_by_path</a>(const char *path, char delimiter= '/') const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>get_allocator</b>() const (defined in <a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a>)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#395ce9c52840edead28b50a7a69565ab">insert_attribute_after</a>(const char *name, const xml_attribute &amp;attr)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#36cfed4439fba1f140d89e351c2bb552">insert_attribute_before</a>(const char *name, const xml_attribute &amp;attr)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#fb2c70e3908e65b001dcd9bcf794d605">insert_child_after</a>(xml_node_type type, const xml_node &amp;node)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#a07c23d9835e8174fbe75f0c9a0c7d7b">insert_child_before</a>(xml_node_type type, const xml_node &amp;node)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#e053ea39add5a64de584f7a81212e388">iterator</a> typedef</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#3e93125923e0b195de4369d50776ecc6">last_attribute</a>() const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#b92290e7dbc9292e4ff5d6949bd02e01">last_child</a>() const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__document.html#ea4dd8757cc94d3b262674609315afdd">load</a>(std::istream &amp;stream, unsigned int options=parse_default)</td><td><a class="el" href="classpugi_1_1xml__document.html">pugi::xml_document</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__document.html#77501ece75c709bfb4e479d7cf5f92e3">load</a>(const char *contents, unsigned int options=parse_default)</td><td><a class="el" href="classpugi_1_1xml__document.html">pugi::xml_document</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__document.html#0362034d3715646568869514dbf8f419">load_file</a>(const char *name, unsigned int options=parse_default)</td><td><a class="el" href="classpugi_1_1xml__document.html">pugi::xml_document</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#1f0c8b4652edc55e4f46ced685ae60f4">name</a>() const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#e76de35f11d46c9987d87262e9430b77">next_sibling</a>(const char *name) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#1d0d1e460eff5305e6bf50d9f65a58bc">next_sibling</a>() const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#3154a0d481e54bbde8f01edd1901698c">next_sibling_w</a>(const char *name) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#fa8c35f7bc0254101cf4979372deb52e">operator unspecified_bool_type</a>() const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>operator!</b>() const (defined in <a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a>)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#7b5aeeff39fd31e5123ba5c23d6b8676">operator!=</a>(const xml_node &amp;r) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#8d7c1b506be1b2ee0dea7dca1f2e80d6">operator&lt;</a>(const xml_node &amp;r) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#a97cf42c013ec35eb76c5314cadb4e26">operator&lt;=</a>(const xml_node &amp;r) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#427236c4a20d1fa232bd2233f72c73be">operator==</a>(const xml_node &amp;r) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#04a82fd56f91edb82bf34cc409bdcf04">operator&gt;</a>(const xml_node &amp;r) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#08e0c3feeb7909e6234a8fe7ccb07d7c">operator&gt;=</a>(const xml_node &amp;r) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#aa4c19abe199d4eacae18f832deb4d70">parent</a>() const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__document.html#6df96142a186efcbd14a496cd1d54c71">parse</a>(char *xmlstr, unsigned int options=parse_default)</td><td><a class="el" href="classpugi_1_1xml__document.html">pugi::xml_document</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__document.html#2742c9acf467f0d3e2651c25bed76634">parse</a>(const transfer_ownership_tag &amp;, char *xmlstr, unsigned int options=parse_default)</td><td><a class="el" href="classpugi_1_1xml__document.html">pugi::xml_document</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#9d5ed8a5d73d252e5786f034d277d504">path</a>(char delimiter= '/') const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__document.html#952fa74a00a02d64ab7600ac2c72fb4b">precompute_document_order</a>()</td><td><a class="el" href="classpugi_1_1xml__document.html">pugi::xml_document</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>precompute_document_order_impl</b>() (defined in <a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a>)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#d8b5f303fe2f9305318c2d500041f088">previous_sibling</a>(const char *name) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#919305f60b3ac08432867cbc94f6e3da">previous_sibling</a>() const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#f98f6bc32514761133fc01eec3c77a09">previous_sibling_w</a>(const char *name) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#8a0a9d086cc2e5c1f92cb79452695949">print</a>(std::ostream &amp;os, const char *indent=&quot;\t&quot;, unsigned int flags=format_default, unsigned int depth=0)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#af26856382cbd75434e7ac3ac255c2a7">remove_attribute</a>(const xml_attribute &amp;a)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#177097ca7770e8d80350d15cc96a3dd9">remove_attribute</a>(const char *name)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#f44301eb411be0e0787c49d292c93fb5">remove_child</a>(const xml_node &amp;n)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#023157bd57e3696c9f49f23944ac909f">remove_child</a>(const char *name)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#f7d6cc0124c07dbb192e779c375a7c16">root</a>() const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__document.html#716c23429fcac408ee1073353056485d">save_file</a>(const char *name, const char *indent=&quot;\t&quot;, unsigned int flags=format_default)</td><td><a class="el" href="classpugi_1_1xml__document.html">pugi::xml_document</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#6f73abaa40adb72a826095cf107e9624">select_nodes</a>(const char *query) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#041475ecea08aeab971707daefe0c3c7">select_nodes</a>(xpath_query &amp;query) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#51e5d0926657898bd555bf9560805230">select_single_node</a>(const char *query) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#30e004e4939797a84da7916ea950ec33">select_single_node</a>(xpath_query &amp;query) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#f81bf55a3f7b9d40ee8807ac1be93a86">set_name</a>(const char *rhs)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#afa7b8f3ffa652e5e279f79e04d22d4c">set_value</a>(const char *rhs)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#41be22248598bdf1575ed8d7bdd77807">traverse</a>(xml_tree_walker &amp;walker)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#28231e644bc70075286c75175a05d849">type</a>() const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>unspecified_bool_type</b> typedef (defined in <a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a>)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#0f28b7a44f40d1ac58fdc8202e04805e">value</a>() const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__document.html#8db801c1d42eaa9073d14dfafda84f37">xml_document</a>()</td><td><a class="el" href="classpugi_1_1xml__document.html">pugi::xml_document</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>xml_node</b>(xml_node_struct *p) (defined in <a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a>)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td><code> [explicit, protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#1db6c67c97cddd74f59d872057987432">xml_node</a>()</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__document.html#16c086e679286271b0ccd4541d1c1290">~xml_document</a>()</td><td><a class="el" href="classpugi_1_1xml__document.html">pugi::xml_document</a></td><td></td></tr>
+</table><hr size="1"><address style="align: right;"><small>Generated on Wed Feb 21 22:19:52 2007 for pugixml by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6-NO </small></address>
+</body>
+</html>
diff --git a/docs/html/classpugi_1_1xml__document.html b/docs/html/classpugi_1_1xml__document.html
new file mode 100644
index 0000000..c3a4bd4
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__document.html
@@ -0,0 +1,365 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pugixml: pugi::xml_document Class Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6-NO -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul></div>
+<div class="nav">
+<a class="el" href="namespacepugi.html">pugi</a>::<a class="el" href="classpugi_1_1xml__document.html">xml_document</a></div>
+<h1>pugi::xml_document Class Reference</h1><!-- doxytag: class="pugi::xml_document" --><!-- doxytag: inherits="pugi::xml_node" -->Inheritance diagram for pugi::xml_document:<p><center><img src="classpugi_1_1xml__document__inherit__graph.png" border="0" usemap="#pugi_1_1xml__document__inherit__map" alt="Inheritance graph"></center>
+<map name="pugi_1_1xml__document__inherit__map">
+<area href="classpugi_1_1xml__node.html" shape="rect" coords="24,7,136,34" alt="">
+</map>
+<center><font size="2">[<a href="graph_legend.html">legend</a>]</font></center>Collaboration diagram for pugi::xml_document:<p><center><img src="classpugi_1_1xml__document__coll__graph.png" border="0" usemap="#pugi_1_1xml__document__coll__map" alt="Collaboration graph"></center>
+<map name="pugi_1_1xml__document__coll__map">
+<area href="classpugi_1_1xml__node.html" shape="rect" coords="17,98,129,125" alt="">
+</map>
+<center><font size="2">[<a href="graph_legend.html">legend</a>]</font></center><a href="classpugi_1_1xml__document-members.html">List of all members.</a><hr><a name="_details"></a><h2>Detailed Description</h2>
+Document class (DOM tree root).
+<p>
+This class has noncopyable semantics (private copy ctor/assignment operator).
+<p>
+<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8db801c1d42eaa9073d14dfafda84f37"></a><!-- doxytag: member="pugi::xml_document::xml_document" ref="8db801c1d42eaa9073d14dfafda84f37" args="()" -->
+&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__document.html#8db801c1d42eaa9073d14dfafda84f37">xml_document</a> ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Default ctor, makes empty document. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="16c086e679286271b0ccd4541d1c1290"></a><!-- doxytag: member="pugi::xml_document::~xml_document" ref="16c086e679286271b0ccd4541d1c1290" args="()" -->
+&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__document.html#16c086e679286271b0ccd4541d1c1290">~xml_document</a> ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Dtor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__document.html#ea4dd8757cc94d3b262674609315afdd">load</a> (std::istream &amp;stream, unsigned int options=<a class="el" href="namespacepugi.html#d7c927d1c1752330637c3318b0d7b366">parse_default</a>)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Load document from stream. <a href="#ea4dd8757cc94d3b262674609315afdd"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__document.html#77501ece75c709bfb4e479d7cf5f92e3">load</a> (const char *contents, unsigned int options=<a class="el" href="namespacepugi.html#d7c927d1c1752330637c3318b0d7b366">parse_default</a>)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Load document from string. <a href="#77501ece75c709bfb4e479d7cf5f92e3"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__document.html#0362034d3715646568869514dbf8f419">load_file</a> (const char *name, unsigned int options=<a class="el" href="namespacepugi.html#d7c927d1c1752330637c3318b0d7b366">parse_default</a>)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Load document from file. <a href="#0362034d3715646568869514dbf8f419"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__document.html#6df96142a186efcbd14a496cd1d54c71">parse</a> (char *xmlstr, unsigned int options=<a class="el" href="namespacepugi.html#d7c927d1c1752330637c3318b0d7b366">parse_default</a>)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Parse the given XML string in-situ. <a href="#6df96142a186efcbd14a496cd1d54c71"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__document.html#2742c9acf467f0d3e2651c25bed76634">parse</a> (const <a class="el" href="structpugi_1_1transfer__ownership__tag.html">transfer_ownership_tag</a> &amp;, char *xmlstr, unsigned int options=<a class="el" href="namespacepugi.html#d7c927d1c1752330637c3318b0d7b366">parse_default</a>)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Parse the given XML string in-situ (gains ownership). <a href="#2742c9acf467f0d3e2651c25bed76634"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__document.html#716c23429fcac408ee1073353056485d">save_file</a> (const char *name, const char *indent=&quot;\t&quot;, unsigned int flags=<a class="el" href="namespacepugi.html#325f48a35abbaeacdfd8b7fc9ed1713c">format_default</a>)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Save XML to file. <a href="#716c23429fcac408ee1073353056485d"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="952fa74a00a02d64ab7600ac2c72fb4b"></a><!-- doxytag: member="pugi::xml_document::precompute_document_order" ref="952fa74a00a02d64ab7600ac2c72fb4b" args="()" -->
+void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__document.html#952fa74a00a02d64ab7600ac2c72fb4b">precompute_document_order</a> ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Compute document order for the whole tree Sometimes this makes evaluation of XPath queries faster. <br></td></tr>
+</table>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="ea4dd8757cc94d3b262674609315afdd"></a><!-- doxytag: member="pugi::xml_document::load" ref="ea4dd8757cc94d3b262674609315afdd" args="(std::istream &amp;stream, unsigned int options=parse_default)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">bool pugi::xml_document::load </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">std::istream &amp;&nbsp;</td>
+ <td class="mdname" nowrap> <em>stream</em>, </td>
+ </tr>
+ <tr>
+ <td class="md" nowrap align="right"></td>
+ <td class="md"></td>
+ <td class="md" nowrap>unsigned int&nbsp;</td>
+ <td class="mdname" nowrap> <em>options</em> = <code><a class="el" href="namespacepugi.html#d7c927d1c1752330637c3318b0d7b366">parse_default</a></code></td>
+ </tr>
+ <tr>
+ <td class="md"></td>
+ <td class="md">)&nbsp;</td>
+ <td class="md" colspan="2"></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Load document from stream.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>stream</em>&nbsp;</td><td>- stream with xml data </td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>- parsing options </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>success flag </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="77501ece75c709bfb4e479d7cf5f92e3"></a><!-- doxytag: member="pugi::xml_document::load" ref="77501ece75c709bfb4e479d7cf5f92e3" args="(const char *contents, unsigned int options=parse_default)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">bool pugi::xml_document::load </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const char *&nbsp;</td>
+ <td class="mdname" nowrap> <em>contents</em>, </td>
+ </tr>
+ <tr>
+ <td class="md" nowrap align="right"></td>
+ <td class="md"></td>
+ <td class="md" nowrap>unsigned int&nbsp;</td>
+ <td class="mdname" nowrap> <em>options</em> = <code><a class="el" href="namespacepugi.html#d7c927d1c1752330637c3318b0d7b366">parse_default</a></code></td>
+ </tr>
+ <tr>
+ <td class="md"></td>
+ <td class="md">)&nbsp;</td>
+ <td class="md" colspan="2"></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Load document from string.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>contents</em>&nbsp;</td><td>- input string </td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>- parsing options </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>success flag </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="0362034d3715646568869514dbf8f419"></a><!-- doxytag: member="pugi::xml_document::load_file" ref="0362034d3715646568869514dbf8f419" args="(const char *name, unsigned int options=parse_default)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">bool pugi::xml_document::load_file </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const char *&nbsp;</td>
+ <td class="mdname" nowrap> <em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="md" nowrap align="right"></td>
+ <td class="md"></td>
+ <td class="md" nowrap>unsigned int&nbsp;</td>
+ <td class="mdname" nowrap> <em>options</em> = <code><a class="el" href="namespacepugi.html#d7c927d1c1752330637c3318b0d7b366">parse_default</a></code></td>
+ </tr>
+ <tr>
+ <td class="md"></td>
+ <td class="md">)&nbsp;</td>
+ <td class="md" colspan="2"></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Load document from file.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>- file name </td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>- parsing options </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>success flag </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="6df96142a186efcbd14a496cd1d54c71"></a><!-- doxytag: member="pugi::xml_document::parse" ref="6df96142a186efcbd14a496cd1d54c71" args="(char *xmlstr, unsigned int options=parse_default)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">bool pugi::xml_document::parse </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">char *&nbsp;</td>
+ <td class="mdname" nowrap> <em>xmlstr</em>, </td>
+ </tr>
+ <tr>
+ <td class="md" nowrap align="right"></td>
+ <td class="md"></td>
+ <td class="md" nowrap>unsigned int&nbsp;</td>
+ <td class="mdname" nowrap> <em>options</em> = <code><a class="el" href="namespacepugi.html#d7c927d1c1752330637c3318b0d7b366">parse_default</a></code></td>
+ </tr>
+ <tr>
+ <td class="md"></td>
+ <td class="md">)&nbsp;</td>
+ <td class="md" colspan="2"></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Parse the given XML string in-situ.
+<p>
+The string is modified; you should ensure that string data will persist throughout the document's lifetime. Although, document does not gain ownership over the string, so you should free the memory occupied by it manually.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>xmlstr</em>&nbsp;</td><td>- readwrite string with xml data </td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>- parsing options </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>success flag </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="2742c9acf467f0d3e2651c25bed76634"></a><!-- doxytag: member="pugi::xml_document::parse" ref="2742c9acf467f0d3e2651c25bed76634" args="(const transfer_ownership_tag &amp;, char *xmlstr, unsigned int options=parse_default)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">bool pugi::xml_document::parse </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const <a class="el" href="structpugi_1_1transfer__ownership__tag.html">transfer_ownership_tag</a> &amp;&nbsp;</td>
+ <td class="mdname" nowrap>, </td>
+ </tr>
+ <tr>
+ <td class="md" nowrap align="right"></td>
+ <td class="md"></td>
+ <td class="md" nowrap>char *&nbsp;</td>
+ <td class="mdname" nowrap> <em>xmlstr</em>, </td>
+ </tr>
+ <tr>
+ <td class="md" nowrap align="right"></td>
+ <td class="md"></td>
+ <td class="md" nowrap>unsigned int&nbsp;</td>
+ <td class="mdname" nowrap> <em>options</em> = <code><a class="el" href="namespacepugi.html#d7c927d1c1752330637c3318b0d7b366">parse_default</a></code></td>
+ </tr>
+ <tr>
+ <td class="md"></td>
+ <td class="md">)&nbsp;</td>
+ <td class="md" colspan="2"></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Parse the given XML string in-situ (gains ownership).
+<p>
+The string is modified; document gains ownership over the string, so you don't have to worry about it's lifetime. Call example: doc.parse(transfer_ownership_tag(), string, options);<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>xmlstr</em>&nbsp;</td><td>- readwrite string with xml data </td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>options</em>&nbsp;</td><td>- parsing options </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>success flag </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="716c23429fcac408ee1073353056485d"></a><!-- doxytag: member="pugi::xml_document::save_file" ref="716c23429fcac408ee1073353056485d" args="(const char *name, const char *indent=&quot;\t&quot;, unsigned int flags=format_default)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">bool pugi::xml_document::save_file </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const char *&nbsp;</td>
+ <td class="mdname" nowrap> <em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="md" nowrap align="right"></td>
+ <td class="md"></td>
+ <td class="md" nowrap>const char *&nbsp;</td>
+ <td class="mdname" nowrap> <em>indent</em> = <code>&quot;\t&quot;</code>, </td>
+ </tr>
+ <tr>
+ <td class="md" nowrap align="right"></td>
+ <td class="md"></td>
+ <td class="md" nowrap>unsigned int&nbsp;</td>
+ <td class="mdname" nowrap> <em>flags</em> = <code><a class="el" href="namespacepugi.html#325f48a35abbaeacdfd8b7fc9ed1713c">format_default</a></code></td>
+ </tr>
+ <tr>
+ <td class="md"></td>
+ <td class="md">)&nbsp;</td>
+ <td class="md" colspan="2"></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Save XML to file.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>- file name </td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>indent</em>&nbsp;</td><td>- indentation string </td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>flags</em>&nbsp;</td><td>- formatting flags </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>success flag </dd></dl>
+ </td>
+ </tr>
+</table>
+<hr size="1"><address style="align: right;"><small>Generated on Wed Feb 21 22:19:52 2007 for pugixml by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6-NO </small></address>
+</body>
+</html>
diff --git a/docs/html/classpugi_1_1xml__document__coll__graph.map b/docs/html/classpugi_1_1xml__document__coll__graph.map
new file mode 100644
index 0000000..78dbed9
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__document__coll__graph.map
@@ -0,0 +1,2 @@
+base referer
+rect $classpugi_1_1xml__node.html 17,98 129,125
diff --git a/docs/html/classpugi_1_1xml__document__coll__graph.md5 b/docs/html/classpugi_1_1xml__document__coll__graph.md5
new file mode 100644
index 0000000..6da3440
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__document__coll__graph.md5
@@ -0,0 +1 @@
+3e4052a1037be38a0cdf2df3c750dd84 \ No newline at end of file
diff --git a/docs/html/classpugi_1_1xml__document__coll__graph.png b/docs/html/classpugi_1_1xml__document__coll__graph.png
new file mode 100644
index 0000000..ac5f77f
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__document__coll__graph.png
Binary files differ
diff --git a/docs/html/classpugi_1_1xml__document__inherit__graph.map b/docs/html/classpugi_1_1xml__document__inherit__graph.map
new file mode 100644
index 0000000..a324f1d
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__document__inherit__graph.map
@@ -0,0 +1,2 @@
+base referer
+rect $classpugi_1_1xml__node.html 24,7 136,34
diff --git a/docs/html/classpugi_1_1xml__document__inherit__graph.md5 b/docs/html/classpugi_1_1xml__document__inherit__graph.md5
new file mode 100644
index 0000000..71d9ecc
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__document__inherit__graph.md5
@@ -0,0 +1 @@
+68a77824c939d2564bd1548379a7c1e1 \ No newline at end of file
diff --git a/docs/html/classpugi_1_1xml__document__inherit__graph.png b/docs/html/classpugi_1_1xml__document__inherit__graph.png
new file mode 100644
index 0000000..8f89193
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__document__inherit__graph.png
Binary files differ
diff --git a/docs/html/classpugi_1_1xml__node-members.html b/docs/html/classpugi_1_1xml__node-members.html
new file mode 100644
index 0000000..0a4dcee
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__node-members.html
@@ -0,0 +1,95 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pugixml: Member List</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6-NO -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul></div>
+<h1>pugi::xml_node Member List</h1>This is the complete list of members for <a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>_root</b> (defined in <a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a>)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#21a123c51fa592b6f2ceb2e22411edd9">all_elements_by_name</a>(const char *name, OutputIterator it) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#90347629066ca2eedeaee4d5d4038fe7">all_elements_by_name_w</a>(const char *name, OutputIterator it) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#645c4d7283f755a7b25839667a5fd9c7">append_attribute</a>(const char *name)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#498e41f14a04014eaf5d6af3ae8f9d99">append_child</a>(xml_node_type type=node_element)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#974b051c270013d889d57cda2e8af669">attribute</a>(const char *name) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#9084f97350ffc64af1eaf7c17c57f4ba">attribute_iterator</a> typedef</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#690982cdfd2c6181e1118d8238d64a54">attribute_w</a>(const char *name) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#b62a944c00d7ed00519e83c23bed0675">attributes_begin</a>() const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#3dffd0eff455030c2075451327403beb">attributes_end</a>() const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#af4acdf745dfb4b01e3f144ed314d28a">begin</a>() const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#eecbadd7bdc18c503064f7c47efe067a">child</a>(const char *name) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#6726059659e4df0aaa9c2f9fd1053e98">child_value</a>() const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#be85f5f7160c0b314691d4a45fb61151">child_value</a>(const char *name) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#441dfaf2aa8435154674cae81e5fb77c">child_value_w</a>(const char *name) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#961024c2c8424a01a8528c96f520c05f">child_w</a>(const char *name) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>document_order</b>() const (defined in <a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a>)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#3516f879718f3ea1782a0324cb31f798">empty</a>() const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#1cfc6360de985d724812f67650892658">end</a>() const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#6b921b19dbf2c792daaf46544df44fb6">find_attribute</a>(Predicate pred) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#132ca635cc0ab99180be0ffcc156a616">find_child</a>(Predicate pred) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#f3a5796f1c99df52244f3c73f5c03d8e">find_node</a>(Predicate pred) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#aae0bdb0c69fb895f66b239720d5d2d0">first_attribute</a>() const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#da6e0ce4318d7f72f8b037e39433b298">first_child</a>() const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#4be3a6da6307a33954fbdc5f210de209">first_element_by_path</a>(const char *path, char delimiter= '/') const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>get_allocator</b>() const (defined in <a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a>)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#395ce9c52840edead28b50a7a69565ab">insert_attribute_after</a>(const char *name, const xml_attribute &amp;attr)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#36cfed4439fba1f140d89e351c2bb552">insert_attribute_before</a>(const char *name, const xml_attribute &amp;attr)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#fb2c70e3908e65b001dcd9bcf794d605">insert_child_after</a>(xml_node_type type, const xml_node &amp;node)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#a07c23d9835e8174fbe75f0c9a0c7d7b">insert_child_before</a>(xml_node_type type, const xml_node &amp;node)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#e053ea39add5a64de584f7a81212e388">iterator</a> typedef</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#3e93125923e0b195de4369d50776ecc6">last_attribute</a>() const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#b92290e7dbc9292e4ff5d6949bd02e01">last_child</a>() const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#1f0c8b4652edc55e4f46ced685ae60f4">name</a>() const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#e76de35f11d46c9987d87262e9430b77">next_sibling</a>(const char *name) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#1d0d1e460eff5305e6bf50d9f65a58bc">next_sibling</a>() const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#3154a0d481e54bbde8f01edd1901698c">next_sibling_w</a>(const char *name) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#fa8c35f7bc0254101cf4979372deb52e">operator unspecified_bool_type</a>() const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>operator!</b>() const (defined in <a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a>)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#7b5aeeff39fd31e5123ba5c23d6b8676">operator!=</a>(const xml_node &amp;r) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#8d7c1b506be1b2ee0dea7dca1f2e80d6">operator&lt;</a>(const xml_node &amp;r) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#a97cf42c013ec35eb76c5314cadb4e26">operator&lt;=</a>(const xml_node &amp;r) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#427236c4a20d1fa232bd2233f72c73be">operator==</a>(const xml_node &amp;r) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#04a82fd56f91edb82bf34cc409bdcf04">operator&gt;</a>(const xml_node &amp;r) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#08e0c3feeb7909e6234a8fe7ccb07d7c">operator&gt;=</a>(const xml_node &amp;r) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#aa4c19abe199d4eacae18f832deb4d70">parent</a>() const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#9d5ed8a5d73d252e5786f034d277d504">path</a>(char delimiter= '/') const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>precompute_document_order_impl</b>() (defined in <a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a>)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#d8b5f303fe2f9305318c2d500041f088">previous_sibling</a>(const char *name) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#919305f60b3ac08432867cbc94f6e3da">previous_sibling</a>() const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#f98f6bc32514761133fc01eec3c77a09">previous_sibling_w</a>(const char *name) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#8a0a9d086cc2e5c1f92cb79452695949">print</a>(std::ostream &amp;os, const char *indent=&quot;\t&quot;, unsigned int flags=format_default, unsigned int depth=0)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#af26856382cbd75434e7ac3ac255c2a7">remove_attribute</a>(const xml_attribute &amp;a)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#177097ca7770e8d80350d15cc96a3dd9">remove_attribute</a>(const char *name)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#f44301eb411be0e0787c49d292c93fb5">remove_child</a>(const xml_node &amp;n)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#023157bd57e3696c9f49f23944ac909f">remove_child</a>(const char *name)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#f7d6cc0124c07dbb192e779c375a7c16">root</a>() const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#6f73abaa40adb72a826095cf107e9624">select_nodes</a>(const char *query) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#041475ecea08aeab971707daefe0c3c7">select_nodes</a>(xpath_query &amp;query) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#51e5d0926657898bd555bf9560805230">select_single_node</a>(const char *query) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#30e004e4939797a84da7916ea950ec33">select_single_node</a>(xpath_query &amp;query) const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#f81bf55a3f7b9d40ee8807ac1be93a86">set_name</a>(const char *rhs)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#afa7b8f3ffa652e5e279f79e04d22d4c">set_value</a>(const char *rhs)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#41be22248598bdf1575ed8d7bdd77807">traverse</a>(xml_tree_walker &amp;walker)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#28231e644bc70075286c75175a05d849">type</a>() const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>unspecified_bool_type</b> typedef (defined in <a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a>)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#0f28b7a44f40d1ac58fdc8202e04805e">value</a>() const </td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>xml_node</b>(xml_node_struct *p) (defined in <a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a>)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td><code> [explicit, protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node.html#1db6c67c97cddd74f59d872057987432">xml_node</a>()</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>xml_node_iterator</b> (defined in <a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a>)</td><td><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a></td><td><code> [friend]</code></td></tr>
+</table><hr size="1"><address style="align: right;"><small>Generated on Wed Feb 21 22:19:51 2007 for pugixml by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6-NO </small></address>
+</body>
+</html>
diff --git a/docs/html/classpugi_1_1xml__node.html b/docs/html/classpugi_1_1xml__node.html
new file mode 100644
index 0000000..2be96f3
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__node.html
@@ -0,0 +1,2473 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pugixml: pugi::xml_node Class Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6-NO -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul></div>
+<div class="nav">
+<a class="el" href="namespacepugi.html">pugi</a>::<a class="el" href="classpugi_1_1xml__node.html">xml_node</a></div>
+<h1>pugi::xml_node Class Reference</h1><!-- doxytag: class="pugi::xml_node" -->Inheritance diagram for pugi::xml_node:<p><center><img src="classpugi_1_1xml__node__inherit__graph.png" border="0" usemap="#pugi_1_1xml__node__inherit__map" alt="Inheritance graph"></center>
+<map name="pugi_1_1xml__node__inherit__map">
+<area href="classpugi_1_1xml__document.html" shape="rect" coords="8,82,152,109" alt="">
+</map>
+<center><font size="2">[<a href="graph_legend.html">legend</a>]</font></center>Collaboration diagram for pugi::xml_node:<p><center><img src="classpugi_1_1xml__node__coll__graph.png" border="0" usemap="#pugi_1_1xml__node__coll__map" alt="Collaboration graph"></center>
+<center><font size="2">[<a href="graph_legend.html">legend</a>]</font></center><a href="classpugi_1_1xml__node-members.html">List of all members.</a><hr><a name="_details"></a><h2>Detailed Description</h2>
+A light-weight wrapper for manipulating nodes in DOM tree.
+<p>
+Note: <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> does not allocate any memory for the node it wraps; it only wraps a pointer to existing node.
+<p>
+<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">typedef <a class="el" href="classpugi_1_1xml__node__iterator.html">xml_node_iterator</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#e053ea39add5a64de584f7a81212e388">iterator</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Node iterator type (for child nodes). <a href="#e053ea39add5a64de584f7a81212e388"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">typedef <a class="el" href="classpugi_1_1xml__attribute__iterator.html">xml_attribute_iterator</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#9084f97350ffc64af1eaf7c17c57f4ba">attribute_iterator</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Node iterator type (for child nodes). <a href="#9084f97350ffc64af1eaf7c17c57f4ba"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#1db6c67c97cddd74f59d872057987432">xml_node</a> ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Default ctor. <a href="#1db6c67c97cddd74f59d872057987432"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#fa8c35f7bc0254101cf4979372deb52e">operator unspecified_bool_type</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Safe bool conversion. <a href="#fa8c35f7bc0254101cf4979372deb52e"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="00bf2b5f7eb5507384ebfe7e20dd2cbf"></a><!-- doxytag: member="pugi::xml_node::operator!" ref="00bf2b5f7eb5507384ebfe7e20dd2cbf" args="() const " -->
+bool&nbsp;</td><td class="memItemRight" valign="bottom"><b>operator!</b> () const </td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#427236c4a20d1fa232bd2233f72c73be">operator==</a> (const <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;r) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Compare wrapped pointer to the attribute to the pointer that is wrapped by <em>r</em>. <a href="#427236c4a20d1fa232bd2233f72c73be"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#7b5aeeff39fd31e5123ba5c23d6b8676">operator!=</a> (const <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;r) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Compare wrapped pointer to the attribute to the pointer that is wrapped by <em>r</em>. <a href="#7b5aeeff39fd31e5123ba5c23d6b8676"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#8d7c1b506be1b2ee0dea7dca1f2e80d6">operator&lt;</a> (const <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;r) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Compare wrapped pointer to the attribute to the pointer that is wrapped by <em>r</em>. <a href="#8d7c1b506be1b2ee0dea7dca1f2e80d6"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#04a82fd56f91edb82bf34cc409bdcf04">operator&gt;</a> (const <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;r) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Compare wrapped pointer to the attribute to the pointer that is wrapped by <em>r</em>. <a href="#04a82fd56f91edb82bf34cc409bdcf04"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#a97cf42c013ec35eb76c5314cadb4e26">operator&lt;=</a> (const <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;r) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Compare wrapped pointer to the attribute to the pointer that is wrapped by <em>r</em>. <a href="#a97cf42c013ec35eb76c5314cadb4e26"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#08e0c3feeb7909e6234a8fe7ccb07d7c">operator&gt;=</a> (const <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;r) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Compare wrapped pointer to the attribute to the pointer that is wrapped by <em>r</em>. <a href="#08e0c3feeb7909e6234a8fe7ccb07d7c"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__node__iterator.html">iterator</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#af4acdf745dfb4b01e3f144ed314d28a">begin</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Access the begin iterator for this node's collection of child nodes. <a href="#af4acdf745dfb4b01e3f144ed314d28a"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__node__iterator.html">iterator</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#1cfc6360de985d724812f67650892658">end</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Access the end iterator for this node's collection of child nodes. <a href="#1cfc6360de985d724812f67650892658"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__attribute__iterator.html">attribute_iterator</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#b62a944c00d7ed00519e83c23bed0675">attributes_begin</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Access the begin iterator for this node's collection of attributes. <a href="#b62a944c00d7ed00519e83c23bed0675"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__attribute__iterator.html">attribute_iterator</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#3dffd0eff455030c2075451327403beb">attributes_end</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Access the end iterator for this node's collection of attributes. <a href="#3dffd0eff455030c2075451327403beb"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#3516f879718f3ea1782a0324cb31f798">empty</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Check if node is empty. <a href="#3516f879718f3ea1782a0324cb31f798"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="namespacepugi.html#137e94a038e4ab0ada6477cf7f6153a9">xml_node_type</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#28231e644bc70075286c75175a05d849">type</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get node type. <a href="#28231e644bc70075286c75175a05d849"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">const char *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#1f0c8b4652edc55e4f46ced685ae60f4">name</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get node name (element name for element nodes, PI target for PI). <a href="#1f0c8b4652edc55e4f46ced685ae60f4"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">const char *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#0f28b7a44f40d1ac58fdc8202e04805e">value</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get node value (comment/PI/PCDATA/CDATA contents, depending on node type). <a href="#0f28b7a44f40d1ac58fdc8202e04805e"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#eecbadd7bdc18c503064f7c47efe067a">child</a> (const char *name) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get child with the specified name. <a href="#eecbadd7bdc18c503064f7c47efe067a"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#961024c2c8424a01a8528c96f520c05f">child_w</a> (const char *name) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get child with the name that matches specified pattern. <a href="#961024c2c8424a01a8528c96f520c05f"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#974b051c270013d889d57cda2e8af669">attribute</a> (const char *name) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get attribute with the specified name. <a href="#974b051c270013d889d57cda2e8af669"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#690982cdfd2c6181e1118d8238d64a54">attribute_w</a> (const char *name) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get attribute with the name that matches specified pattern. <a href="#690982cdfd2c6181e1118d8238d64a54"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#e76de35f11d46c9987d87262e9430b77">next_sibling</a> (const char *name) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get first of following sibling nodes with the specified name. <a href="#e76de35f11d46c9987d87262e9430b77"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#3154a0d481e54bbde8f01edd1901698c">next_sibling_w</a> (const char *name) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get first of the following sibling nodes with the name that matches specified pattern. <a href="#3154a0d481e54bbde8f01edd1901698c"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#1d0d1e460eff5305e6bf50d9f65a58bc">next_sibling</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get following sibling. <a href="#1d0d1e460eff5305e6bf50d9f65a58bc"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#d8b5f303fe2f9305318c2d500041f088">previous_sibling</a> (const char *name) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get first of preceding sibling nodes with the specified name. <a href="#d8b5f303fe2f9305318c2d500041f088"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#f98f6bc32514761133fc01eec3c77a09">previous_sibling_w</a> (const char *name) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get first of the preceding sibling nodes with the name that matches specified pattern. <a href="#f98f6bc32514761133fc01eec3c77a09"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#919305f60b3ac08432867cbc94f6e3da">previous_sibling</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get preceding sibling. <a href="#919305f60b3ac08432867cbc94f6e3da"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#aa4c19abe199d4eacae18f832deb4d70">parent</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get parent node. <a href="#aa4c19abe199d4eacae18f832deb4d70"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#f7d6cc0124c07dbb192e779c375a7c16">root</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get root of DOM tree this node belongs to. <a href="#f7d6cc0124c07dbb192e779c375a7c16"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">const char *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#6726059659e4df0aaa9c2f9fd1053e98">child_value</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get child value of current node; that is, value of the first child node of type PCDATA/CDATA. <a href="#6726059659e4df0aaa9c2f9fd1053e98"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">const char *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#be85f5f7160c0b314691d4a45fb61151">child_value</a> (const char *name) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get child value of child with specified name. <a href="#be85f5f7160c0b314691d4a45fb61151"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">const char *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#441dfaf2aa8435154674cae81e5fb77c">child_value_w</a> (const char *name) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get child value of child with name that matches the specified pattern. <a href="#441dfaf2aa8435154674cae81e5fb77c"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#f81bf55a3f7b9d40ee8807ac1be93a86">set_name</a> (const char *rhs)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Set node name to <em>rhs</em> (for PI/element nodes). <a href="#f81bf55a3f7b9d40ee8807ac1be93a86"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#afa7b8f3ffa652e5e279f79e04d22d4c">set_value</a> (const char *rhs)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Set node value to <em>rhs</em> (for PI/PCDATA/CDATA/comment nodes). <a href="#afa7b8f3ffa652e5e279f79e04d22d4c"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#645c4d7283f755a7b25839667a5fd9c7">append_attribute</a> (const char *name)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Add attribute with specified name (for element nodes). <a href="#645c4d7283f755a7b25839667a5fd9c7"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#395ce9c52840edead28b50a7a69565ab">insert_attribute_after</a> (const char *name, const <a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> &amp;attr)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Insert attribute with specified name after <em>attr</em> (for element nodes). <a href="#395ce9c52840edead28b50a7a69565ab"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#36cfed4439fba1f140d89e351c2bb552">insert_attribute_before</a> (const char *name, const <a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> &amp;attr)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Insert attribute with specified name before <em>attr</em> (for element nodes). <a href="#36cfed4439fba1f140d89e351c2bb552"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#498e41f14a04014eaf5d6af3ae8f9d99">append_child</a> (<a class="el" href="namespacepugi.html#137e94a038e4ab0ada6477cf7f6153a9">xml_node_type</a> type=node_element)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Add child node with specified type (for element nodes). <a href="#498e41f14a04014eaf5d6af3ae8f9d99"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#fb2c70e3908e65b001dcd9bcf794d605">insert_child_after</a> (<a class="el" href="namespacepugi.html#137e94a038e4ab0ada6477cf7f6153a9">xml_node_type</a> type, const <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;node)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Insert child node with specified type after <em>node</em> (for element nodes). <a href="#fb2c70e3908e65b001dcd9bcf794d605"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#a07c23d9835e8174fbe75f0c9a0c7d7b">insert_child_before</a> (<a class="el" href="namespacepugi.html#137e94a038e4ab0ada6477cf7f6153a9">xml_node_type</a> type, const <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;node)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Insert child node with specified type before <em>node</em> (for element nodes). <a href="#a07c23d9835e8174fbe75f0c9a0c7d7b"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#af26856382cbd75434e7ac3ac255c2a7">remove_attribute</a> (const <a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> &amp;a)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Remove specified attribute. <a href="#af26856382cbd75434e7ac3ac255c2a7"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#177097ca7770e8d80350d15cc96a3dd9">remove_attribute</a> (const char *name)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Remove attribute with the specified name, if any. <a href="#177097ca7770e8d80350d15cc96a3dd9"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#f44301eb411be0e0787c49d292c93fb5">remove_child</a> (const <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;n)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Remove specified child. <a href="#f44301eb411be0e0787c49d292c93fb5"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#023157bd57e3696c9f49f23944ac909f">remove_child</a> (const char *name)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Remove child with the specified name, if any. <a href="#023157bd57e3696c9f49f23944ac909f"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#aae0bdb0c69fb895f66b239720d5d2d0">first_attribute</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get first attribute. <a href="#aae0bdb0c69fb895f66b239720d5d2d0"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#3e93125923e0b195de4369d50776ecc6">last_attribute</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get last attribute. <a href="#3e93125923e0b195de4369d50776ecc6"></a><br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2">template&lt;typename OutputIterator&gt; </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#21a123c51fa592b6f2ceb2e22411edd9">all_elements_by_name</a> (const char *name, OutputIterator it) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get all elements from subtree with given name. <a href="#21a123c51fa592b6f2ceb2e22411edd9"></a><br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2">template&lt;typename OutputIterator&gt; </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#90347629066ca2eedeaee4d5d4038fe7">all_elements_by_name_w</a> (const char *name, OutputIterator it) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get all elements from subtree with name that matches given pattern. <a href="#90347629066ca2eedeaee4d5d4038fe7"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#da6e0ce4318d7f72f8b037e39433b298">first_child</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get first child. <a href="#da6e0ce4318d7f72f8b037e39433b298"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#b92290e7dbc9292e4ff5d6949bd02e01">last_child</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get last child. <a href="#b92290e7dbc9292e4ff5d6949bd02e01"></a><br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2">template&lt;typename Predicate&gt; </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a>&nbsp;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#6b921b19dbf2c792daaf46544df44fb6">find_attribute</a> (Predicate pred) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Find attribute using predicate. <a href="#6b921b19dbf2c792daaf46544df44fb6"></a><br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2">template&lt;typename Predicate&gt; </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a>&nbsp;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#132ca635cc0ab99180be0ffcc156a616">find_child</a> (Predicate pred) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Find child node using predicate. <a href="#132ca635cc0ab99180be0ffcc156a616"></a><br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2">template&lt;typename Predicate&gt; </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a>&nbsp;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#f3a5796f1c99df52244f3c73f5c03d8e">find_node</a> (Predicate pred) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Find node from subtree using predicate. <a href="#f3a5796f1c99df52244f3c73f5c03d8e"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">std::string&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#9d5ed8a5d73d252e5786f034d277d504">path</a> (char delimiter= '/') const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get the absolute node path from root as a text string. <a href="#9d5ed8a5d73d252e5786f034d277d504"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#4be3a6da6307a33954fbdc5f210de209">first_element_by_path</a> (const char *path, char delimiter= '/') const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Search for a node by path. <a href="#4be3a6da6307a33954fbdc5f210de209"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#41be22248598bdf1575ed8d7bdd77807">traverse</a> (<a class="el" href="classpugi_1_1xml__tree__walker.html">xml_tree_walker</a> &amp;walker)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Recursively traverse subtree with <a class="el" href="classpugi_1_1xml__tree__walker.html">xml_tree_walker</a>. <a href="#41be22248598bdf1575ed8d7bdd77807"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xpath__node.html">xpath_node</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#51e5d0926657898bd555bf9560805230">select_single_node</a> (const char *query) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Select single node by evaluating XPath query. <a href="#51e5d0926657898bd555bf9560805230"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xpath__node.html">xpath_node</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#30e004e4939797a84da7916ea950ec33">select_single_node</a> (<a class="el" href="classpugi_1_1xpath__query.html">xpath_query</a> &amp;query) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Select single node by evaluating XPath query. <a href="#30e004e4939797a84da7916ea950ec33"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xpath__node__set.html">xpath_node_set</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#6f73abaa40adb72a826095cf107e9624">select_nodes</a> (const char *query) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Select node set by evaluating XPath query. <a href="#6f73abaa40adb72a826095cf107e9624"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xpath__node__set.html">xpath_node_set</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#041475ecea08aeab971707daefe0c3c7">select_nodes</a> (<a class="el" href="classpugi_1_1xpath__query.html">xpath_query</a> &amp;query) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Select node set by evaluating XPath query. <a href="#041475ecea08aeab971707daefe0c3c7"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5008c4bc71bc148973d629d4033f27c4"></a><!-- doxytag: member="pugi::xml_node::document_order" ref="5008c4bc71bc148973d629d4033f27c4" args="() const " -->
+unsigned int&nbsp;</td><td class="memItemRight" valign="bottom"><b>document_order</b> () const </td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html#8a0a9d086cc2e5c1f92cb79452695949">print</a> (std::ostream &amp;os, const char *indent=&quot;\t&quot;, unsigned int flags=<a class="el" href="namespacepugi.html#325f48a35abbaeacdfd8b7fc9ed1713c">format_default</a>, unsigned int depth=0)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Print subtree to stream. <a href="#8a0a9d086cc2e5c1f92cb79452695949"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Protected Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="303b18f86fd1e917afe4f8a9c70ab545"></a><!-- doxytag: member="pugi::xml_node::unspecified_bool_type" ref="303b18f86fd1e917afe4f8a9c70ab545" args="" -->
+typedef xml_node_struct *xml_node::*&nbsp;</td><td class="memItemRight" valign="bottom"><b>unspecified_bool_type</b></td></tr>
+
+<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6897fb4e94def0ec60fda1f459bd746d"></a><!-- doxytag: member="pugi::xml_node::xml_node" ref="6897fb4e94def0ec60fda1f459bd746d" args="(xml_node_struct *p)" -->
+&nbsp;</td><td class="memItemRight" valign="bottom"><b>xml_node</b> (xml_node_struct *p)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a932bf51eb3b505df677f77fcd327063"></a><!-- doxytag: member="pugi::xml_node::precompute_document_order_impl" ref="a932bf51eb3b505df677f77fcd327063" args="()" -->
+void&nbsp;</td><td class="memItemRight" valign="bottom"><b>precompute_document_order_impl</b> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d323403e9ffe8cf7406076369a25bc4b"></a><!-- doxytag: member="pugi::xml_node::get_allocator" ref="d323403e9ffe8cf7406076369a25bc4b" args="() const " -->
+xml_allocator &amp;&nbsp;</td><td class="memItemRight" valign="bottom"><b>get_allocator</b> () const </td></tr>
+
+<tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="45a5b342de1e37a60565f7693f03cc08"></a><!-- doxytag: member="pugi::xml_node::_root" ref="45a5b342de1e37a60565f7693f03cc08" args="" -->
+xml_node_struct *&nbsp;</td><td class="memItemRight" valign="bottom"><b>_root</b></td></tr>
+
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a25e28e29a8cec4daa60cdd2d5934757"></a><!-- doxytag: member="pugi::xml_node::xml_node_iterator" ref="a25e28e29a8cec4daa60cdd2d5934757" args="" -->
+class&nbsp;</td><td class="memItemRight" valign="bottom"><b>xml_node_iterator</b></td></tr>
+
+</table>
+<hr><h2>Member Typedef Documentation</h2>
+<a class="anchor" name="e053ea39add5a64de584f7a81212e388"></a><!-- doxytag: member="pugi::xml_node::iterator" ref="e053ea39add5a64de584f7a81212e388" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">typedef <a class="el" href="classpugi_1_1xml__node__iterator.html">xml_node_iterator</a> <a class="el" href="classpugi_1_1xml__node__iterator.html">pugi::xml_node::iterator</a> </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Node iterator type (for child nodes).
+<p>
+<dl compact><dt><b>See also:</b></dt><dd><a class="el" href="classpugi_1_1xml__node__iterator.html">xml_node_iterator</a> </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="9084f97350ffc64af1eaf7c17c57f4ba"></a><!-- doxytag: member="pugi::xml_node::attribute_iterator" ref="9084f97350ffc64af1eaf7c17c57f4ba" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">typedef <a class="el" href="classpugi_1_1xml__attribute__iterator.html">xml_attribute_iterator</a> <a class="el" href="classpugi_1_1xml__attribute__iterator.html">pugi::xml_node::attribute_iterator</a> </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Node iterator type (for child nodes).
+<p>
+<dl compact><dt><b>See also:</b></dt><dd><a class="el" href="classpugi_1_1xml__attribute__iterator.html">xml_attribute_iterator</a> </dd></dl>
+ </td>
+ </tr>
+</table>
+<hr><h2>Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" name="1db6c67c97cddd74f59d872057987432"></a><!-- doxytag: member="pugi::xml_node::xml_node" ref="1db6c67c97cddd74f59d872057987432" args="()" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">pugi::xml_node::xml_node </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Default ctor.
+<p>
+Constructs an empty node. </td>
+ </tr>
+</table>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="fa8c35f7bc0254101cf4979372deb52e"></a><!-- doxytag: member="pugi::xml_node::operator unspecified_bool_type" ref="fa8c35f7bc0254101cf4979372deb52e" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">pugi::xml_node::operator unspecified_bool_type </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Safe bool conversion.
+<p>
+Allows <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> to be used in a context where boolean variable is expected, such as 'if (node)'. </td>
+ </tr>
+</table>
+<a class="anchor" name="427236c4a20d1fa232bd2233f72c73be"></a><!-- doxytag: member="pugi::xml_node::operator==" ref="427236c4a20d1fa232bd2233f72c73be" args="(const xml_node &amp;r) const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">bool pugi::xml_node::operator== </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>r</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Compare wrapped pointer to the attribute to the pointer that is wrapped by <em>r</em>.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>r</em>&nbsp;</td><td>- value to compare to </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>comparison result </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="7b5aeeff39fd31e5123ba5c23d6b8676"></a><!-- doxytag: member="pugi::xml_node::operator!=" ref="7b5aeeff39fd31e5123ba5c23d6b8676" args="(const xml_node &amp;r) const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">bool pugi::xml_node::operator!= </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>r</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Compare wrapped pointer to the attribute to the pointer that is wrapped by <em>r</em>.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>r</em>&nbsp;</td><td>- value to compare to </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>comparison result </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="8d7c1b506be1b2ee0dea7dca1f2e80d6"></a><!-- doxytag: member="pugi::xml_node::operator&lt;" ref="8d7c1b506be1b2ee0dea7dca1f2e80d6" args="(const xml_node &amp;r) const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">bool pugi::xml_node::operator&lt; </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>r</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Compare wrapped pointer to the attribute to the pointer that is wrapped by <em>r</em>.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>r</em>&nbsp;</td><td>- value to compare to </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>comparison result </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="04a82fd56f91edb82bf34cc409bdcf04"></a><!-- doxytag: member="pugi::xml_node::operator&gt;" ref="04a82fd56f91edb82bf34cc409bdcf04" args="(const xml_node &amp;r) const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">bool pugi::xml_node::operator&gt; </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>r</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Compare wrapped pointer to the attribute to the pointer that is wrapped by <em>r</em>.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>r</em>&nbsp;</td><td>- value to compare to </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>comparison result </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="a97cf42c013ec35eb76c5314cadb4e26"></a><!-- doxytag: member="pugi::xml_node::operator&lt;=" ref="a97cf42c013ec35eb76c5314cadb4e26" args="(const xml_node &amp;r) const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">bool pugi::xml_node::operator&lt;= </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>r</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Compare wrapped pointer to the attribute to the pointer that is wrapped by <em>r</em>.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>r</em>&nbsp;</td><td>- value to compare to </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>comparison result </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="08e0c3feeb7909e6234a8fe7ccb07d7c"></a><!-- doxytag: member="pugi::xml_node::operator&gt;=" ref="08e0c3feeb7909e6234a8fe7ccb07d7c" args="(const xml_node &amp;r) const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">bool pugi::xml_node::operator&gt;= </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>r</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Compare wrapped pointer to the attribute to the pointer that is wrapped by <em>r</em>.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>r</em>&nbsp;</td><td>- value to compare to </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>comparison result </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="af4acdf745dfb4b01e3f144ed314d28a"></a><!-- doxytag: member="pugi::xml_node::begin" ref="af4acdf745dfb4b01e3f144ed314d28a" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__node__iterator.html">iterator</a> pugi::xml_node::begin </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Access the begin iterator for this node's collection of child nodes.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>iterator that points to the first child node, or past-the-end iterator if node is empty or has no children </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="1cfc6360de985d724812f67650892658"></a><!-- doxytag: member="pugi::xml_node::end" ref="1cfc6360de985d724812f67650892658" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__node__iterator.html">iterator</a> pugi::xml_node::end </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Access the end iterator for this node's collection of child nodes.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>past-the-end iterator for child list </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="b62a944c00d7ed00519e83c23bed0675"></a><!-- doxytag: member="pugi::xml_node::attributes_begin" ref="b62a944c00d7ed00519e83c23bed0675" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__attribute__iterator.html">attribute_iterator</a> pugi::xml_node::attributes_begin </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Access the begin iterator for this node's collection of attributes.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>iterator that points to the first attribute, or past-the-end iterator if node is empty or has no attributes </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="3dffd0eff455030c2075451327403beb"></a><!-- doxytag: member="pugi::xml_node::attributes_end" ref="3dffd0eff455030c2075451327403beb" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__attribute__iterator.html">attribute_iterator</a> pugi::xml_node::attributes_end </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Access the end iterator for this node's collection of attributes.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>past-the-end iterator for attribute list </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="3516f879718f3ea1782a0324cb31f798"></a><!-- doxytag: member="pugi::xml_node::empty" ref="3516f879718f3ea1782a0324cb31f798" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">bool pugi::xml_node::empty </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Check if node is empty.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>true if node is empty, false otherwise </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="28231e644bc70075286c75175a05d849"></a><!-- doxytag: member="pugi::xml_node::type" ref="28231e644bc70075286c75175a05d849" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="namespacepugi.html#137e94a038e4ab0ada6477cf7f6153a9">xml_node_type</a> pugi::xml_node::type </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Get node type.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>node type; node_null for empty nodes </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="1f0c8b4652edc55e4f46ced685ae60f4"></a><!-- doxytag: member="pugi::xml_node::name" ref="1f0c8b4652edc55e4f46ced685ae60f4" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">const char* pugi::xml_node::name </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Get node name (element name for element nodes, PI target for PI).
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>node name, if any; "" otherwise </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="0f28b7a44f40d1ac58fdc8202e04805e"></a><!-- doxytag: member="pugi::xml_node::value" ref="0f28b7a44f40d1ac58fdc8202e04805e" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">const char* pugi::xml_node::value </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Get node value (comment/PI/PCDATA/CDATA contents, depending on node type).
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>node value, if any; "" otherwise </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="eecbadd7bdc18c503064f7c47efe067a"></a><!-- doxytag: member="pugi::xml_node::child" ref="eecbadd7bdc18c503064f7c47efe067a" args="(const char *name) const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a> pugi::xml_node::child </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const char *&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>name</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Get child with the specified name.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>- child name </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>child with the specified name, if any; empty node otherwise </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="961024c2c8424a01a8528c96f520c05f"></a><!-- doxytag: member="pugi::xml_node::child_w" ref="961024c2c8424a01a8528c96f520c05f" args="(const char *name) const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a> pugi::xml_node::child_w </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const char *&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>name</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Get child with the name that matches specified pattern.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>- child name pattern </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>child with the name that matches pattern, if any; empty node otherwise </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="974b051c270013d889d57cda2e8af669"></a><!-- doxytag: member="pugi::xml_node::attribute" ref="974b051c270013d889d57cda2e8af669" args="(const char *name) const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> pugi::xml_node::attribute </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const char *&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>name</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Get attribute with the specified name.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>- attribute name </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>attribute with the specified name, if any; empty attribute otherwise </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="690982cdfd2c6181e1118d8238d64a54"></a><!-- doxytag: member="pugi::xml_node::attribute_w" ref="690982cdfd2c6181e1118d8238d64a54" args="(const char *name) const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> pugi::xml_node::attribute_w </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const char *&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>name</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Get attribute with the name that matches specified pattern.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>- attribute name pattern </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>attribute with the name that matches pattern, if any; empty attribute otherwise </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="e76de35f11d46c9987d87262e9430b77"></a><!-- doxytag: member="pugi::xml_node::next_sibling" ref="e76de35f11d46c9987d87262e9430b77" args="(const char *name) const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a> pugi::xml_node::next_sibling </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const char *&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>name</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Get first of following sibling nodes with the specified name.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>- sibling name </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>node with the specified name, if any; empty node otherwise </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="3154a0d481e54bbde8f01edd1901698c"></a><!-- doxytag: member="pugi::xml_node::next_sibling_w" ref="3154a0d481e54bbde8f01edd1901698c" args="(const char *name) const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a> pugi::xml_node::next_sibling_w </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const char *&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>name</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Get first of the following sibling nodes with the name that matches specified pattern.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>- sibling name pattern </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>node with the name that matches pattern, if any; empty node otherwise </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="1d0d1e460eff5305e6bf50d9f65a58bc"></a><!-- doxytag: member="pugi::xml_node::next_sibling" ref="1d0d1e460eff5305e6bf50d9f65a58bc" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a> pugi::xml_node::next_sibling </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Get following sibling.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>following sibling node, if any; empty node otherwise </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="d8b5f303fe2f9305318c2d500041f088"></a><!-- doxytag: member="pugi::xml_node::previous_sibling" ref="d8b5f303fe2f9305318c2d500041f088" args="(const char *name) const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a> pugi::xml_node::previous_sibling </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const char *&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>name</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Get first of preceding sibling nodes with the specified name.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>- sibling name </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>node with the specified name, if any; empty node otherwise </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="f98f6bc32514761133fc01eec3c77a09"></a><!-- doxytag: member="pugi::xml_node::previous_sibling_w" ref="f98f6bc32514761133fc01eec3c77a09" args="(const char *name) const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a> pugi::xml_node::previous_sibling_w </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const char *&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>name</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Get first of the preceding sibling nodes with the name that matches specified pattern.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>- sibling name pattern </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>node with the name that matches pattern, if any; empty node otherwise </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="919305f60b3ac08432867cbc94f6e3da"></a><!-- doxytag: member="pugi::xml_node::previous_sibling" ref="919305f60b3ac08432867cbc94f6e3da" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a> pugi::xml_node::previous_sibling </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Get preceding sibling.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>preceding sibling node, if any; empty node otherwise </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="aa4c19abe199d4eacae18f832deb4d70"></a><!-- doxytag: member="pugi::xml_node::parent" ref="aa4c19abe199d4eacae18f832deb4d70" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a> pugi::xml_node::parent </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Get parent node.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>parent node if any; empty node otherwise </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="f7d6cc0124c07dbb192e779c375a7c16"></a><!-- doxytag: member="pugi::xml_node::root" ref="f7d6cc0124c07dbb192e779c375a7c16" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a> pugi::xml_node::root </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Get root of DOM tree this node belongs to.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>tree root </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="6726059659e4df0aaa9c2f9fd1053e98"></a><!-- doxytag: member="pugi::xml_node::child_value" ref="6726059659e4df0aaa9c2f9fd1053e98" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">const char* pugi::xml_node::child_value </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Get child value of current node; that is, value of the first child node of type PCDATA/CDATA.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>child value of current node, if any; "" otherwise </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="be85f5f7160c0b314691d4a45fb61151"></a><!-- doxytag: member="pugi::xml_node::child_value" ref="be85f5f7160c0b314691d4a45fb61151" args="(const char *name) const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">const char* pugi::xml_node::child_value </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const char *&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>name</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Get child value of child with specified name.
+<p>
+<dl compact><dt><b>See also:</b></dt><dd><a class="el" href="classpugi_1_1xml__node.html#6726059659e4df0aaa9c2f9fd1053e98">child_value</a> node.child_value(name) is equivalent to node.child(name).<a class="el" href="classpugi_1_1xml__node.html#6726059659e4df0aaa9c2f9fd1053e98">child_value()</a></dd></dl>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>- child name </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>child value of specified child node, if any; "" otherwise </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="441dfaf2aa8435154674cae81e5fb77c"></a><!-- doxytag: member="pugi::xml_node::child_value_w" ref="441dfaf2aa8435154674cae81e5fb77c" args="(const char *name) const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">const char* pugi::xml_node::child_value_w </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const char *&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>name</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Get child value of child with name that matches the specified pattern.
+<p>
+<dl compact><dt><b>See also:</b></dt><dd><a class="el" href="classpugi_1_1xml__node.html#6726059659e4df0aaa9c2f9fd1053e98">child_value</a> node.child_value_w(name) is equivalent to node.child_w(name).<a class="el" href="classpugi_1_1xml__node.html#6726059659e4df0aaa9c2f9fd1053e98">child_value()</a></dd></dl>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>- child name pattern </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>child value of specified child node, if any; "" otherwise </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="f81bf55a3f7b9d40ee8807ac1be93a86"></a><!-- doxytag: member="pugi::xml_node::set_name" ref="f81bf55a3f7b9d40ee8807ac1be93a86" args="(const char *rhs)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">bool pugi::xml_node::set_name </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const char *&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>rhs</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Set node name to <em>rhs</em> (for PI/element nodes).
+<p>
+<dl compact><dt><b>See also:</b></dt><dd><a class="el" href="classpugi_1_1xml__node.html#1f0c8b4652edc55e4f46ced685ae60f4">name</a></dd></dl>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>rhs</em>&nbsp;</td><td>- new node name </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>success flag (call fails if node is of the wrong type or there is not enough memory) </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="afa7b8f3ffa652e5e279f79e04d22d4c"></a><!-- doxytag: member="pugi::xml_node::set_value" ref="afa7b8f3ffa652e5e279f79e04d22d4c" args="(const char *rhs)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">bool pugi::xml_node::set_value </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const char *&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>rhs</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Set node value to <em>rhs</em> (for PI/PCDATA/CDATA/comment nodes).
+<p>
+<dl compact><dt><b>See also:</b></dt><dd><a class="el" href="classpugi_1_1xml__node.html#0f28b7a44f40d1ac58fdc8202e04805e">value</a></dd></dl>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>rhs</em>&nbsp;</td><td>- new node value </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>success flag (call fails if node is of the wrong type or there is not enough memory) </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="645c4d7283f755a7b25839667a5fd9c7"></a><!-- doxytag: member="pugi::xml_node::append_attribute" ref="645c4d7283f755a7b25839667a5fd9c7" args="(const char *name)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> pugi::xml_node::append_attribute </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const char *&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>name</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Add attribute with specified name (for element nodes).
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>- attribute name </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>added attribute, or empty attribute if there was an error (wrong node type) </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="395ce9c52840edead28b50a7a69565ab"></a><!-- doxytag: member="pugi::xml_node::insert_attribute_after" ref="395ce9c52840edead28b50a7a69565ab" args="(const char *name, const xml_attribute &amp;attr)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> pugi::xml_node::insert_attribute_after </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const char *&nbsp;</td>
+ <td class="mdname" nowrap> <em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="md" nowrap align="right"></td>
+ <td class="md"></td>
+ <td class="md" nowrap>const <a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> &amp;&nbsp;</td>
+ <td class="mdname" nowrap> <em>attr</em></td>
+ </tr>
+ <tr>
+ <td class="md"></td>
+ <td class="md">)&nbsp;</td>
+ <td class="md" colspan="2"></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Insert attribute with specified name after <em>attr</em> (for element nodes).
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>- attribute name </td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>attr</em>&nbsp;</td><td>- attribute to insert a new one after </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>inserted attribute, or empty attribute if there was an error (wrong node type, or attr does not belong to node) </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="36cfed4439fba1f140d89e351c2bb552"></a><!-- doxytag: member="pugi::xml_node::insert_attribute_before" ref="36cfed4439fba1f140d89e351c2bb552" args="(const char *name, const xml_attribute &amp;attr)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> pugi::xml_node::insert_attribute_before </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const char *&nbsp;</td>
+ <td class="mdname" nowrap> <em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="md" nowrap align="right"></td>
+ <td class="md"></td>
+ <td class="md" nowrap>const <a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> &amp;&nbsp;</td>
+ <td class="mdname" nowrap> <em>attr</em></td>
+ </tr>
+ <tr>
+ <td class="md"></td>
+ <td class="md">)&nbsp;</td>
+ <td class="md" colspan="2"></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Insert attribute with specified name before <em>attr</em> (for element nodes).
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>- attribute name </td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>attr</em>&nbsp;</td><td>- attribute to insert a new one before </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>inserted attribute, or empty attribute if there was an error (wrong node type, or attr does not belong to node) </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="498e41f14a04014eaf5d6af3ae8f9d99"></a><!-- doxytag: member="pugi::xml_node::append_child" ref="498e41f14a04014eaf5d6af3ae8f9d99" args="(xml_node_type type=node_element)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a> pugi::xml_node::append_child </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top"><a class="el" href="namespacepugi.html#137e94a038e4ab0ada6477cf7f6153a9">xml_node_type</a>&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>type</em> = <code>node_element</code> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Add child node with specified type (for element nodes).
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>type</em>&nbsp;</td><td>- node type </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>added node, or empty node if there was an error (wrong node type) </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="fb2c70e3908e65b001dcd9bcf794d605"></a><!-- doxytag: member="pugi::xml_node::insert_child_after" ref="fb2c70e3908e65b001dcd9bcf794d605" args="(xml_node_type type, const xml_node &amp;node)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a> pugi::xml_node::insert_child_after </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top"><a class="el" href="namespacepugi.html#137e94a038e4ab0ada6477cf7f6153a9">xml_node_type</a>&nbsp;</td>
+ <td class="mdname" nowrap> <em>type</em>, </td>
+ </tr>
+ <tr>
+ <td class="md" nowrap align="right"></td>
+ <td class="md"></td>
+ <td class="md" nowrap>const <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;&nbsp;</td>
+ <td class="mdname" nowrap> <em>node</em></td>
+ </tr>
+ <tr>
+ <td class="md"></td>
+ <td class="md">)&nbsp;</td>
+ <td class="md" colspan="2"></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Insert child node with specified type after <em>node</em> (for element nodes).
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>type</em>&nbsp;</td><td>- node type </td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>node</em>&nbsp;</td><td>- node to insert a new one after </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>inserted node, or empty node if there was an error (wrong node type, or <em>node</em> is not a child of this node) </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="a07c23d9835e8174fbe75f0c9a0c7d7b"></a><!-- doxytag: member="pugi::xml_node::insert_child_before" ref="a07c23d9835e8174fbe75f0c9a0c7d7b" args="(xml_node_type type, const xml_node &amp;node)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a> pugi::xml_node::insert_child_before </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top"><a class="el" href="namespacepugi.html#137e94a038e4ab0ada6477cf7f6153a9">xml_node_type</a>&nbsp;</td>
+ <td class="mdname" nowrap> <em>type</em>, </td>
+ </tr>
+ <tr>
+ <td class="md" nowrap align="right"></td>
+ <td class="md"></td>
+ <td class="md" nowrap>const <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;&nbsp;</td>
+ <td class="mdname" nowrap> <em>node</em></td>
+ </tr>
+ <tr>
+ <td class="md"></td>
+ <td class="md">)&nbsp;</td>
+ <td class="md" colspan="2"></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Insert child node with specified type before <em>node</em> (for element nodes).
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>type</em>&nbsp;</td><td>- node type </td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>node</em>&nbsp;</td><td>- node to insert a new one before </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>inserted node, or empty node if there was an error (wrong node type, or <em>node</em> is not a child of this node) </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="af26856382cbd75434e7ac3ac255c2a7"></a><!-- doxytag: member="pugi::xml_node::remove_attribute" ref="af26856382cbd75434e7ac3ac255c2a7" args="(const xml_attribute &amp;a)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">void pugi::xml_node::remove_attribute </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const <a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> &amp;&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>a</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Remove specified attribute.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>a</em>&nbsp;</td><td>- attribute to be removed </td></tr>
+ </table>
+</dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="177097ca7770e8d80350d15cc96a3dd9"></a><!-- doxytag: member="pugi::xml_node::remove_attribute" ref="177097ca7770e8d80350d15cc96a3dd9" args="(const char *name)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">void pugi::xml_node::remove_attribute </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const char *&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>name</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Remove attribute with the specified name, if any.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>- attribute name </td></tr>
+ </table>
+</dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="f44301eb411be0e0787c49d292c93fb5"></a><!-- doxytag: member="pugi::xml_node::remove_child" ref="f44301eb411be0e0787c49d292c93fb5" args="(const xml_node &amp;n)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">void pugi::xml_node::remove_child </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>n</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Remove specified child.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>n</em>&nbsp;</td><td>- child node to be removed </td></tr>
+ </table>
+</dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="023157bd57e3696c9f49f23944ac909f"></a><!-- doxytag: member="pugi::xml_node::remove_child" ref="023157bd57e3696c9f49f23944ac909f" args="(const char *name)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">void pugi::xml_node::remove_child </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const char *&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>name</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Remove child with the specified name, if any.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>- child name </td></tr>
+ </table>
+</dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="aae0bdb0c69fb895f66b239720d5d2d0"></a><!-- doxytag: member="pugi::xml_node::first_attribute" ref="aae0bdb0c69fb895f66b239720d5d2d0" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> pugi::xml_node::first_attribute </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Get first attribute.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>first attribute, if any; empty attribute otherwise </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="3e93125923e0b195de4369d50776ecc6"></a><!-- doxytag: member="pugi::xml_node::last_attribute" ref="3e93125923e0b195de4369d50776ecc6" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> pugi::xml_node::last_attribute </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Get last attribute.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>last attribute, if any; empty attribute otherwise </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="21a123c51fa592b6f2ceb2e22411edd9"></a><!-- doxytag: member="pugi::xml_node::all_elements_by_name" ref="21a123c51fa592b6f2ceb2e22411edd9" args="(const char *name, OutputIterator it) const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="mdPrefix" colspan="4">
+template&lt;typename OutputIterator&gt; </td>
+ </tr>
+ <tr>
+ <td class="md" nowrap valign="top">void pugi::xml_node::all_elements_by_name </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const char *&nbsp;</td>
+ <td class="mdname" nowrap> <em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="md" nowrap align="right"></td>
+ <td class="md"></td>
+ <td class="md" nowrap>OutputIterator&nbsp;</td>
+ <td class="mdname" nowrap> <em>it</em></td>
+ </tr>
+ <tr>
+ <td class="md"></td>
+ <td class="md">)&nbsp;</td>
+ <td class="md" colspan="2"> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Get all elements from subtree with given name.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>- node name </td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>it</em>&nbsp;</td><td>- output iterator (for example, std::back_insert_iterator (result of std::back_inserter)) </td></tr>
+ </table>
+</dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="90347629066ca2eedeaee4d5d4038fe7"></a><!-- doxytag: member="pugi::xml_node::all_elements_by_name_w" ref="90347629066ca2eedeaee4d5d4038fe7" args="(const char *name, OutputIterator it) const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="mdPrefix" colspan="4">
+template&lt;typename OutputIterator&gt; </td>
+ </tr>
+ <tr>
+ <td class="md" nowrap valign="top">void pugi::xml_node::all_elements_by_name_w </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const char *&nbsp;</td>
+ <td class="mdname" nowrap> <em>name</em>, </td>
+ </tr>
+ <tr>
+ <td class="md" nowrap align="right"></td>
+ <td class="md"></td>
+ <td class="md" nowrap>OutputIterator&nbsp;</td>
+ <td class="mdname" nowrap> <em>it</em></td>
+ </tr>
+ <tr>
+ <td class="md"></td>
+ <td class="md">)&nbsp;</td>
+ <td class="md" colspan="2"> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Get all elements from subtree with name that matches given pattern.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>- node name pattern </td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>it</em>&nbsp;</td><td>- output iterator (for example, std::back_insert_iterator (result of std::back_inserter)) </td></tr>
+ </table>
+</dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="da6e0ce4318d7f72f8b037e39433b298"></a><!-- doxytag: member="pugi::xml_node::first_child" ref="da6e0ce4318d7f72f8b037e39433b298" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a> pugi::xml_node::first_child </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Get first child.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>first child, if any; empty node otherwise </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="b92290e7dbc9292e4ff5d6949bd02e01"></a><!-- doxytag: member="pugi::xml_node::last_child" ref="b92290e7dbc9292e4ff5d6949bd02e01" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a> pugi::xml_node::last_child </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Get last child.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>last child, if any; empty node otherwise </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="6b921b19dbf2c792daaf46544df44fb6"></a><!-- doxytag: member="pugi::xml_node::find_attribute" ref="6b921b19dbf2c792daaf46544df44fb6" args="(Predicate pred) const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="mdPrefix" colspan="4">
+template&lt;typename Predicate&gt; </td>
+ </tr>
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> pugi::xml_node::find_attribute </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">Predicate&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>pred</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const<code> [inline]</code></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Find attribute using predicate.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>pred</em>&nbsp;</td><td>- predicate, that takes <a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> and returns bool </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>first attribute for which predicate returned true, or empty attribute </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="132ca635cc0ab99180be0ffcc156a616"></a><!-- doxytag: member="pugi::xml_node::find_child" ref="132ca635cc0ab99180be0ffcc156a616" args="(Predicate pred) const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="mdPrefix" colspan="4">
+template&lt;typename Predicate&gt; </td>
+ </tr>
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a> pugi::xml_node::find_child </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">Predicate&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>pred</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const<code> [inline]</code></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Find child node using predicate.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>pred</em>&nbsp;</td><td>- predicate, that takes <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> and returns bool </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>first child node for which predicate returned true, or empty node </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="f3a5796f1c99df52244f3c73f5c03d8e"></a><!-- doxytag: member="pugi::xml_node::find_node" ref="f3a5796f1c99df52244f3c73f5c03d8e" args="(Predicate pred) const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="mdPrefix" colspan="4">
+template&lt;typename Predicate&gt; </td>
+ </tr>
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a> pugi::xml_node::find_node </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">Predicate&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>pred</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const<code> [inline]</code></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Find node from subtree using predicate.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>pred</em>&nbsp;</td><td>- predicate, that takes <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> and returns bool </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>first node from subtree for which predicate returned true, or empty node </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="9d5ed8a5d73d252e5786f034d277d504"></a><!-- doxytag: member="pugi::xml_node::path" ref="9d5ed8a5d73d252e5786f034d277d504" args="(char delimiter= '/') const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">std::string pugi::xml_node::path </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">char&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>delimiter</em> = <code>'/'</code> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Get the absolute node path from root as a text string.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>delimiter</em>&nbsp;</td><td>- delimiter character to insert between element names </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>path string (e.g. '/bookstore/book/author'). </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="4be3a6da6307a33954fbdc5f210de209"></a><!-- doxytag: member="pugi::xml_node::first_element_by_path" ref="4be3a6da6307a33954fbdc5f210de209" args="(const char *path, char delimiter= '/') const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a> pugi::xml_node::first_element_by_path </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const char *&nbsp;</td>
+ <td class="mdname" nowrap> <em>path</em>, </td>
+ </tr>
+ <tr>
+ <td class="md" nowrap align="right"></td>
+ <td class="md"></td>
+ <td class="md" nowrap>char&nbsp;</td>
+ <td class="mdname" nowrap> <em>delimiter</em> = <code>'/'</code></td>
+ </tr>
+ <tr>
+ <td class="md"></td>
+ <td class="md">)&nbsp;</td>
+ <td class="md" colspan="2"> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Search for a node by path.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>path</em>&nbsp;</td><td>- path string; e.g. './foo/bar' (relative to node), '/foo/bar' (relative to root), '../foo/bar'. </td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>delimiter</em>&nbsp;</td><td>- delimiter character to use while tokenizing path </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>matching node, if any; empty node otherwise </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="41be22248598bdf1575ed8d7bdd77807"></a><!-- doxytag: member="pugi::xml_node::traverse" ref="41be22248598bdf1575ed8d7bdd77807" args="(xml_tree_walker &amp;walker)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">bool pugi::xml_node::traverse </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__tree__walker.html">xml_tree_walker</a> &amp;&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>walker</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Recursively traverse subtree with <a class="el" href="classpugi_1_1xml__tree__walker.html">xml_tree_walker</a>.
+<p>
+<dl compact><dt><b>See also:</b></dt><dd><a class="el" href="classpugi_1_1xml__tree__walker.html#118c8c5a323745053ae52dc0e1276a9b">xml_tree_walker::begin</a> <p>
+<a class="el" href="classpugi_1_1xml__tree__walker.html#caf3a12a8cfdd55ef421ad045dfef764">xml_tree_walker::for_each</a> <p>
+<a class="el" href="classpugi_1_1xml__tree__walker.html#19c4f587afbd022959d81c6bf129a8fd">xml_tree_walker::end</a></dd></dl>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>walker</em>&nbsp;</td><td>- tree walker to traverse subtree with </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>traversal result </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="51e5d0926657898bd555bf9560805230"></a><!-- doxytag: member="pugi::xml_node::select_single_node" ref="51e5d0926657898bd555bf9560805230" args="(const char *query) const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xpath__node.html">xpath_node</a> pugi::xml_node::select_single_node </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const char *&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>query</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Select single node by evaluating XPath query.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>query</em>&nbsp;</td><td>- query string </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>first node from the resulting node set by document order, or empty node if none found </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="30e004e4939797a84da7916ea950ec33"></a><!-- doxytag: member="pugi::xml_node::select_single_node" ref="30e004e4939797a84da7916ea950ec33" args="(xpath_query &amp;query) const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xpath__node.html">xpath_node</a> pugi::xml_node::select_single_node </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xpath__query.html">xpath_query</a> &amp;&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>query</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Select single node by evaluating XPath query.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>query</em>&nbsp;</td><td>- compiled query </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>first node from the resulting node set by document order, or empty node if none found </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="6f73abaa40adb72a826095cf107e9624"></a><!-- doxytag: member="pugi::xml_node::select_nodes" ref="6f73abaa40adb72a826095cf107e9624" args="(const char *query) const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xpath__node__set.html">xpath_node_set</a> pugi::xml_node::select_nodes </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const char *&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>query</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Select node set by evaluating XPath query.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>query</em>&nbsp;</td><td>- query string </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>resulting node set </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="041475ecea08aeab971707daefe0c3c7"></a><!-- doxytag: member="pugi::xml_node::select_nodes" ref="041475ecea08aeab971707daefe0c3c7" args="(xpath_query &amp;query) const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xpath__node__set.html">xpath_node_set</a> pugi::xml_node::select_nodes </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xpath__query.html">xpath_query</a> &amp;&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>query</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Select node set by evaluating XPath query.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>query</em>&nbsp;</td><td>- compiled query </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>resulting node set </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="8a0a9d086cc2e5c1f92cb79452695949"></a><!-- doxytag: member="pugi::xml_node::print" ref="8a0a9d086cc2e5c1f92cb79452695949" args="(std::ostream &amp;os, const char *indent=&quot;\t&quot;, unsigned int flags=format_default, unsigned int depth=0)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">void pugi::xml_node::print </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">std::ostream &amp;&nbsp;</td>
+ <td class="mdname" nowrap> <em>os</em>, </td>
+ </tr>
+ <tr>
+ <td class="md" nowrap align="right"></td>
+ <td class="md"></td>
+ <td class="md" nowrap>const char *&nbsp;</td>
+ <td class="mdname" nowrap> <em>indent</em> = <code>&quot;\t&quot;</code>, </td>
+ </tr>
+ <tr>
+ <td class="md" nowrap align="right"></td>
+ <td class="md"></td>
+ <td class="md" nowrap>unsigned int&nbsp;</td>
+ <td class="mdname" nowrap> <em>flags</em> = <code><a class="el" href="namespacepugi.html#325f48a35abbaeacdfd8b7fc9ed1713c">format_default</a></code>, </td>
+ </tr>
+ <tr>
+ <td class="md" nowrap align="right"></td>
+ <td class="md"></td>
+ <td class="md" nowrap>unsigned int&nbsp;</td>
+ <td class="mdname" nowrap> <em>depth</em> = <code>0</code></td>
+ </tr>
+ <tr>
+ <td class="md"></td>
+ <td class="md">)&nbsp;</td>
+ <td class="md" colspan="2"></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Print subtree to stream.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>os</em>&nbsp;</td><td>- output stream </td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>indent</em>&nbsp;</td><td>- indentation string </td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>flags</em>&nbsp;</td><td>- formatting flags </td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>depth</em>&nbsp;</td><td>- starting depth (used for indentation) </td></tr>
+ </table>
+</dl>
+ </td>
+ </tr>
+</table>
+<hr size="1"><address style="align: right;"><small>Generated on Wed Feb 21 22:19:51 2007 for pugixml by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6-NO </small></address>
+</body>
+</html>
diff --git a/docs/html/classpugi_1_1xml__node__coll__graph.map b/docs/html/classpugi_1_1xml__node__coll__graph.map
new file mode 100644
index 0000000..5a14779
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__node__coll__graph.map
@@ -0,0 +1 @@
+base referer
diff --git a/docs/html/classpugi_1_1xml__node__coll__graph.md5 b/docs/html/classpugi_1_1xml__node__coll__graph.md5
new file mode 100644
index 0000000..2572420
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__node__coll__graph.md5
@@ -0,0 +1 @@
+8b5be5e31df5c5adb3a803e79757f0d2 \ No newline at end of file
diff --git a/docs/html/classpugi_1_1xml__node__coll__graph.png b/docs/html/classpugi_1_1xml__node__coll__graph.png
new file mode 100644
index 0000000..db6620e
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__node__coll__graph.png
Binary files differ
diff --git a/docs/html/classpugi_1_1xml__node__inherit__graph.map b/docs/html/classpugi_1_1xml__node__inherit__graph.map
new file mode 100644
index 0000000..e1b3a3b
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__node__inherit__graph.map
@@ -0,0 +1,2 @@
+base referer
+rect $classpugi_1_1xml__document.html 8,82 152,109
diff --git a/docs/html/classpugi_1_1xml__node__inherit__graph.md5 b/docs/html/classpugi_1_1xml__node__inherit__graph.md5
new file mode 100644
index 0000000..a6ac927
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__node__inherit__graph.md5
@@ -0,0 +1 @@
+feb1f5b174d36f4f52a15fdc9a9e8309 \ No newline at end of file
diff --git a/docs/html/classpugi_1_1xml__node__inherit__graph.png b/docs/html/classpugi_1_1xml__node__inherit__graph.png
new file mode 100644
index 0000000..d889c51
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__node__inherit__graph.png
Binary files differ
diff --git a/docs/html/classpugi_1_1xml__node__iterator-members.html b/docs/html/classpugi_1_1xml__node__iterator-members.html
new file mode 100644
index 0000000..0910691
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__node__iterator-members.html
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pugixml: Member List</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6-NO -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul></div>
+<h1>pugi::xml_node_iterator Member List</h1>This is the complete list of members for <a class="el" href="classpugi_1_1xml__node__iterator.html">pugi::xml_node_iterator</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node__iterator.html#eb7903145d612c84bae22e0aa103608f">operator *</a>()</td><td><a class="el" href="classpugi_1_1xml__node__iterator.html">pugi::xml_node_iterator</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node__iterator.html#5905460cbc3433ff7edfa20ce02c11da">operator!=</a>(const xml_node_iterator &amp;rhs) const </td><td><a class="el" href="classpugi_1_1xml__node__iterator.html">pugi::xml_node_iterator</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node__iterator.html#fee390ff69626800c65ed64b32323a27">operator++</a>()</td><td><a class="el" href="classpugi_1_1xml__node__iterator.html">pugi::xml_node_iterator</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node__iterator.html#da8f21676a3ac62b0dc98293b2baa257">operator++</a>(int)</td><td><a class="el" href="classpugi_1_1xml__node__iterator.html">pugi::xml_node_iterator</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node__iterator.html#658e6c5b704045c58dfcea161fe640e9">operator--</a>()</td><td><a class="el" href="classpugi_1_1xml__node__iterator.html">pugi::xml_node_iterator</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node__iterator.html#88f5f1a39e84b6fcb1574eb5366092ba">operator--</a>(int)</td><td><a class="el" href="classpugi_1_1xml__node__iterator.html">pugi::xml_node_iterator</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node__iterator.html#7589cb0bc9ecf04b4553049ccd442fc6">operator-&gt;</a>()</td><td><a class="el" href="classpugi_1_1xml__node__iterator.html">pugi::xml_node_iterator</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node__iterator.html#d879ac5ca8ec10d5d9a6e24f978ffde1">operator==</a>(const xml_node_iterator &amp;rhs) const </td><td><a class="el" href="classpugi_1_1xml__node__iterator.html">pugi::xml_node_iterator</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>xml_node</b> (defined in <a class="el" href="classpugi_1_1xml__node__iterator.html">pugi::xml_node_iterator</a>)</td><td><a class="el" href="classpugi_1_1xml__node__iterator.html">pugi::xml_node_iterator</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node__iterator.html#09538d658aef0ba20cbe050dff1c3a81">xml_node_iterator</a>()</td><td><a class="el" href="classpugi_1_1xml__node__iterator.html">pugi::xml_node_iterator</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node__iterator.html#874c832b41aaaff159ef2c36cdcb705c">xml_node_iterator</a>(const xml_node &amp;node)</td><td><a class="el" href="classpugi_1_1xml__node__iterator.html">pugi::xml_node_iterator</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__node__iterator.html#b16f30b8b0b96e750792c69e8e1fbeb2">xml_node_iterator</a>(xml_node_struct *ref, xml_node_struct *prev)</td><td><a class="el" href="classpugi_1_1xml__node__iterator.html">pugi::xml_node_iterator</a></td><td></td></tr>
+</table><hr size="1"><address style="align: right;"><small>Generated on Wed Feb 21 22:19:51 2007 for pugixml by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6-NO </small></address>
+</body>
+</html>
diff --git a/docs/html/classpugi_1_1xml__node__iterator.html b/docs/html/classpugi_1_1xml__node__iterator.html
new file mode 100644
index 0000000..225c11a
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__node__iterator.html
@@ -0,0 +1,414 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pugixml: pugi::xml_node_iterator Class Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6-NO -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul></div>
+<div class="nav">
+<a class="el" href="namespacepugi.html">pugi</a>::<a class="el" href="classpugi_1_1xml__node__iterator.html">xml_node_iterator</a></div>
+<h1>pugi::xml_node_iterator Class Reference</h1><!-- doxytag: class="pugi::xml_node_iterator" --><!-- doxytag: inherits="std::iterator" -->Inheritance diagram for pugi::xml_node_iterator:<p><center><img src="classpugi_1_1xml__node__iterator__inherit__graph.png" border="0" usemap="#pugi_1_1xml__node__iterator__inherit__map" alt="Inheritance graph"></center>
+<center><font size="2">[<a href="graph_legend.html">legend</a>]</font></center>Collaboration diagram for pugi::xml_node_iterator:<p><center><img src="classpugi_1_1xml__node__iterator__coll__graph.png" border="0" usemap="#pugi_1_1xml__node__iterator__coll__map" alt="Collaboration graph"></center>
+<map name="pugi_1_1xml__node__iterator__coll__map">
+<area href="classpugi_1_1xml__node.html" shape="rect" coords="375,98,487,125" alt="">
+</map>
+<center><font size="2">[<a href="graph_legend.html">legend</a>]</font></center><a href="classpugi_1_1xml__node__iterator-members.html">List of all members.</a><hr><a name="_details"></a><h2>Detailed Description</h2>
+Child node iterator.
+<p>
+It's a bidirectional iterator with value type 'xml_node'.
+<p>
+<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="09538d658aef0ba20cbe050dff1c3a81"></a><!-- doxytag: member="pugi::xml_node_iterator::xml_node_iterator" ref="09538d658aef0ba20cbe050dff1c3a81" args="()" -->
+&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node__iterator.html#09538d658aef0ba20cbe050dff1c3a81">xml_node_iterator</a> ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Default ctor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node__iterator.html#874c832b41aaaff159ef2c36cdcb705c">xml_node_iterator</a> (const <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;node)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Initializing ctor. <a href="#874c832b41aaaff159ef2c36cdcb705c"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node__iterator.html#b16f30b8b0b96e750792c69e8e1fbeb2">xml_node_iterator</a> (xml_node_struct *ref, xml_node_struct *prev)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Initializing ctor (for past-the-end). <a href="#b16f30b8b0b96e750792c69e8e1fbeb2"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node__iterator.html#d879ac5ca8ec10d5d9a6e24f978ffde1">operator==</a> (const <a class="el" href="classpugi_1_1xml__node__iterator.html">xml_node_iterator</a> &amp;rhs) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Check if this iterator is equal to <em>rhs</em>. <a href="#d879ac5ca8ec10d5d9a6e24f978ffde1"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node__iterator.html#5905460cbc3433ff7edfa20ce02c11da">operator!=</a> (const <a class="el" href="classpugi_1_1xml__node__iterator.html">xml_node_iterator</a> &amp;rhs) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Check if this iterator is not equal to <em>rhs</em>. <a href="#5905460cbc3433ff7edfa20ce02c11da"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node__iterator.html#eb7903145d612c84bae22e0aa103608f">operator *</a> ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Dereferencing operator. <a href="#eb7903145d612c84bae22e0aa103608f"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node__iterator.html#7589cb0bc9ecf04b4553049ccd442fc6">operator-&gt;</a> ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Member access operator. <a href="#7589cb0bc9ecf04b4553049ccd442fc6"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">const <a class="el" href="classpugi_1_1xml__node__iterator.html">xml_node_iterator</a> &amp;&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node__iterator.html#fee390ff69626800c65ed64b32323a27">operator++</a> ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Pre-increment operator. <a href="#fee390ff69626800c65ed64b32323a27"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__node__iterator.html">xml_node_iterator</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node__iterator.html#da8f21676a3ac62b0dc98293b2baa257">operator++</a> (int)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Post-increment operator. <a href="#da8f21676a3ac62b0dc98293b2baa257"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">const <a class="el" href="classpugi_1_1xml__node__iterator.html">xml_node_iterator</a> &amp;&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node__iterator.html#658e6c5b704045c58dfcea161fe640e9">operator--</a> ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Pre-decrement operator. <a href="#658e6c5b704045c58dfcea161fe640e9"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__node__iterator.html">xml_node_iterator</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node__iterator.html#88f5f1a39e84b6fcb1574eb5366092ba">operator--</a> (int)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Post-decrement operator. <a href="#88f5f1a39e84b6fcb1574eb5366092ba"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="156d917a92815c7b593bd5ef19f6d5fb"></a><!-- doxytag: member="pugi::xml_node_iterator::xml_node" ref="156d917a92815c7b593bd5ef19f6d5fb" args="" -->
+class&nbsp;</td><td class="memItemRight" valign="bottom"><b>xml_node</b></td></tr>
+
+</table>
+<hr><h2>Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" name="874c832b41aaaff159ef2c36cdcb705c"></a><!-- doxytag: member="pugi::xml_node_iterator::xml_node_iterator" ref="874c832b41aaaff159ef2c36cdcb705c" args="(const xml_node &amp;node)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">pugi::xml_node_iterator::xml_node_iterator </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>node</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Initializing ctor.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>node</em>&nbsp;</td><td>- node that iterator will point at </td></tr>
+ </table>
+</dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="b16f30b8b0b96e750792c69e8e1fbeb2"></a><!-- doxytag: member="pugi::xml_node_iterator::xml_node_iterator" ref="b16f30b8b0b96e750792c69e8e1fbeb2" args="(xml_node_struct *ref, xml_node_struct *prev)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">pugi::xml_node_iterator::xml_node_iterator </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">xml_node_struct *&nbsp;</td>
+ <td class="mdname" nowrap> <em>ref</em>, </td>
+ </tr>
+ <tr>
+ <td class="md" nowrap align="right"></td>
+ <td class="md"></td>
+ <td class="md" nowrap>xml_node_struct *&nbsp;</td>
+ <td class="mdname" nowrap> <em>prev</em></td>
+ </tr>
+ <tr>
+ <td class="md"></td>
+ <td class="md">)&nbsp;</td>
+ <td class="md" colspan="2"></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Initializing ctor (for past-the-end).
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>ref</em>&nbsp;</td><td>- should be 0 </td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>prev</em>&nbsp;</td><td>- previous node </td></tr>
+ </table>
+</dl>
+ </td>
+ </tr>
+</table>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="d879ac5ca8ec10d5d9a6e24f978ffde1"></a><!-- doxytag: member="pugi::xml_node_iterator::operator==" ref="d879ac5ca8ec10d5d9a6e24f978ffde1" args="(const xml_node_iterator &amp;rhs) const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">bool pugi::xml_node_iterator::operator== </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const <a class="el" href="classpugi_1_1xml__node__iterator.html">xml_node_iterator</a> &amp;&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>rhs</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Check if this iterator is equal to <em>rhs</em>.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>rhs</em>&nbsp;</td><td>- other iterator </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>comparison result </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="5905460cbc3433ff7edfa20ce02c11da"></a><!-- doxytag: member="pugi::xml_node_iterator::operator!=" ref="5905460cbc3433ff7edfa20ce02c11da" args="(const xml_node_iterator &amp;rhs) const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">bool pugi::xml_node_iterator::operator!= </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const <a class="el" href="classpugi_1_1xml__node__iterator.html">xml_node_iterator</a> &amp;&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>rhs</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Check if this iterator is not equal to <em>rhs</em>.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>rhs</em>&nbsp;</td><td>- other iterator </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>comparison result </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="eb7903145d612c84bae22e0aa103608f"></a><!-- doxytag: member="pugi::xml_node_iterator::operator *" ref="eb7903145d612c84bae22e0aa103608f" args="()" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a>&amp; pugi::xml_node_iterator::operator * </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Dereferencing operator.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>reference to the node iterator points at </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="7589cb0bc9ecf04b4553049ccd442fc6"></a><!-- doxytag: member="pugi::xml_node_iterator::operator-&gt;" ref="7589cb0bc9ecf04b4553049ccd442fc6" args="()" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a>* pugi::xml_node_iterator::operator-&gt; </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Member access operator.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>poitner to the node iterator points at </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="fee390ff69626800c65ed64b32323a27"></a><!-- doxytag: member="pugi::xml_node_iterator::operator++" ref="fee390ff69626800c65ed64b32323a27" args="()" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">const <a class="el" href="classpugi_1_1xml__node__iterator.html">xml_node_iterator</a>&amp; pugi::xml_node_iterator::operator++ </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Pre-increment operator.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>self </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="da8f21676a3ac62b0dc98293b2baa257"></a><!-- doxytag: member="pugi::xml_node_iterator::operator++" ref="da8f21676a3ac62b0dc98293b2baa257" args="(int)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__node__iterator.html">xml_node_iterator</a> pugi::xml_node_iterator::operator++ </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">int&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Post-increment operator.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>old value </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="658e6c5b704045c58dfcea161fe640e9"></a><!-- doxytag: member="pugi::xml_node_iterator::operator--" ref="658e6c5b704045c58dfcea161fe640e9" args="()" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">const <a class="el" href="classpugi_1_1xml__node__iterator.html">xml_node_iterator</a>&amp; pugi::xml_node_iterator::operator-- </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Pre-decrement operator.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>self </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="88f5f1a39e84b6fcb1574eb5366092ba"></a><!-- doxytag: member="pugi::xml_node_iterator::operator--" ref="88f5f1a39e84b6fcb1574eb5366092ba" args="(int)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__node__iterator.html">xml_node_iterator</a> pugi::xml_node_iterator::operator-- </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">int&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Post-decrement operator.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>old value </dd></dl>
+ </td>
+ </tr>
+</table>
+<hr size="1"><address style="align: right;"><small>Generated on Wed Feb 21 22:19:51 2007 for pugixml by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6-NO </small></address>
+</body>
+</html>
diff --git a/docs/html/classpugi_1_1xml__node__iterator__coll__graph.map b/docs/html/classpugi_1_1xml__node__iterator__coll__graph.map
new file mode 100644
index 0000000..a1778b4
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__node__iterator__coll__graph.map
@@ -0,0 +1,2 @@
+base referer
+rect $classpugi_1_1xml__node.html 375,98 487,125
diff --git a/docs/html/classpugi_1_1xml__node__iterator__coll__graph.md5 b/docs/html/classpugi_1_1xml__node__iterator__coll__graph.md5
new file mode 100644
index 0000000..90c4c46
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__node__iterator__coll__graph.md5
@@ -0,0 +1 @@
+22bd4d00266db939271000f74fa43d5f \ No newline at end of file
diff --git a/docs/html/classpugi_1_1xml__node__iterator__coll__graph.png b/docs/html/classpugi_1_1xml__node__iterator__coll__graph.png
new file mode 100644
index 0000000..820aee7
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__node__iterator__coll__graph.png
Binary files differ
diff --git a/docs/html/classpugi_1_1xml__node__iterator__inherit__graph.map b/docs/html/classpugi_1_1xml__node__iterator__inherit__graph.map
new file mode 100644
index 0000000..5a14779
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__node__iterator__inherit__graph.map
@@ -0,0 +1 @@
+base referer
diff --git a/docs/html/classpugi_1_1xml__node__iterator__inherit__graph.md5 b/docs/html/classpugi_1_1xml__node__iterator__inherit__graph.md5
new file mode 100644
index 0000000..c91b5e0
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__node__iterator__inherit__graph.md5
@@ -0,0 +1 @@
+0215459dad00cd6fcdc98555bd24087b \ No newline at end of file
diff --git a/docs/html/classpugi_1_1xml__node__iterator__inherit__graph.png b/docs/html/classpugi_1_1xml__node__iterator__inherit__graph.png
new file mode 100644
index 0000000..e3f04ba
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__node__iterator__inherit__graph.png
Binary files differ
diff --git a/docs/html/classpugi_1_1xml__tree__walker-members.html b/docs/html/classpugi_1_1xml__tree__walker-members.html
new file mode 100644
index 0000000..956ef8a
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__tree__walker-members.html
@@ -0,0 +1,32 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pugixml: Member List</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6-NO -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul></div>
+<h1>pugi::xml_tree_walker Member List</h1>This is the complete list of members for <a class="el" href="classpugi_1_1xml__tree__walker.html">pugi::xml_tree_walker</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__tree__walker.html#118c8c5a323745053ae52dc0e1276a9b">begin</a>(xml_node &amp;)</td><td><a class="el" href="classpugi_1_1xml__tree__walker.html">pugi::xml_tree_walker</a></td><td><code> [virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__tree__walker.html#45420eb7809aae9d35feaca33835dbe2">depth</a>() const </td><td><a class="el" href="classpugi_1_1xml__tree__walker.html">pugi::xml_tree_walker</a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__tree__walker.html#19c4f587afbd022959d81c6bf129a8fd">end</a>(xml_node &amp;)</td><td><a class="el" href="classpugi_1_1xml__tree__walker.html">pugi::xml_tree_walker</a></td><td><code> [virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__tree__walker.html#caf3a12a8cfdd55ef421ad045dfef764">for_each</a>(xml_node &amp;)=0</td><td><a class="el" href="classpugi_1_1xml__tree__walker.html">pugi::xml_tree_walker</a></td><td><code> [pure virtual]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>xml_node</b> (defined in <a class="el" href="classpugi_1_1xml__tree__walker.html">pugi::xml_tree_walker</a>)</td><td><a class="el" href="classpugi_1_1xml__tree__walker.html">pugi::xml_tree_walker</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__tree__walker.html#93c03157cff8f8a0ead30c2d256d061b">xml_tree_walker</a>()</td><td><a class="el" href="classpugi_1_1xml__tree__walker.html">pugi::xml_tree_walker</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xml__tree__walker.html#aa0d4eb42c6518a2a90bc264588ece84">~xml_tree_walker</a>()</td><td><a class="el" href="classpugi_1_1xml__tree__walker.html">pugi::xml_tree_walker</a></td><td><code> [virtual]</code></td></tr>
+</table><hr size="1"><address style="align: right;"><small>Generated on Wed Feb 21 22:19:51 2007 for pugixml by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6-NO </small></address>
+</body>
+</html>
diff --git a/docs/html/classpugi_1_1xml__tree__walker.html b/docs/html/classpugi_1_1xml__tree__walker.html
new file mode 100644
index 0000000..2e73c1a
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__tree__walker.html
@@ -0,0 +1,186 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pugixml: pugi::xml_tree_walker Class Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6-NO -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul></div>
+<div class="nav">
+<a class="el" href="namespacepugi.html">pugi</a>::<a class="el" href="classpugi_1_1xml__tree__walker.html">xml_tree_walker</a></div>
+<h1>pugi::xml_tree_walker Class Reference</h1><!-- doxytag: class="pugi::xml_tree_walker" -->Collaboration diagram for pugi::xml_tree_walker:<p><center><img src="classpugi_1_1xml__tree__walker__coll__graph.png" border="0" usemap="#pugi_1_1xml__tree__walker__coll__map" alt="Collaboration graph"></center>
+<center><font size="2">[<a href="graph_legend.html">legend</a>]</font></center><a href="classpugi_1_1xml__tree__walker-members.html">List of all members.</a><hr><a name="_details"></a><h2>Detailed Description</h2>
+Abstract tree walker class.
+<p>
+<dl compact><dt><b>See also:</b></dt><dd><a class="el" href="classpugi_1_1xml__node.html#41be22248598bdf1575ed8d7bdd77807">xml_node::traverse</a> </dd></dl>
+
+<p>
+<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="93c03157cff8f8a0ead30c2d256d061b"></a><!-- doxytag: member="pugi::xml_tree_walker::xml_tree_walker" ref="93c03157cff8f8a0ead30c2d256d061b" args="()" -->
+&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__tree__walker.html#93c03157cff8f8a0ead30c2d256d061b">xml_tree_walker</a> ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Default ctor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="aa0d4eb42c6518a2a90bc264588ece84"></a><!-- doxytag: member="pugi::xml_tree_walker::~xml_tree_walker" ref="aa0d4eb42c6518a2a90bc264588ece84" args="()" -->
+virtual&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__tree__walker.html#aa0d4eb42c6518a2a90bc264588ece84">~xml_tree_walker</a> ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Virtual dtor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__tree__walker.html#118c8c5a323745053ae52dc0e1276a9b">begin</a> (<a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Callback that is called when traversal of node begins. <a href="#118c8c5a323745053ae52dc0e1276a9b"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__tree__walker.html#caf3a12a8cfdd55ef421ad045dfef764">for_each</a> (<a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;)=0</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Callback that is called for each node traversed. <a href="#caf3a12a8cfdd55ef421ad045dfef764"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__tree__walker.html#19c4f587afbd022959d81c6bf129a8fd">end</a> (<a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Callback that is called when traversal of node ends. <a href="#19c4f587afbd022959d81c6bf129a8fd"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__tree__walker.html#45420eb7809aae9d35feaca33835dbe2">depth</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get node depth. <a href="#45420eb7809aae9d35feaca33835dbe2"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="156d917a92815c7b593bd5ef19f6d5fb"></a><!-- doxytag: member="pugi::xml_tree_walker::xml_node" ref="156d917a92815c7b593bd5ef19f6d5fb" args="" -->
+class&nbsp;</td><td class="memItemRight" valign="bottom"><b>xml_node</b></td></tr>
+
+</table>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="45420eb7809aae9d35feaca33835dbe2"></a><!-- doxytag: member="pugi::xml_tree_walker::depth" ref="45420eb7809aae9d35feaca33835dbe2" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">int pugi::xml_tree_walker::depth </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const<code> [protected]</code></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Get node depth.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>node depth </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="118c8c5a323745053ae52dc0e1276a9b"></a><!-- doxytag: member="pugi::xml_tree_walker::begin" ref="118c8c5a323745053ae52dc0e1276a9b" args="(xml_node &amp;)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">virtual bool pugi::xml_tree_walker::begin </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap><code> [virtual]</code></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Callback that is called when traversal of node begins.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>returning false will abort the traversal </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="caf3a12a8cfdd55ef421ad045dfef764"></a><!-- doxytag: member="pugi::xml_tree_walker::for_each" ref="caf3a12a8cfdd55ef421ad045dfef764" args="(xml_node &amp;)=0" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">virtual bool pugi::xml_tree_walker::for_each </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap><code> [pure virtual]</code></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Callback that is called for each node traversed.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>returning false will abort the traversal </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="19c4f587afbd022959d81c6bf129a8fd"></a><!-- doxytag: member="pugi::xml_tree_walker::end" ref="19c4f587afbd022959d81c6bf129a8fd" args="(xml_node &amp;)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">virtual bool pugi::xml_tree_walker::end </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap><code> [virtual]</code></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Callback that is called when traversal of node ends.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>returning false will abort the traversal </dd></dl>
+ </td>
+ </tr>
+</table>
+<hr size="1"><address style="align: right;"><small>Generated on Wed Feb 21 22:19:51 2007 for pugixml by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6-NO </small></address>
+</body>
+</html>
diff --git a/docs/html/classpugi_1_1xml__tree__walker__coll__graph.map b/docs/html/classpugi_1_1xml__tree__walker__coll__graph.map
new file mode 100644
index 0000000..5a14779
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__tree__walker__coll__graph.map
@@ -0,0 +1 @@
+base referer
diff --git a/docs/html/classpugi_1_1xml__tree__walker__coll__graph.md5 b/docs/html/classpugi_1_1xml__tree__walker__coll__graph.md5
new file mode 100644
index 0000000..a7106de
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__tree__walker__coll__graph.md5
@@ -0,0 +1 @@
+d990bdcfb4fd4dd9f8f3a6fe4ee6759b \ No newline at end of file
diff --git a/docs/html/classpugi_1_1xml__tree__walker__coll__graph.png b/docs/html/classpugi_1_1xml__tree__walker__coll__graph.png
new file mode 100644
index 0000000..39c90dd
--- /dev/null
+++ b/docs/html/classpugi_1_1xml__tree__walker__coll__graph.png
Binary files differ
diff --git a/docs/html/classpugi_1_1xpath__exception-members.html b/docs/html/classpugi_1_1xpath__exception-members.html
new file mode 100644
index 0000000..3fa5c6f
--- /dev/null
+++ b/docs/html/classpugi_1_1xpath__exception-members.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pugixml: Member List</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6-NO -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul></div>
+<h1>pugi::xpath_exception Member List</h1>This is the complete list of members for <a class="el" href="classpugi_1_1xpath__exception.html">pugi::xpath_exception</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xpath__exception.html#436980baf3d09670ecc15a110ed0f654">what</a>() const </td><td><a class="el" href="classpugi_1_1xpath__exception.html">pugi::xpath_exception</a></td><td><code> [virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xpath__exception.html#9236dd8d2e0674417b2cb53760791017">xpath_exception</a>(const char *message)</td><td><a class="el" href="classpugi_1_1xpath__exception.html">pugi::xpath_exception</a></td><td><code> [explicit]</code></td></tr>
+</table><hr size="1"><address style="align: right;"><small>Generated on Wed Feb 21 22:19:52 2007 for pugixml by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6-NO </small></address>
+</body>
+</html>
diff --git a/docs/html/classpugi_1_1xpath__exception.html b/docs/html/classpugi_1_1xpath__exception.html
new file mode 100644
index 0000000..4278767
--- /dev/null
+++ b/docs/html/classpugi_1_1xpath__exception.html
@@ -0,0 +1,108 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pugixml: pugi::xpath_exception Class Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6-NO -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul></div>
+<div class="nav">
+<a class="el" href="namespacepugi.html">pugi</a>::<a class="el" href="classpugi_1_1xpath__exception.html">xpath_exception</a></div>
+<h1>pugi::xpath_exception Class Reference</h1><!-- doxytag: class="pugi::xpath_exception" --><!-- doxytag: inherits="std::exception" -->Inheritance diagram for pugi::xpath_exception:<p><center><img src="classpugi_1_1xpath__exception__inherit__graph.png" border="0" usemap="#pugi_1_1xpath__exception__inherit__map" alt="Inheritance graph"></center>
+<center><font size="2">[<a href="graph_legend.html">legend</a>]</font></center>Collaboration diagram for pugi::xpath_exception:<p><center><img src="classpugi_1_1xpath__exception__coll__graph.png" border="0" usemap="#pugi_1_1xpath__exception__coll__map" alt="Collaboration graph"></center>
+<center><font size="2">[<a href="graph_legend.html">legend</a>]</font></center><a href="classpugi_1_1xpath__exception-members.html">List of all members.</a><hr><a name="_details"></a><h2>Detailed Description</h2>
+XPath exception class.
+<p>
+<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xpath__exception.html#9236dd8d2e0674417b2cb53760791017">xpath_exception</a> (const char *message)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Construct exception from static error string. <a href="#9236dd8d2e0674417b2cb53760791017"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual const char *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xpath__exception.html#436980baf3d09670ecc15a110ed0f654">what</a> () const throw ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Return error message. <a href="#436980baf3d09670ecc15a110ed0f654"></a><br></td></tr>
+</table>
+<hr><h2>Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" name="9236dd8d2e0674417b2cb53760791017"></a><!-- doxytag: member="pugi::xpath_exception::xpath_exception" ref="9236dd8d2e0674417b2cb53760791017" args="(const char *message)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">pugi::xpath_exception::xpath_exception </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const char *&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>message</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap><code> [explicit]</code></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Construct exception from static error string.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>message</em>&nbsp;</td><td>- error string </td></tr>
+ </table>
+</dl>
+ </td>
+ </tr>
+</table>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="436980baf3d09670ecc15a110ed0f654"></a><!-- doxytag: member="pugi::xpath_exception::what" ref="436980baf3d09670ecc15a110ed0f654" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">virtual const char* pugi::xpath_exception::what </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const throw ()<code> [virtual]</code></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Return error message.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>error message </dd></dl>
+ </td>
+ </tr>
+</table>
+<hr size="1"><address style="align: right;"><small>Generated on Wed Feb 21 22:19:52 2007 for pugixml by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6-NO </small></address>
+</body>
+</html>
diff --git a/docs/html/classpugi_1_1xpath__exception__coll__graph.map b/docs/html/classpugi_1_1xpath__exception__coll__graph.map
new file mode 100644
index 0000000..5a14779
--- /dev/null
+++ b/docs/html/classpugi_1_1xpath__exception__coll__graph.map
@@ -0,0 +1 @@
+base referer
diff --git a/docs/html/classpugi_1_1xpath__exception__coll__graph.md5 b/docs/html/classpugi_1_1xpath__exception__coll__graph.md5
new file mode 100644
index 0000000..c917263
--- /dev/null
+++ b/docs/html/classpugi_1_1xpath__exception__coll__graph.md5
@@ -0,0 +1 @@
+e513ec4c3dceb21149d86032837e55f8 \ No newline at end of file
diff --git a/docs/html/classpugi_1_1xpath__exception__coll__graph.png b/docs/html/classpugi_1_1xpath__exception__coll__graph.png
new file mode 100644
index 0000000..f713014
--- /dev/null
+++ b/docs/html/classpugi_1_1xpath__exception__coll__graph.png
Binary files differ
diff --git a/docs/html/classpugi_1_1xpath__exception__inherit__graph.map b/docs/html/classpugi_1_1xpath__exception__inherit__graph.map
new file mode 100644
index 0000000..5a14779
--- /dev/null
+++ b/docs/html/classpugi_1_1xpath__exception__inherit__graph.map
@@ -0,0 +1 @@
+base referer
diff --git a/docs/html/classpugi_1_1xpath__exception__inherit__graph.md5 b/docs/html/classpugi_1_1xpath__exception__inherit__graph.md5
new file mode 100644
index 0000000..900b385
--- /dev/null
+++ b/docs/html/classpugi_1_1xpath__exception__inherit__graph.md5
@@ -0,0 +1 @@
+531210d868031d4dfad14e6148fd793e \ No newline at end of file
diff --git a/docs/html/classpugi_1_1xpath__exception__inherit__graph.png b/docs/html/classpugi_1_1xpath__exception__inherit__graph.png
new file mode 100644
index 0000000..a88837e
--- /dev/null
+++ b/docs/html/classpugi_1_1xpath__exception__inherit__graph.png
Binary files differ
diff --git a/docs/html/classpugi_1_1xpath__node-members.html b/docs/html/classpugi_1_1xpath__node-members.html
new file mode 100644
index 0000000..f1efe50
--- /dev/null
+++ b/docs/html/classpugi_1_1xpath__node-members.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pugixml: Member List</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6-NO -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul></div>
+<h1>pugi::xpath_node Member List</h1>This is the complete list of members for <a class="el" href="classpugi_1_1xpath__node.html">pugi::xpath_node</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xpath__node.html#1d4b104aa945a3364dd45f8d6a9f7031">attribute</a>() const </td><td><a class="el" href="classpugi_1_1xpath__node.html">pugi::xpath_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xpath__node.html#733aedafcaac5d4c0f18cfd2e2fac8d5">node</a>() const </td><td><a class="el" href="classpugi_1_1xpath__node.html">pugi::xpath_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xpath__node.html#4993b929cb8ae5c8a759788e0c5d199c">operator unspecified_bool_type</a>() const </td><td><a class="el" href="classpugi_1_1xpath__node.html">pugi::xpath_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xpath__node.html#1d681c030d20036dc89530a4d1fbea59">operator!=</a>(const xpath_node &amp;n) const </td><td><a class="el" href="classpugi_1_1xpath__node.html">pugi::xpath_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xpath__node.html#391f897a4be5b6c4a84b97bbbb680c63">operator==</a>(const xpath_node &amp;n) const </td><td><a class="el" href="classpugi_1_1xpath__node.html">pugi::xpath_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xpath__node.html#7e293086926c36f781beb0f25629c614">parent</a>() const </td><td><a class="el" href="classpugi_1_1xpath__node.html">pugi::xpath_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xpath__node.html#c744d6466fee3a062ba3bb928331031e">xpath_node</a>()</td><td><a class="el" href="classpugi_1_1xpath__node.html">pugi::xpath_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xpath__node.html#c19206fda68c2c67ff2b42009debe74f">xpath_node</a>(const xml_node &amp;node)</td><td><a class="el" href="classpugi_1_1xpath__node.html">pugi::xpath_node</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xpath__node.html#5cc7cfd8ceb6cae4be45b2f29fe57f34">xpath_node</a>(const xml_attribute &amp;attribute, const xml_node &amp;parent)</td><td><a class="el" href="classpugi_1_1xpath__node.html">pugi::xpath_node</a></td><td></td></tr>
+</table><hr size="1"><address style="align: right;"><small>Generated on Wed Feb 21 22:19:52 2007 for pugixml by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6-NO </small></address>
+</body>
+</html>
diff --git a/docs/html/classpugi_1_1xpath__node.html b/docs/html/classpugi_1_1xpath__node.html
new file mode 100644
index 0000000..87b5b59
--- /dev/null
+++ b/docs/html/classpugi_1_1xpath__node.html
@@ -0,0 +1,341 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pugixml: pugi::xpath_node Class Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6-NO -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul></div>
+<div class="nav">
+<a class="el" href="namespacepugi.html">pugi</a>::<a class="el" href="classpugi_1_1xpath__node.html">xpath_node</a></div>
+<h1>pugi::xpath_node Class Reference</h1><!-- doxytag: class="pugi::xpath_node" -->Collaboration diagram for pugi::xpath_node:<p><center><img src="classpugi_1_1xpath__node__coll__graph.png" border="0" usemap="#pugi_1_1xpath__node__coll__map" alt="Collaboration graph"></center>
+<map name="pugi_1_1xpath__node__coll__map">
+<area href="classpugi_1_1xml__node.html" shape="rect" coords="22,98,134,125" alt="">
+<area href="classpugi_1_1xml__attribute.html" shape="rect" coords="166,98,300,125" alt="">
+</map>
+<center><font size="2">[<a href="graph_legend.html">legend</a>]</font></center><a href="classpugi_1_1xpath__node-members.html">List of all members.</a><hr><a name="_details"></a><h2>Detailed Description</h2>
+XPath node class.
+<p>
+XPath defines node to be either <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> or <a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> in pugixml terminology, so <a class="el" href="classpugi_1_1xpath__node.html">xpath_node</a> is either <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> or <a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a>.
+<p>
+<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c744d6466fee3a062ba3bb928331031e"></a><!-- doxytag: member="pugi::xpath_node::xpath_node" ref="c744d6466fee3a062ba3bb928331031e" args="()" -->
+&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xpath__node.html#c744d6466fee3a062ba3bb928331031e">xpath_node</a> ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Construct empty XPath node. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xpath__node.html#c19206fda68c2c67ff2b42009debe74f">xpath_node</a> (const <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;node)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Construct XPath node from XML node. <a href="#c19206fda68c2c67ff2b42009debe74f"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xpath__node.html#5cc7cfd8ceb6cae4be45b2f29fe57f34">xpath_node</a> (const <a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> &amp;attribute, const <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;parent)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Construct XPath node from XML attribute. <a href="#5cc7cfd8ceb6cae4be45b2f29fe57f34"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xpath__node.html#733aedafcaac5d4c0f18cfd2e2fac8d5">node</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get XML node, if any. <a href="#733aedafcaac5d4c0f18cfd2e2fac8d5"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xpath__node.html#1d4b104aa945a3364dd45f8d6a9f7031">attribute</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get XML attribute, if any. <a href="#1d4b104aa945a3364dd45f8d6a9f7031"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xpath__node.html#7e293086926c36f781beb0f25629c614">parent</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get parent of contained XML attribute, if any. <a href="#7e293086926c36f781beb0f25629c614"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xpath__node.html#4993b929cb8ae5c8a759788e0c5d199c">operator unspecified_bool_type</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Safe bool conversion. <a href="#4993b929cb8ae5c8a759788e0c5d199c"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xpath__node.html#391f897a4be5b6c4a84b97bbbb680c63">operator==</a> (const <a class="el" href="classpugi_1_1xpath__node.html">xpath_node</a> &amp;n) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Compares two XPath nodes. <a href="#391f897a4be5b6c4a84b97bbbb680c63"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xpath__node.html#1d681c030d20036dc89530a4d1fbea59">operator!=</a> (const <a class="el" href="classpugi_1_1xpath__node.html">xpath_node</a> &amp;n) const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Compares two XPath nodes. <a href="#1d681c030d20036dc89530a4d1fbea59"></a><br></td></tr>
+</table>
+<hr><h2>Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" name="c19206fda68c2c67ff2b42009debe74f"></a><!-- doxytag: member="pugi::xpath_node::xpath_node" ref="c19206fda68c2c67ff2b42009debe74f" args="(const xml_node &amp;node)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">pugi::xpath_node::xpath_node </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>node</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Construct XPath node from XML node.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>node</em>&nbsp;</td><td>- XML node </td></tr>
+ </table>
+</dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="5cc7cfd8ceb6cae4be45b2f29fe57f34"></a><!-- doxytag: member="pugi::xpath_node::xpath_node" ref="5cc7cfd8ceb6cae4be45b2f29fe57f34" args="(const xml_attribute &amp;attribute, const xml_node &amp;parent)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">pugi::xpath_node::xpath_node </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const <a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> &amp;&nbsp;</td>
+ <td class="mdname" nowrap> <em>attribute</em>, </td>
+ </tr>
+ <tr>
+ <td class="md" nowrap align="right"></td>
+ <td class="md"></td>
+ <td class="md" nowrap>const <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;&nbsp;</td>
+ <td class="mdname" nowrap> <em>parent</em></td>
+ </tr>
+ <tr>
+ <td class="md"></td>
+ <td class="md">)&nbsp;</td>
+ <td class="md" colspan="2"></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Construct XPath node from XML attribute.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>attribute</em>&nbsp;</td><td>- XML attribute </td></tr>
+ <tr><td valign="top"></td><td valign="top"><em>parent</em>&nbsp;</td><td>- attribute's parent node </td></tr>
+ </table>
+</dl>
+ </td>
+ </tr>
+</table>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="733aedafcaac5d4c0f18cfd2e2fac8d5"></a><!-- doxytag: member="pugi::xpath_node::node" ref="733aedafcaac5d4c0f18cfd2e2fac8d5" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a> pugi::xpath_node::node </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Get XML node, if any.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>contained XML node, empty node otherwise </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="1d4b104aa945a3364dd45f8d6a9f7031"></a><!-- doxytag: member="pugi::xpath_node::attribute" ref="1d4b104aa945a3364dd45f8d6a9f7031" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a> pugi::xpath_node::attribute </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Get XML attribute, if any.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>contained XML attribute, if any, empty attribute otherwise </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="7e293086926c36f781beb0f25629c614"></a><!-- doxytag: member="pugi::xpath_node::parent" ref="7e293086926c36f781beb0f25629c614" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a> pugi::xpath_node::parent </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Get parent of contained XML attribute, if any.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>parent of contained XML attribute, if any, empty node otherwise </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="4993b929cb8ae5c8a759788e0c5d199c"></a><!-- doxytag: member="pugi::xpath_node::operator unspecified_bool_type" ref="4993b929cb8ae5c8a759788e0c5d199c" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">pugi::xpath_node::operator unspecified_bool_type </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Safe bool conversion.
+<p>
+Allows <a class="el" href="classpugi_1_1xpath__node.html">xpath_node</a> to be used in a context where boolean variable is expected, such as 'if (node)'. </td>
+ </tr>
+</table>
+<a class="anchor" name="391f897a4be5b6c4a84b97bbbb680c63"></a><!-- doxytag: member="pugi::xpath_node::operator==" ref="391f897a4be5b6c4a84b97bbbb680c63" args="(const xpath_node &amp;n) const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">bool pugi::xpath_node::operator== </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const <a class="el" href="classpugi_1_1xpath__node.html">xpath_node</a> &amp;&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>n</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Compares two XPath nodes.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>n</em>&nbsp;</td><td>- XPath node to compare to </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>comparison result </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="1d681c030d20036dc89530a4d1fbea59"></a><!-- doxytag: member="pugi::xpath_node::operator!=" ref="1d681c030d20036dc89530a4d1fbea59" args="(const xpath_node &amp;n) const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">bool pugi::xpath_node::operator!= </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const <a class="el" href="classpugi_1_1xpath__node.html">xpath_node</a> &amp;&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>n</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Compares two XPath nodes.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>n</em>&nbsp;</td><td>- XPath node to compare to </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>comparison result </dd></dl>
+ </td>
+ </tr>
+</table>
+<hr size="1"><address style="align: right;"><small>Generated on Wed Feb 21 22:19:52 2007 for pugixml by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6-NO </small></address>
+</body>
+</html>
diff --git a/docs/html/classpugi_1_1xpath__node__coll__graph.map b/docs/html/classpugi_1_1xpath__node__coll__graph.map
new file mode 100644
index 0000000..dd6359e
--- /dev/null
+++ b/docs/html/classpugi_1_1xpath__node__coll__graph.map
@@ -0,0 +1,3 @@
+base referer
+rect $classpugi_1_1xml__node.html 22,98 134,125
+rect $classpugi_1_1xml__attribute.html 166,98 300,125
diff --git a/docs/html/classpugi_1_1xpath__node__coll__graph.md5 b/docs/html/classpugi_1_1xpath__node__coll__graph.md5
new file mode 100644
index 0000000..5b4d30d
--- /dev/null
+++ b/docs/html/classpugi_1_1xpath__node__coll__graph.md5
@@ -0,0 +1 @@
+6221c8e84c73ffa18f2147cf42452f28 \ No newline at end of file
diff --git a/docs/html/classpugi_1_1xpath__node__coll__graph.png b/docs/html/classpugi_1_1xpath__node__coll__graph.png
new file mode 100644
index 0000000..ba8c62b
--- /dev/null
+++ b/docs/html/classpugi_1_1xpath__node__coll__graph.png
Binary files differ
diff --git a/docs/html/classpugi_1_1xpath__node__set-members.html b/docs/html/classpugi_1_1xpath__node__set-members.html
new file mode 100644
index 0000000..4f9a678
--- /dev/null
+++ b/docs/html/classpugi_1_1xpath__node__set-members.html
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pugixml: Member List</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6-NO -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul></div>
+<h1>pugi::xpath_node_set Member List</h1>This is the complete list of members for <a class="el" href="classpugi_1_1xpath__node__set.html">pugi::xpath_node_set</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xpath__node__set.html#cf8a0a6e24b502941f5f182c44e14587">begin</a>() const </td><td><a class="el" href="classpugi_1_1xpath__node__set.html">pugi::xpath_node_set</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xpath__node__set.html#6987510e88cea4a396d186285c174de6">const_iterator</a> typedef</td><td><a class="el" href="classpugi_1_1xpath__node__set.html">pugi::xpath_node_set</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xpath__node__set.html#8c6ade2a234af974edb4df861e30ca14">empty</a>() const </td><td><a class="el" href="classpugi_1_1xpath__node__set.html">pugi::xpath_node_set</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xpath__node__set.html#0252547cd7016f105598d649ec4ff0b1">end</a>() const </td><td><a class="el" href="classpugi_1_1xpath__node__set.html">pugi::xpath_node_set</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xpath__node__set.html#e786ac9ff330b2dbd7b4da2d8d55b61a">first</a>() const </td><td><a class="el" href="classpugi_1_1xpath__node__set.html">pugi::xpath_node_set</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xpath__node__set.html#2dda399273322331ad99409319baa75a">operator=</a>(const xpath_node_set &amp;ns)</td><td><a class="el" href="classpugi_1_1xpath__node__set.html">pugi::xpath_node_set</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xpath__node__set.html#2d8be3dbf5d38d3fb4ee04daed4d72a7">size</a>() const </td><td><a class="el" href="classpugi_1_1xpath__node__set.html">pugi::xpath_node_set</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xpath__node__set.html#53b4915362d3c73100d3b73ac40ab8f2">sort</a>(bool reverse=false)</td><td><a class="el" href="classpugi_1_1xpath__node__set.html">pugi::xpath_node_set</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xpath__node__set.html#42a943e60d5809620f0d77809bef122c">type</a>() const </td><td><a class="el" href="classpugi_1_1xpath__node__set.html">pugi::xpath_node_set</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xpath__node__set.html#6c6899c8ecfbce9e42ec85540907080e9d5ce5e6194ac2003da0d86d9af87437">type_sorted</a> enum value</td><td><a class="el" href="classpugi_1_1xpath__node__set.html">pugi::xpath_node_set</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xpath__node__set.html#6c6899c8ecfbce9e42ec85540907080e7035df3be16759292de59850d6c0b9be">type_sorted_reverse</a> enum value</td><td><a class="el" href="classpugi_1_1xpath__node__set.html">pugi::xpath_node_set</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xpath__node__set.html#6c6899c8ecfbce9e42ec85540907080e">type_t</a> enum name</td><td><a class="el" href="classpugi_1_1xpath__node__set.html">pugi::xpath_node_set</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xpath__node__set.html#6c6899c8ecfbce9e42ec85540907080e7636fa164710ab9b069850ea3b3e4924">type_unsorted</a> enum value</td><td><a class="el" href="classpugi_1_1xpath__node__set.html">pugi::xpath_node_set</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>xpath_ast_node</b> (defined in <a class="el" href="classpugi_1_1xpath__node__set.html">pugi::xpath_node_set</a>)</td><td><a class="el" href="classpugi_1_1xpath__node__set.html">pugi::xpath_node_set</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xpath__node__set.html#3e102821157e43d83f6623996709127d">xpath_node_set</a>()</td><td><a class="el" href="classpugi_1_1xpath__node__set.html">pugi::xpath_node_set</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xpath__node__set.html#59f1f078606bb6c4f1a081bb82bcf901">xpath_node_set</a>(const xpath_node_set &amp;ns)</td><td><a class="el" href="classpugi_1_1xpath__node__set.html">pugi::xpath_node_set</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xpath__node__set.html#6ca44658aa0126e12f9fc3e3f8017376">~xpath_node_set</a>()</td><td><a class="el" href="classpugi_1_1xpath__node__set.html">pugi::xpath_node_set</a></td><td></td></tr>
+</table><hr size="1"><address style="align: right;"><small>Generated on Wed Feb 21 22:19:52 2007 for pugixml by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6-NO </small></address>
+</body>
+</html>
diff --git a/docs/html/classpugi_1_1xpath__node__set.html b/docs/html/classpugi_1_1xpath__node__set.html
new file mode 100644
index 0000000..2773fb6
--- /dev/null
+++ b/docs/html/classpugi_1_1xpath__node__set.html
@@ -0,0 +1,413 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pugixml: pugi::xpath_node_set Class Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6-NO -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul></div>
+<div class="nav">
+<a class="el" href="namespacepugi.html">pugi</a>::<a class="el" href="classpugi_1_1xpath__node__set.html">xpath_node_set</a></div>
+<h1>pugi::xpath_node_set Class Reference</h1><!-- doxytag: class="pugi::xpath_node_set" -->Collaboration diagram for pugi::xpath_node_set:<p><center><img src="classpugi_1_1xpath__node__set__coll__graph.png" border="0" usemap="#pugi_1_1xpath__node__set__coll__map" alt="Collaboration graph"></center>
+<map name="pugi_1_1xpath__node__set__coll__map">
+<area href="classpugi_1_1xpath__node.html" shape="rect" coords="82,189,207,216" alt="">
+<area href="classpugi_1_1xml__node.html" shape="rect" coords="25,98,137,125" alt="">
+<area href="classpugi_1_1xml__attribute.html" shape="rect" coords="166,98,299,125" alt="">
+</map>
+<center><font size="2">[<a href="graph_legend.html">legend</a>]</font></center><a href="classpugi_1_1xpath__node__set-members.html">List of all members.</a><hr><a name="_details"></a><h2>Detailed Description</h2>
+Not necessarily ordered constant collection of XPath nodes.
+<p>
+<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6987510e88cea4a396d186285c174de6"></a><!-- doxytag: member="pugi::xpath_node_set::const_iterator" ref="6987510e88cea4a396d186285c174de6" args="" -->
+typedef const <a class="el" href="classpugi_1_1xpath__node.html">xpath_node</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xpath__node__set.html#6987510e88cea4a396d186285c174de6">const_iterator</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Constant iterator type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xpath__node__set.html#6c6899c8ecfbce9e42ec85540907080e">type_t</a> { <a class="el" href="classpugi_1_1xpath__node__set.html#6c6899c8ecfbce9e42ec85540907080e7636fa164710ab9b069850ea3b3e4924">type_unsorted</a>,
+<a class="el" href="classpugi_1_1xpath__node__set.html#6c6899c8ecfbce9e42ec85540907080e9d5ce5e6194ac2003da0d86d9af87437">type_sorted</a>,
+<a class="el" href="classpugi_1_1xpath__node__set.html#6c6899c8ecfbce9e42ec85540907080e7035df3be16759292de59850d6c0b9be">type_sorted_reverse</a>
+ }</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Collection type. <a href="classpugi_1_1xpath__node__set.html#6c6899c8ecfbce9e42ec85540907080e">More...</a><br></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3e102821157e43d83f6623996709127d"></a><!-- doxytag: member="pugi::xpath_node_set::xpath_node_set" ref="3e102821157e43d83f6623996709127d" args="()" -->
+&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xpath__node__set.html#3e102821157e43d83f6623996709127d">xpath_node_set</a> ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Default ctor Constructs empty set. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6ca44658aa0126e12f9fc3e3f8017376"></a><!-- doxytag: member="pugi::xpath_node_set::~xpath_node_set" ref="6ca44658aa0126e12f9fc3e3f8017376" args="()" -->
+&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xpath__node__set.html#6ca44658aa0126e12f9fc3e3f8017376">~xpath_node_set</a> ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Dtor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xpath__node__set.html#59f1f078606bb6c4f1a081bb82bcf901">xpath_node_set</a> (const <a class="el" href="classpugi_1_1xpath__node__set.html">xpath_node_set</a> &amp;ns)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Copy ctor. <a href="#59f1f078606bb6c4f1a081bb82bcf901"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xpath__node__set.html">xpath_node_set</a> &amp;&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xpath__node__set.html#2dda399273322331ad99409319baa75a">operator=</a> (const <a class="el" href="classpugi_1_1xpath__node__set.html">xpath_node_set</a> &amp;ns)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Assignment operator. <a href="#2dda399273322331ad99409319baa75a"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xpath__node__set.html#6c6899c8ecfbce9e42ec85540907080e">type_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xpath__node__set.html#42a943e60d5809620f0d77809bef122c">type</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get collection type. <a href="#42a943e60d5809620f0d77809bef122c"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">size_t&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xpath__node__set.html#2d8be3dbf5d38d3fb4ee04daed4d72a7">size</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get collection size. <a href="#2d8be3dbf5d38d3fb4ee04daed4d72a7"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xpath__node.html">const_iterator</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xpath__node__set.html#cf8a0a6e24b502941f5f182c44e14587">begin</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get begin constant iterator for collection. <a href="#cf8a0a6e24b502941f5f182c44e14587"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xpath__node.html">const_iterator</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xpath__node__set.html#0252547cd7016f105598d649ec4ff0b1">end</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get end iterator for collection. <a href="#0252547cd7016f105598d649ec4ff0b1"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xpath__node__set.html#53b4915362d3c73100d3b73ac40ab8f2">sort</a> (bool reverse=false)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Sort the collection in ascending/descending order by document order. <a href="#53b4915362d3c73100d3b73ac40ab8f2"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xpath__node.html">xpath_node</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xpath__node__set.html#e786ac9ff330b2dbd7b4da2d8d55b61a">first</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get first node in the collection by document order. <a href="#e786ac9ff330b2dbd7b4da2d8d55b61a"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xpath__node__set.html#8c6ade2a234af974edb4df861e30ca14">empty</a> () const </td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Return true if collection is empty. <a href="#8c6ade2a234af974edb4df861e30ca14"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c7220656734aaa980b8ff9c1f2ae1744"></a><!-- doxytag: member="pugi::xpath_node_set::xpath_ast_node" ref="c7220656734aaa980b8ff9c1f2ae1744" args="" -->
+class&nbsp;</td><td class="memItemRight" valign="bottom"><b>xpath_ast_node</b></td></tr>
+
+</table>
+<hr><h2>Member Enumeration Documentation</h2>
+<a class="anchor" name="6c6899c8ecfbce9e42ec85540907080e"></a><!-- doxytag: member="pugi::xpath_node_set::type_t" ref="6c6899c8ecfbce9e42ec85540907080e" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">enum <a class="el" href="classpugi_1_1xpath__node__set.html#6c6899c8ecfbce9e42ec85540907080e">pugi::xpath_node_set::type_t</a> </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Collection type.
+<p>
+<dl compact><dt><b>Enumerator: </b></dt><dd>
+<table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" name="6c6899c8ecfbce9e42ec85540907080e7636fa164710ab9b069850ea3b3e4924"></a><!-- doxytag: member="type_unsorted" ref="6c6899c8ecfbce9e42ec85540907080e7636fa164710ab9b069850ea3b3e4924" args="" -->type_unsorted</em>&nbsp;</td><td>
+Not ordered. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="6c6899c8ecfbce9e42ec85540907080e9d5ce5e6194ac2003da0d86d9af87437"></a><!-- doxytag: member="type_sorted" ref="6c6899c8ecfbce9e42ec85540907080e9d5ce5e6194ac2003da0d86d9af87437" args="" -->type_sorted</em>&nbsp;</td><td>
+Sorted by document order (ascending). </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="6c6899c8ecfbce9e42ec85540907080e7035df3be16759292de59850d6c0b9be"></a><!-- doxytag: member="type_sorted_reverse" ref="6c6899c8ecfbce9e42ec85540907080e7035df3be16759292de59850d6c0b9be" args="" -->type_sorted_reverse</em>&nbsp;</td><td>
+Sorted by document order (descending). </td></tr>
+</table>
+</dl>
+ </td>
+ </tr>
+</table>
+<hr><h2>Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" name="59f1f078606bb6c4f1a081bb82bcf901"></a><!-- doxytag: member="pugi::xpath_node_set::xpath_node_set" ref="59f1f078606bb6c4f1a081bb82bcf901" args="(const xpath_node_set &amp;ns)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">pugi::xpath_node_set::xpath_node_set </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const <a class="el" href="classpugi_1_1xpath__node__set.html">xpath_node_set</a> &amp;&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>ns</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Copy ctor.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>ns</em>&nbsp;</td><td>- set to copy </td></tr>
+ </table>
+</dl>
+ </td>
+ </tr>
+</table>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="2dda399273322331ad99409319baa75a"></a><!-- doxytag: member="pugi::xpath_node_set::operator=" ref="2dda399273322331ad99409319baa75a" args="(const xpath_node_set &amp;ns)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xpath__node__set.html">xpath_node_set</a>&amp; pugi::xpath_node_set::operator= </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const <a class="el" href="classpugi_1_1xpath__node__set.html">xpath_node_set</a> &amp;&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>ns</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Assignment operator.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>ns</em>&nbsp;</td><td>- set to assign </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>self </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="42a943e60d5809620f0d77809bef122c"></a><!-- doxytag: member="pugi::xpath_node_set::type" ref="42a943e60d5809620f0d77809bef122c" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xpath__node__set.html#6c6899c8ecfbce9e42ec85540907080e">type_t</a> pugi::xpath_node_set::type </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Get collection type.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>collection type </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="2d8be3dbf5d38d3fb4ee04daed4d72a7"></a><!-- doxytag: member="pugi::xpath_node_set::size" ref="2d8be3dbf5d38d3fb4ee04daed4d72a7" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">size_t pugi::xpath_node_set::size </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Get collection size.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>collection size </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="cf8a0a6e24b502941f5f182c44e14587"></a><!-- doxytag: member="pugi::xpath_node_set::begin" ref="cf8a0a6e24b502941f5f182c44e14587" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xpath__node.html">const_iterator</a> pugi::xpath_node_set::begin </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Get begin constant iterator for collection.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>begin constant iterator </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="0252547cd7016f105598d649ec4ff0b1"></a><!-- doxytag: member="pugi::xpath_node_set::end" ref="0252547cd7016f105598d649ec4ff0b1" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xpath__node.html">const_iterator</a> pugi::xpath_node_set::end </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Get end iterator for collection.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>end iterator </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="53b4915362d3c73100d3b73ac40ab8f2"></a><!-- doxytag: member="pugi::xpath_node_set::sort" ref="53b4915362d3c73100d3b73ac40ab8f2" args="(bool reverse=false)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">void pugi::xpath_node_set::sort </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">bool&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>reverse</em> = <code>false</code> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Sort the collection in ascending/descending order by document order.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>reverse</em>&nbsp;</td><td>- whether to sort in ascending (false) or descending (true) order </td></tr>
+ </table>
+</dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="e786ac9ff330b2dbd7b4da2d8d55b61a"></a><!-- doxytag: member="pugi::xpath_node_set::first" ref="e786ac9ff330b2dbd7b4da2d8d55b61a" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xpath__node.html">xpath_node</a> pugi::xpath_node_set::first </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Get first node in the collection by document order.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>first node by document order </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="8c6ade2a234af974edb4df861e30ca14"></a><!-- doxytag: member="pugi::xpath_node_set::empty" ref="8c6ade2a234af974edb4df861e30ca14" args="() const " --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">bool pugi::xpath_node_set::empty </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap> const</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Return true if collection is empty.
+<p>
+<dl compact><dt><b>Returns:</b></dt><dd>true if collection is empty, false otherwise </dd></dl>
+ </td>
+ </tr>
+</table>
+<hr size="1"><address style="align: right;"><small>Generated on Wed Feb 21 22:19:52 2007 for pugixml by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6-NO </small></address>
+</body>
+</html>
diff --git a/docs/html/classpugi_1_1xpath__node__set__coll__graph.map b/docs/html/classpugi_1_1xpath__node__set__coll__graph.map
new file mode 100644
index 0000000..6f67906
--- /dev/null
+++ b/docs/html/classpugi_1_1xpath__node__set__coll__graph.map
@@ -0,0 +1,4 @@
+base referer
+rect $classpugi_1_1xpath__node.html 82,189 207,216
+rect $classpugi_1_1xml__node.html 25,98 137,125
+rect $classpugi_1_1xml__attribute.html 166,98 299,125
diff --git a/docs/html/classpugi_1_1xpath__node__set__coll__graph.md5 b/docs/html/classpugi_1_1xpath__node__set__coll__graph.md5
new file mode 100644
index 0000000..f36e93e
--- /dev/null
+++ b/docs/html/classpugi_1_1xpath__node__set__coll__graph.md5
@@ -0,0 +1 @@
+dae803c90d7e38f8b78eec2188afc6b8 \ No newline at end of file
diff --git a/docs/html/classpugi_1_1xpath__node__set__coll__graph.png b/docs/html/classpugi_1_1xpath__node__set__coll__graph.png
new file mode 100644
index 0000000..81c6982
--- /dev/null
+++ b/docs/html/classpugi_1_1xpath__node__set__coll__graph.png
Binary files differ
diff --git a/docs/html/classpugi_1_1xpath__query-members.html b/docs/html/classpugi_1_1xpath__query-members.html
new file mode 100644
index 0000000..5edc682
--- /dev/null
+++ b/docs/html/classpugi_1_1xpath__query-members.html
@@ -0,0 +1,31 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pugixml: Member List</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6-NO -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul></div>
+<h1>pugi::xpath_query Member List</h1>This is the complete list of members for <a class="el" href="classpugi_1_1xpath__query.html">pugi::xpath_query</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xpath__query.html#0b6e208704f8aec7130fdde78f526c9f">evaluate_boolean</a>(const xml_node &amp;n)</td><td><a class="el" href="classpugi_1_1xpath__query.html">pugi::xpath_query</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xpath__query.html#6d3db9ec25068ca3efccb5126de6b28d">evaluate_node_set</a>(const xml_node &amp;n)</td><td><a class="el" href="classpugi_1_1xpath__query.html">pugi::xpath_query</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xpath__query.html#0e04ba6218d5af799aca3c9a5921fde1">evaluate_number</a>(const xml_node &amp;n)</td><td><a class="el" href="classpugi_1_1xpath__query.html">pugi::xpath_query</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xpath__query.html#0327ba2d1a1dddac08f18d400856dafc">evaluate_string</a>(const xml_node &amp;n)</td><td><a class="el" href="classpugi_1_1xpath__query.html">pugi::xpath_query</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xpath__query.html#df3ce6efc17c1b58a1ff60bedb632140">xpath_query</a>(const char *query)</td><td><a class="el" href="classpugi_1_1xpath__query.html">pugi::xpath_query</a></td><td><code> [explicit]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="classpugi_1_1xpath__query.html#0ca09e7de62e46feb64d03995f389da3">~xpath_query</a>()</td><td><a class="el" href="classpugi_1_1xpath__query.html">pugi::xpath_query</a></td><td></td></tr>
+</table><hr size="1"><address style="align: right;"><small>Generated on Wed Feb 21 22:19:50 2007 for pugixml by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6-NO </small></address>
+</body>
+</html>
diff --git a/docs/html/classpugi_1_1xpath__query.html b/docs/html/classpugi_1_1xpath__query.html
new file mode 100644
index 0000000..a55cb0d
--- /dev/null
+++ b/docs/html/classpugi_1_1xpath__query.html
@@ -0,0 +1,239 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pugixml: pugi::xpath_query Class Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6-NO -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul></div>
+<div class="nav">
+<a class="el" href="namespacepugi.html">pugi</a>::<a class="el" href="classpugi_1_1xpath__query.html">xpath_query</a></div>
+<h1>pugi::xpath_query Class Reference</h1><!-- doxytag: class="pugi::xpath_query" -->Collaboration diagram for pugi::xpath_query:<p><center><img src="classpugi_1_1xpath__query__coll__graph.png" border="0" usemap="#pugi_1_1xpath__query__coll__map" alt="Collaboration graph"></center>
+<center><font size="2">[<a href="graph_legend.html">legend</a>]</font></center><a href="classpugi_1_1xpath__query-members.html">List of all members.</a><hr><a name="_details"></a><h2>Detailed Description</h2>
+A class that holds compiled XPath query and allows to evaluate query result.
+<p>
+<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xpath__query.html#df3ce6efc17c1b58a1ff60bedb632140">xpath_query</a> (const char *query)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Ctor from string with XPath expression. <a href="#df3ce6efc17c1b58a1ff60bedb632140"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0ca09e7de62e46feb64d03995f389da3"></a><!-- doxytag: member="pugi::xpath_query::~xpath_query" ref="0ca09e7de62e46feb64d03995f389da3" args="()" -->
+&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xpath__query.html#0ca09e7de62e46feb64d03995f389da3">~xpath_query</a> ()</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Dtor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xpath__query.html#0b6e208704f8aec7130fdde78f526c9f">evaluate_boolean</a> (const <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;n)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Evaluate expression as boolean value for the context node <em>n</em>. <a href="#0b6e208704f8aec7130fdde78f526c9f"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">double&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xpath__query.html#0e04ba6218d5af799aca3c9a5921fde1">evaluate_number</a> (const <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;n)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Evaluate expression as double value for the context node <em>n</em>. <a href="#0e04ba6218d5af799aca3c9a5921fde1"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">std::string&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xpath__query.html#0327ba2d1a1dddac08f18d400856dafc">evaluate_string</a> (const <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;n)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Evaluate expression as string value for the context node <em>n</em>. <a href="#0327ba2d1a1dddac08f18d400856dafc"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classpugi_1_1xpath__node__set.html">xpath_node_set</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xpath__query.html#6d3db9ec25068ca3efccb5126de6b28d">evaluate_node_set</a> (const <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;n)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Evaluate expression as node set for the context node <em>n</em>. <a href="#6d3db9ec25068ca3efccb5126de6b28d"></a><br></td></tr>
+</table>
+<hr><h2>Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" name="df3ce6efc17c1b58a1ff60bedb632140"></a><!-- doxytag: member="pugi::xpath_query::xpath_query" ref="df3ce6efc17c1b58a1ff60bedb632140" args="(const char *query)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">pugi::xpath_query::xpath_query </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const char *&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>query</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap><code> [explicit]</code></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Ctor from string with XPath expression.
+<p>
+Throws <a class="el" href="classpugi_1_1xpath__exception.html">xpath_exception</a> on compilation error, std::bad_alloc on out of memory error.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>query</em>&nbsp;</td><td>- string with XPath expression </td></tr>
+ </table>
+</dl>
+ </td>
+ </tr>
+</table>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="0b6e208704f8aec7130fdde78f526c9f"></a><!-- doxytag: member="pugi::xpath_query::evaluate_boolean" ref="0b6e208704f8aec7130fdde78f526c9f" args="(const xml_node &amp;n)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">bool pugi::xpath_query::evaluate_boolean </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>n</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Evaluate expression as boolean value for the context node <em>n</em>.
+<p>
+If expression does not directly evaluate to boolean, the expression result is converted as through boolean() XPath function call. Throws std::bad_alloc on out of memory error.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>n</em>&nbsp;</td><td>- context node </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>evaluation result </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="0e04ba6218d5af799aca3c9a5921fde1"></a><!-- doxytag: member="pugi::xpath_query::evaluate_number" ref="0e04ba6218d5af799aca3c9a5921fde1" args="(const xml_node &amp;n)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">double pugi::xpath_query::evaluate_number </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>n</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Evaluate expression as double value for the context node <em>n</em>.
+<p>
+If expression does not directly evaluate to double, the expression result is converted as through number() XPath function call. Throws std::bad_alloc on out of memory error.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>n</em>&nbsp;</td><td>- context node </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>evaluation result </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="0327ba2d1a1dddac08f18d400856dafc"></a><!-- doxytag: member="pugi::xpath_query::evaluate_string" ref="0327ba2d1a1dddac08f18d400856dafc" args="(const xml_node &amp;n)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">std::string pugi::xpath_query::evaluate_string </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>n</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Evaluate expression as string value for the context node <em>n</em>.
+<p>
+If expression does not directly evaluate to string, the expression result is converted as through string() XPath function call. Throws std::bad_alloc on out of memory error.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>n</em>&nbsp;</td><td>- context node </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>evaluation result </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="6d3db9ec25068ca3efccb5126de6b28d"></a><!-- doxytag: member="pugi::xpath_query::evaluate_node_set" ref="6d3db9ec25068ca3efccb5126de6b28d" args="(const xml_node &amp;n)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el" href="classpugi_1_1xpath__node__set.html">xpath_node_set</a> pugi::xpath_query::evaluate_node_set </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const <a class="el" href="classpugi_1_1xml__node.html">xml_node</a> &amp;&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>n</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Evaluate expression as node set for the context node <em>n</em>.
+<p>
+If expression does not directly evaluate to node set, function returns empty node set. Throws std::bad_alloc on out of memory error.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>n</em>&nbsp;</td><td>- context node </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>evaluation result </dd></dl>
+ </td>
+ </tr>
+</table>
+<hr size="1"><address style="align: right;"><small>Generated on Wed Feb 21 22:19:50 2007 for pugixml by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6-NO </small></address>
+</body>
+</html>
diff --git a/docs/html/classpugi_1_1xpath__query__coll__graph.map b/docs/html/classpugi_1_1xpath__query__coll__graph.map
new file mode 100644
index 0000000..5a14779
--- /dev/null
+++ b/docs/html/classpugi_1_1xpath__query__coll__graph.map
@@ -0,0 +1 @@
+base referer
diff --git a/docs/html/classpugi_1_1xpath__query__coll__graph.md5 b/docs/html/classpugi_1_1xpath__query__coll__graph.md5
new file mode 100644
index 0000000..f1a2247
--- /dev/null
+++ b/docs/html/classpugi_1_1xpath__query__coll__graph.md5
@@ -0,0 +1 @@
+8954c6e562b8b9c0f96734834320e6c2 \ No newline at end of file
diff --git a/docs/html/classpugi_1_1xpath__query__coll__graph.png b/docs/html/classpugi_1_1xpath__query__coll__graph.png
new file mode 100644
index 0000000..f7b3e06
--- /dev/null
+++ b/docs/html/classpugi_1_1xpath__query__coll__graph.png
Binary files differ
diff --git a/docs/html/doxygen.css b/docs/html/doxygen.css
new file mode 100644
index 0000000..05615b2
--- /dev/null
+++ b/docs/html/doxygen.css
@@ -0,0 +1,310 @@
+BODY,H1,H2,H3,H4,H5,H6,P,CENTER,TD,TH,UL,DL,DIV {
+ font-family: Geneva, Arial, Helvetica, sans-serif;
+}
+BODY,TD {
+ font-size: 90%;
+}
+H1 {
+ text-align: center;
+ font-size: 160%;
+}
+H2 {
+ font-size: 120%;
+}
+H3 {
+ font-size: 100%;
+}
+CAPTION { font-weight: bold }
+DIV.qindex {
+ width: 100%;
+ background-color: #e8eef2;
+ border: 1px solid #84b0c7;
+ text-align: center;
+ margin: 2px;
+ padding: 2px;
+ line-height: 140%;
+}
+DIV.nav {
+ width: 100%;
+ background-color: #e8eef2;
+ border: 1px solid #84b0c7;
+ text-align: center;
+ margin: 2px;
+ padding: 2px;
+ line-height: 140%;
+}
+DIV.navtab {
+ background-color: #e8eef2;
+ border: 1px solid #84b0c7;
+ text-align: center;
+ margin: 2px;
+ margin-right: 15px;
+ padding: 2px;
+}
+TD.navtab {
+ font-size: 70%;
+}
+A.qindex {
+ text-decoration: none;
+ font-weight: bold;
+ color: #1A419D;
+}
+A.qindex:visited {
+ text-decoration: none;
+ font-weight: bold;
+ color: #1A419D
+}
+A.qindex:hover {
+ text-decoration: none;
+ background-color: #ddddff;
+}
+A.qindexHL {
+ text-decoration: none;
+ font-weight: bold;
+ background-color: #6666cc;
+ color: #ffffff;
+ border: 1px double #9295C2;
+}
+A.qindexHL:hover {
+ text-decoration: none;
+ background-color: #6666cc;
+ color: #ffffff;
+}
+A.qindexHL:visited { text-decoration: none; background-color: #6666cc; color: #ffffff }
+A.el { text-decoration: none; font-weight: bold }
+A.elRef { font-weight: bold }
+A.code:link { text-decoration: none; font-weight: normal; color: #0000FF}
+A.code:visited { text-decoration: none; font-weight: normal; color: #0000FF}
+A.codeRef:link { font-weight: normal; color: #0000FF}
+A.codeRef:visited { font-weight: normal; color: #0000FF}
+A:hover { text-decoration: none; background-color: #f2f2ff }
+DL.el { margin-left: -1cm }
+.fragment {
+ font-family: Fixed, monospace;
+ font-size: 95%;
+}
+PRE.fragment {
+ border: 1px solid #CCCCCC;
+ background-color: #f5f5f5;
+ margin-top: 4px;
+ margin-bottom: 4px;
+ margin-left: 2px;
+ margin-right: 8px;
+ padding-left: 6px;
+ padding-right: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+DIV.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px }
+TD.md { background-color: #F4F4FB; font-weight: bold; }
+TD.mdPrefix {
+ background-color: #F4F4FB;
+ color: #606060;
+ font-size: 80%;
+}
+TD.mdname1 { background-color: #F4F4FB; font-weight: bold; color: #602020; }
+TD.mdname { background-color: #F4F4FB; font-weight: bold; color: #602020; width: 600px; }
+DIV.groupHeader {
+ margin-left: 16px;
+ margin-top: 12px;
+ margin-bottom: 6px;
+ font-weight: bold;
+}
+DIV.groupText { margin-left: 16px; font-style: italic; font-size: 90% }
+BODY {
+ background: white;
+ color: black;
+ margin-right: 20px;
+ margin-left: 20px;
+}
+TD.indexkey {
+ background-color: #e8eef2;
+ font-weight: bold;
+ padding-right : 10px;
+ padding-top : 2px;
+ padding-left : 10px;
+ padding-bottom : 2px;
+ margin-left : 0px;
+ margin-right : 0px;
+ margin-top : 2px;
+ margin-bottom : 2px;
+ border: 1px solid #CCCCCC;
+}
+TD.indexvalue {
+ background-color: #e8eef2;
+ font-style: italic;
+ padding-right : 10px;
+ padding-top : 2px;
+ padding-left : 10px;
+ padding-bottom : 2px;
+ margin-left : 0px;
+ margin-right : 0px;
+ margin-top : 2px;
+ margin-bottom : 2px;
+ border: 1px solid #CCCCCC;
+}
+TR.memlist {
+ background-color: #f0f0f0;
+}
+P.formulaDsp { text-align: center; }
+IMG.formulaDsp { }
+IMG.formulaInl { vertical-align: middle; }
+SPAN.keyword { color: #008000 }
+SPAN.keywordtype { color: #604020 }
+SPAN.keywordflow { color: #e08000 }
+SPAN.comment { color: #800000 }
+SPAN.preprocessor { color: #806020 }
+SPAN.stringliteral { color: #002080 }
+SPAN.charliteral { color: #008080 }
+.mdTable {
+ border: 1px solid #868686;
+ background-color: #F4F4FB;
+}
+.mdRow {
+ padding: 8px 10px;
+}
+.mdescLeft {
+ padding: 0px 8px 4px 8px;
+ font-size: 80%;
+ font-style: italic;
+ background-color: #FAFAFA;
+ border-top: 1px none #E0E0E0;
+ border-right: 1px none #E0E0E0;
+ border-bottom: 1px none #E0E0E0;
+ border-left: 1px none #E0E0E0;
+ margin: 0px;
+}
+.mdescRight {
+ padding: 0px 8px 4px 8px;
+ font-size: 80%;
+ font-style: italic;
+ background-color: #FAFAFA;
+ border-top: 1px none #E0E0E0;
+ border-right: 1px none #E0E0E0;
+ border-bottom: 1px none #E0E0E0;
+ border-left: 1px none #E0E0E0;
+ margin: 0px;
+}
+.memItemLeft {
+ padding: 1px 0px 0px 8px;
+ margin: 4px;
+ border-top-width: 1px;
+ border-right-width: 1px;
+ border-bottom-width: 1px;
+ border-left-width: 1px;
+ border-top-color: #E0E0E0;
+ border-right-color: #E0E0E0;
+ border-bottom-color: #E0E0E0;
+ border-left-color: #E0E0E0;
+ border-top-style: solid;
+ border-right-style: none;
+ border-bottom-style: none;
+ border-left-style: none;
+ background-color: #FAFAFA;
+ font-size: 80%;
+}
+.memItemRight {
+ padding: 1px 8px 0px 8px;
+ margin: 4px;
+ border-top-width: 1px;
+ border-right-width: 1px;
+ border-bottom-width: 1px;
+ border-left-width: 1px;
+ border-top-color: #E0E0E0;
+ border-right-color: #E0E0E0;
+ border-bottom-color: #E0E0E0;
+ border-left-color: #E0E0E0;
+ border-top-style: solid;
+ border-right-style: none;
+ border-bottom-style: none;
+ border-left-style: none;
+ background-color: #FAFAFA;
+ font-size: 80%;
+}
+.memTemplItemLeft {
+ padding: 1px 0px 0px 8px;
+ margin: 4px;
+ border-top-width: 1px;
+ border-right-width: 1px;
+ border-bottom-width: 1px;
+ border-left-width: 1px;
+ border-top-color: #E0E0E0;
+ border-right-color: #E0E0E0;
+ border-bottom-color: #E0E0E0;
+ border-left-color: #E0E0E0;
+ border-top-style: none;
+ border-right-style: none;
+ border-bottom-style: none;
+ border-left-style: none;
+ background-color: #FAFAFA;
+ font-size: 80%;
+}
+.memTemplItemRight {
+ padding: 1px 8px 0px 8px;
+ margin: 4px;
+ border-top-width: 1px;
+ border-right-width: 1px;
+ border-bottom-width: 1px;
+ border-left-width: 1px;
+ border-top-color: #E0E0E0;
+ border-right-color: #E0E0E0;
+ border-bottom-color: #E0E0E0;
+ border-left-color: #E0E0E0;
+ border-top-style: none;
+ border-right-style: none;
+ border-bottom-style: none;
+ border-left-style: none;
+ background-color: #FAFAFA;
+ font-size: 80%;
+}
+.memTemplParams {
+ padding: 1px 0px 0px 8px;
+ margin: 4px;
+ border-top-width: 1px;
+ border-right-width: 1px;
+ border-bottom-width: 1px;
+ border-left-width: 1px;
+ border-top-color: #E0E0E0;
+ border-right-color: #E0E0E0;
+ border-bottom-color: #E0E0E0;
+ border-left-color: #E0E0E0;
+ border-top-style: solid;
+ border-right-style: none;
+ border-bottom-style: none;
+ border-left-style: none;
+ color: #606060;
+ background-color: #FAFAFA;
+ font-size: 80%;
+}
+.search { color: #003399;
+ font-weight: bold;
+}
+FORM.search {
+ margin-bottom: 0px;
+ margin-top: 0px;
+}
+INPUT.search { font-size: 75%;
+ color: #000080;
+ font-weight: normal;
+ background-color: #e8eef2;
+}
+TD.tiny { font-size: 75%;
+}
+a {
+ color: #1A41A8;
+}
+a:visited {
+ color: #2A3798;
+}
+.dirtab { padding: 4px;
+ border-collapse: collapse;
+ border: 1px solid #84b0c7;
+}
+TH.dirtab { background: #e8eef2;
+ font-weight: bold;
+}
+HR { height: 1px;
+ border: none;
+ border-top: 1px solid black;
+}
+
diff --git a/docs/html/doxygen.png b/docs/html/doxygen.png
new file mode 100644
index 0000000..f0a274b
--- /dev/null
+++ b/docs/html/doxygen.png
Binary files differ
diff --git a/docs/html/functions.html b/docs/html/functions.html
new file mode 100644
index 0000000..7870ea7
--- /dev/null
+++ b/docs/html/functions.html
@@ -0,0 +1,195 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pugixml: Class Members</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6-NO -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+ <li id="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li id="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_type.html"><span>Typedefs</span></a></li>
+ <li><a href="functions_enum.html"><span>Enumerations</span></a></li>
+ <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+ </ul>
+</div>
+<div class="tabs">
+ <ul>
+ <li><a href="#index_a"><span>a</span></a></li>
+ <li><a href="#index_b"><span>b</span></a></li>
+ <li><a href="#index_c"><span>c</span></a></li>
+ <li><a href="#index_d"><span>d</span></a></li>
+ <li><a href="#index_e"><span>e</span></a></li>
+ <li><a href="#index_f"><span>f</span></a></li>
+ <li><a href="#index_i"><span>i</span></a></li>
+ <li><a href="#index_l"><span>l</span></a></li>
+ <li><a href="#index_n"><span>n</span></a></li>
+ <li><a href="#index_o"><span>o</span></a></li>
+ <li><a href="#index_p"><span>p</span></a></li>
+ <li><a href="#index_r"><span>r</span></a></li>
+ <li><a href="#index_s"><span>s</span></a></li>
+ <li><a href="#index_t"><span>t</span></a></li>
+ <li><a href="#index_v"><span>v</span></a></li>
+ <li><a href="#index_w"><span>w</span></a></li>
+ <li><a href="#index_x"><span>x</span></a></li>
+ <li><a href="#index_~"><span>~</span></a></li>
+ </ul>
+</div>
+
+<p>
+Here is a list of all documented class members with links to the class documentation for each member:
+<p>
+<h3><a class="anchor" name="index_a">- a -</a></h3><ul>
+<li>all_elements_by_name()
+: <a class="el" href="classpugi_1_1xml__node.html#21a123c51fa592b6f2ceb2e22411edd9">pugi::xml_node</a><li>all_elements_by_name_w()
+: <a class="el" href="classpugi_1_1xml__node.html#90347629066ca2eedeaee4d5d4038fe7">pugi::xml_node</a><li>append_attribute()
+: <a class="el" href="classpugi_1_1xml__node.html#645c4d7283f755a7b25839667a5fd9c7">pugi::xml_node</a><li>append_child()
+: <a class="el" href="classpugi_1_1xml__node.html#498e41f14a04014eaf5d6af3ae8f9d99">pugi::xml_node</a><li>as_bool()
+: <a class="el" href="classpugi_1_1xml__attribute.html#f512177dd662f69c4259bc15312c54f0">pugi::xml_attribute</a><li>as_double()
+: <a class="el" href="classpugi_1_1xml__attribute.html#e3bdc34a10c904a95c066b49249e75bd">pugi::xml_attribute</a><li>as_float()
+: <a class="el" href="classpugi_1_1xml__attribute.html#6de96400d33e382db1c30dba9302604c">pugi::xml_attribute</a><li>as_int()
+: <a class="el" href="classpugi_1_1xml__attribute.html#9f11964a8cef05be2c3410fc5da69064">pugi::xml_attribute</a><li>attribute()
+: <a class="el" href="classpugi_1_1xpath__node.html#1d4b104aa945a3364dd45f8d6a9f7031">pugi::xpath_node</a>, <a class="el" href="classpugi_1_1xml__node.html#974b051c270013d889d57cda2e8af669">pugi::xml_node</a><li>attribute_iterator
+: <a class="el" href="classpugi_1_1xml__node.html#9084f97350ffc64af1eaf7c17c57f4ba">pugi::xml_node</a><li>attribute_w()
+: <a class="el" href="classpugi_1_1xml__node.html#690982cdfd2c6181e1118d8238d64a54">pugi::xml_node</a><li>attributes_begin()
+: <a class="el" href="classpugi_1_1xml__node.html#b62a944c00d7ed00519e83c23bed0675">pugi::xml_node</a><li>attributes_end()
+: <a class="el" href="classpugi_1_1xml__node.html#3dffd0eff455030c2075451327403beb">pugi::xml_node</a></ul>
+<h3><a class="anchor" name="index_b">- b -</a></h3><ul>
+<li>begin()
+: <a class="el" href="classpugi_1_1xpath__node__set.html#cf8a0a6e24b502941f5f182c44e14587">pugi::xpath_node_set</a>, <a class="el" href="classpugi_1_1xml__tree__walker.html#118c8c5a323745053ae52dc0e1276a9b">pugi::xml_tree_walker</a>, <a class="el" href="classpugi_1_1xml__node.html#af4acdf745dfb4b01e3f144ed314d28a">pugi::xml_node</a></ul>
+<h3><a class="anchor" name="index_c">- c -</a></h3><ul>
+<li>child()
+: <a class="el" href="classpugi_1_1xml__node.html#eecbadd7bdc18c503064f7c47efe067a">pugi::xml_node</a><li>child_value()
+: <a class="el" href="classpugi_1_1xml__node.html#be85f5f7160c0b314691d4a45fb61151">pugi::xml_node</a><li>child_value_w()
+: <a class="el" href="classpugi_1_1xml__node.html#441dfaf2aa8435154674cae81e5fb77c">pugi::xml_node</a><li>child_w()
+: <a class="el" href="classpugi_1_1xml__node.html#961024c2c8424a01a8528c96f520c05f">pugi::xml_node</a><li>const_iterator
+: <a class="el" href="classpugi_1_1xpath__node__set.html#6987510e88cea4a396d186285c174de6">pugi::xpath_node_set</a></ul>
+<h3><a class="anchor" name="index_d">- d -</a></h3><ul>
+<li>depth()
+: <a class="el" href="classpugi_1_1xml__tree__walker.html#45420eb7809aae9d35feaca33835dbe2">pugi::xml_tree_walker</a></ul>
+<h3><a class="anchor" name="index_e">- e -</a></h3><ul>
+<li>empty()
+: <a class="el" href="classpugi_1_1xpath__node__set.html#8c6ade2a234af974edb4df861e30ca14">pugi::xpath_node_set</a>, <a class="el" href="classpugi_1_1xml__node.html#3516f879718f3ea1782a0324cb31f798">pugi::xml_node</a>, <a class="el" href="classpugi_1_1xml__attribute.html#5578d661daebb2188ea8856805e6be2f">pugi::xml_attribute</a><li>end()
+: <a class="el" href="classpugi_1_1xpath__node__set.html#0252547cd7016f105598d649ec4ff0b1">pugi::xpath_node_set</a>, <a class="el" href="classpugi_1_1xml__tree__walker.html#19c4f587afbd022959d81c6bf129a8fd">pugi::xml_tree_walker</a>, <a class="el" href="classpugi_1_1xml__node.html#1cfc6360de985d724812f67650892658">pugi::xml_node</a><li>evaluate_boolean()
+: <a class="el" href="classpugi_1_1xpath__query.html#0b6e208704f8aec7130fdde78f526c9f">pugi::xpath_query</a><li>evaluate_node_set()
+: <a class="el" href="classpugi_1_1xpath__query.html#6d3db9ec25068ca3efccb5126de6b28d">pugi::xpath_query</a><li>evaluate_number()
+: <a class="el" href="classpugi_1_1xpath__query.html#0e04ba6218d5af799aca3c9a5921fde1">pugi::xpath_query</a><li>evaluate_string()
+: <a class="el" href="classpugi_1_1xpath__query.html#0327ba2d1a1dddac08f18d400856dafc">pugi::xpath_query</a></ul>
+<h3><a class="anchor" name="index_f">- f -</a></h3><ul>
+<li>find_attribute()
+: <a class="el" href="classpugi_1_1xml__node.html#6b921b19dbf2c792daaf46544df44fb6">pugi::xml_node</a><li>find_child()
+: <a class="el" href="classpugi_1_1xml__node.html#132ca635cc0ab99180be0ffcc156a616">pugi::xml_node</a><li>find_node()
+: <a class="el" href="classpugi_1_1xml__node.html#f3a5796f1c99df52244f3c73f5c03d8e">pugi::xml_node</a><li>first()
+: <a class="el" href="classpugi_1_1xpath__node__set.html#e786ac9ff330b2dbd7b4da2d8d55b61a">pugi::xpath_node_set</a><li>first_attribute()
+: <a class="el" href="classpugi_1_1xml__node.html#aae0bdb0c69fb895f66b239720d5d2d0">pugi::xml_node</a><li>first_child()
+: <a class="el" href="classpugi_1_1xml__node.html#da6e0ce4318d7f72f8b037e39433b298">pugi::xml_node</a><li>first_element_by_path()
+: <a class="el" href="classpugi_1_1xml__node.html#4be3a6da6307a33954fbdc5f210de209">pugi::xml_node</a><li>for_each()
+: <a class="el" href="classpugi_1_1xml__tree__walker.html#caf3a12a8cfdd55ef421ad045dfef764">pugi::xml_tree_walker</a></ul>
+<h3><a class="anchor" name="index_i">- i -</a></h3><ul>
+<li>insert_attribute_after()
+: <a class="el" href="classpugi_1_1xml__node.html#395ce9c52840edead28b50a7a69565ab">pugi::xml_node</a><li>insert_attribute_before()
+: <a class="el" href="classpugi_1_1xml__node.html#36cfed4439fba1f140d89e351c2bb552">pugi::xml_node</a><li>insert_child_after()
+: <a class="el" href="classpugi_1_1xml__node.html#fb2c70e3908e65b001dcd9bcf794d605">pugi::xml_node</a><li>insert_child_before()
+: <a class="el" href="classpugi_1_1xml__node.html#a07c23d9835e8174fbe75f0c9a0c7d7b">pugi::xml_node</a><li>iterator
+: <a class="el" href="classpugi_1_1xml__node.html#e053ea39add5a64de584f7a81212e388">pugi::xml_node</a></ul>
+<h3><a class="anchor" name="index_l">- l -</a></h3><ul>
+<li>last_attribute()
+: <a class="el" href="classpugi_1_1xml__node.html#3e93125923e0b195de4369d50776ecc6">pugi::xml_node</a><li>last_child()
+: <a class="el" href="classpugi_1_1xml__node.html#b92290e7dbc9292e4ff5d6949bd02e01">pugi::xml_node</a><li>load()
+: <a class="el" href="classpugi_1_1xml__document.html#77501ece75c709bfb4e479d7cf5f92e3">pugi::xml_document</a><li>load_file()
+: <a class="el" href="classpugi_1_1xml__document.html#0362034d3715646568869514dbf8f419">pugi::xml_document</a></ul>
+<h3><a class="anchor" name="index_n">- n -</a></h3><ul>
+<li>name()
+: <a class="el" href="classpugi_1_1xml__node.html#1f0c8b4652edc55e4f46ced685ae60f4">pugi::xml_node</a>, <a class="el" href="classpugi_1_1xml__attribute.html#b28b196c03b0a10f7c113ba6694a4cd0">pugi::xml_attribute</a><li>next_attribute()
+: <a class="el" href="classpugi_1_1xml__attribute.html#37ac446a8892430783382d0e40396d6b">pugi::xml_attribute</a><li>next_sibling()
+: <a class="el" href="classpugi_1_1xml__node.html#1d0d1e460eff5305e6bf50d9f65a58bc">pugi::xml_node</a><li>next_sibling_w()
+: <a class="el" href="classpugi_1_1xml__node.html#3154a0d481e54bbde8f01edd1901698c">pugi::xml_node</a><li>node()
+: <a class="el" href="classpugi_1_1xpath__node.html#733aedafcaac5d4c0f18cfd2e2fac8d5">pugi::xpath_node</a></ul>
+<h3><a class="anchor" name="index_o">- o -</a></h3><ul>
+<li>operator *()
+: <a class="el" href="classpugi_1_1xml__attribute__iterator.html#ef0da918a50b53390faef17f6c81ce58">pugi::xml_attribute_iterator</a>, <a class="el" href="classpugi_1_1xml__node__iterator.html#eb7903145d612c84bae22e0aa103608f">pugi::xml_node_iterator</a><li>operator unspecified_bool_type()
+: <a class="el" href="classpugi_1_1xpath__node.html#4993b929cb8ae5c8a759788e0c5d199c">pugi::xpath_node</a>, <a class="el" href="classpugi_1_1xml__node.html#fa8c35f7bc0254101cf4979372deb52e">pugi::xml_node</a>, <a class="el" href="classpugi_1_1xml__attribute.html#176a1a482f838100f1147401f81de430">pugi::xml_attribute</a><li>operator!=()
+: <a class="el" href="classpugi_1_1xpath__node.html#1d681c030d20036dc89530a4d1fbea59">pugi::xpath_node</a>, <a class="el" href="classpugi_1_1xml__attribute__iterator.html#ff31d15fb408f567e8aaa03569865c87">pugi::xml_attribute_iterator</a>, <a class="el" href="classpugi_1_1xml__node__iterator.html#5905460cbc3433ff7edfa20ce02c11da">pugi::xml_node_iterator</a>, <a class="el" href="classpugi_1_1xml__node.html#7b5aeeff39fd31e5123ba5c23d6b8676">pugi::xml_node</a>, <a class="el" href="classpugi_1_1xml__attribute.html#3904027c125612776ad4bf834ad73761">pugi::xml_attribute</a><li>operator++()
+: <a class="el" href="classpugi_1_1xml__attribute__iterator.html#6b97c3b1a278c668240d7ab0b20d77ae">pugi::xml_attribute_iterator</a>, <a class="el" href="classpugi_1_1xml__node__iterator.html#da8f21676a3ac62b0dc98293b2baa257">pugi::xml_node_iterator</a><li>operator--()
+: <a class="el" href="classpugi_1_1xml__attribute__iterator.html#4b172ad267089d166221967c3b3a05ae">pugi::xml_attribute_iterator</a>, <a class="el" href="classpugi_1_1xml__node__iterator.html#88f5f1a39e84b6fcb1574eb5366092ba">pugi::xml_node_iterator</a><li>operator-&gt;()
+: <a class="el" href="classpugi_1_1xml__attribute__iterator.html#205b888a86103197a70f57860c4c2ae4">pugi::xml_attribute_iterator</a>, <a class="el" href="classpugi_1_1xml__node__iterator.html#7589cb0bc9ecf04b4553049ccd442fc6">pugi::xml_node_iterator</a><li>operator&lt;()
+: <a class="el" href="classpugi_1_1xml__node.html#8d7c1b506be1b2ee0dea7dca1f2e80d6">pugi::xml_node</a>, <a class="el" href="classpugi_1_1xml__attribute.html#8ae8a5e3fc967d42d9c830e4fbde0fe2">pugi::xml_attribute</a><li>operator&lt;=()
+: <a class="el" href="classpugi_1_1xml__node.html#a97cf42c013ec35eb76c5314cadb4e26">pugi::xml_node</a>, <a class="el" href="classpugi_1_1xml__attribute.html#4cf978e6d5bfc56952f9d5b4eebfe68e">pugi::xml_attribute</a><li>operator=()
+: <a class="el" href="classpugi_1_1xpath__node__set.html#2dda399273322331ad99409319baa75a">pugi::xpath_node_set</a>, <a class="el" href="classpugi_1_1xml__attribute.html#79df9ba6c6d7adc08ea5bb9d214a11e8">pugi::xml_attribute</a><li>operator==()
+: <a class="el" href="classpugi_1_1xpath__node.html#391f897a4be5b6c4a84b97bbbb680c63">pugi::xpath_node</a>, <a class="el" href="classpugi_1_1xml__attribute__iterator.html#6478076e6a12f5900992008311e42963">pugi::xml_attribute_iterator</a>, <a class="el" href="classpugi_1_1xml__node__iterator.html#d879ac5ca8ec10d5d9a6e24f978ffde1">pugi::xml_node_iterator</a>, <a class="el" href="classpugi_1_1xml__node.html#427236c4a20d1fa232bd2233f72c73be">pugi::xml_node</a>, <a class="el" href="classpugi_1_1xml__attribute.html#26431cc9dae292a7ae629138969e3824">pugi::xml_attribute</a><li>operator&gt;()
+: <a class="el" href="classpugi_1_1xml__node.html#04a82fd56f91edb82bf34cc409bdcf04">pugi::xml_node</a>, <a class="el" href="classpugi_1_1xml__attribute.html#be8436c6a7fb6a151bfc160989b0948a">pugi::xml_attribute</a><li>operator&gt;=()
+: <a class="el" href="classpugi_1_1xml__node.html#08e0c3feeb7909e6234a8fe7ccb07d7c">pugi::xml_node</a>, <a class="el" href="classpugi_1_1xml__attribute.html#6f52a1362f7f8564f75e39e35e87d4ef">pugi::xml_attribute</a></ul>
+<h3><a class="anchor" name="index_p">- p -</a></h3><ul>
+<li>parent()
+: <a class="el" href="classpugi_1_1xpath__node.html#7e293086926c36f781beb0f25629c614">pugi::xpath_node</a>, <a class="el" href="classpugi_1_1xml__node.html#aa4c19abe199d4eacae18f832deb4d70">pugi::xml_node</a><li>parse()
+: <a class="el" href="classpugi_1_1xml__document.html#2742c9acf467f0d3e2651c25bed76634">pugi::xml_document</a><li>path()
+: <a class="el" href="classpugi_1_1xml__node.html#9d5ed8a5d73d252e5786f034d277d504">pugi::xml_node</a><li>precompute_document_order()
+: <a class="el" href="classpugi_1_1xml__document.html#952fa74a00a02d64ab7600ac2c72fb4b">pugi::xml_document</a><li>previous_attribute()
+: <a class="el" href="classpugi_1_1xml__attribute.html#584444ba6bcb328cfa9cd5c6cf08ef7f">pugi::xml_attribute</a><li>previous_sibling()
+: <a class="el" href="classpugi_1_1xml__node.html#919305f60b3ac08432867cbc94f6e3da">pugi::xml_node</a><li>previous_sibling_w()
+: <a class="el" href="classpugi_1_1xml__node.html#f98f6bc32514761133fc01eec3c77a09">pugi::xml_node</a><li>print()
+: <a class="el" href="classpugi_1_1xml__node.html#8a0a9d086cc2e5c1f92cb79452695949">pugi::xml_node</a></ul>
+<h3><a class="anchor" name="index_r">- r -</a></h3><ul>
+<li>remove_attribute()
+: <a class="el" href="classpugi_1_1xml__node.html#177097ca7770e8d80350d15cc96a3dd9">pugi::xml_node</a><li>remove_child()
+: <a class="el" href="classpugi_1_1xml__node.html#023157bd57e3696c9f49f23944ac909f">pugi::xml_node</a><li>root()
+: <a class="el" href="classpugi_1_1xml__node.html#f7d6cc0124c07dbb192e779c375a7c16">pugi::xml_node</a></ul>
+<h3><a class="anchor" name="index_s">- s -</a></h3><ul>
+<li>save_file()
+: <a class="el" href="classpugi_1_1xml__document.html#716c23429fcac408ee1073353056485d">pugi::xml_document</a><li>select_nodes()
+: <a class="el" href="classpugi_1_1xml__node.html#041475ecea08aeab971707daefe0c3c7">pugi::xml_node</a><li>select_single_node()
+: <a class="el" href="classpugi_1_1xml__node.html#30e004e4939797a84da7916ea950ec33">pugi::xml_node</a><li>set_name()
+: <a class="el" href="classpugi_1_1xml__node.html#f81bf55a3f7b9d40ee8807ac1be93a86">pugi::xml_node</a>, <a class="el" href="classpugi_1_1xml__attribute.html#959bc0ffe307e16b1c19da6611005a3e">pugi::xml_attribute</a><li>set_value()
+: <a class="el" href="classpugi_1_1xml__node.html#afa7b8f3ffa652e5e279f79e04d22d4c">pugi::xml_node</a>, <a class="el" href="classpugi_1_1xml__attribute.html#2d4f2552eeb4a51a8126f228c03a400e">pugi::xml_attribute</a><li>size()
+: <a class="el" href="classpugi_1_1xpath__node__set.html#2d8be3dbf5d38d3fb4ee04daed4d72a7">pugi::xpath_node_set</a><li>sort()
+: <a class="el" href="classpugi_1_1xpath__node__set.html#53b4915362d3c73100d3b73ac40ab8f2">pugi::xpath_node_set</a></ul>
+<h3><a class="anchor" name="index_t">- t -</a></h3><ul>
+<li>traverse()
+: <a class="el" href="classpugi_1_1xml__node.html#41be22248598bdf1575ed8d7bdd77807">pugi::xml_node</a><li>type()
+: <a class="el" href="classpugi_1_1xpath__node__set.html#42a943e60d5809620f0d77809bef122c">pugi::xpath_node_set</a>, <a class="el" href="classpugi_1_1xml__node.html#28231e644bc70075286c75175a05d849">pugi::xml_node</a><li>type_sorted
+: <a class="el" href="classpugi_1_1xpath__node__set.html#6c6899c8ecfbce9e42ec85540907080e9d5ce5e6194ac2003da0d86d9af87437">pugi::xpath_node_set</a><li>type_sorted_reverse
+: <a class="el" href="classpugi_1_1xpath__node__set.html#6c6899c8ecfbce9e42ec85540907080e7035df3be16759292de59850d6c0b9be">pugi::xpath_node_set</a><li>type_t
+: <a class="el" href="classpugi_1_1xpath__node__set.html#6c6899c8ecfbce9e42ec85540907080e">pugi::xpath_node_set</a><li>type_unsorted
+: <a class="el" href="classpugi_1_1xpath__node__set.html#6c6899c8ecfbce9e42ec85540907080e7636fa164710ab9b069850ea3b3e4924">pugi::xpath_node_set</a></ul>
+<h3><a class="anchor" name="index_v">- v -</a></h3><ul>
+<li>value()
+: <a class="el" href="classpugi_1_1xml__node.html#0f28b7a44f40d1ac58fdc8202e04805e">pugi::xml_node</a>, <a class="el" href="classpugi_1_1xml__attribute.html#5867b6362af3e7419199d4c58384b92a">pugi::xml_attribute</a></ul>
+<h3><a class="anchor" name="index_w">- w -</a></h3><ul>
+<li>what()
+: <a class="el" href="classpugi_1_1xpath__exception.html#436980baf3d09670ecc15a110ed0f654">pugi::xpath_exception</a></ul>
+<h3><a class="anchor" name="index_x">- x -</a></h3><ul>
+<li>xml_attribute()
+: <a class="el" href="classpugi_1_1xml__attribute.html#a555fccff52247e39f823d564a31e4d8">pugi::xml_attribute</a><li>xml_attribute_iterator()
+: <a class="el" href="classpugi_1_1xml__attribute__iterator.html#c99270b894dd2faeab9fc6eb3832dc94">pugi::xml_attribute_iterator</a><li>xml_document()
+: <a class="el" href="classpugi_1_1xml__document.html#8db801c1d42eaa9073d14dfafda84f37">pugi::xml_document</a><li>xml_node()
+: <a class="el" href="classpugi_1_1xml__node.html#1db6c67c97cddd74f59d872057987432">pugi::xml_node</a><li>xml_node_iterator()
+: <a class="el" href="classpugi_1_1xml__node__iterator.html#b16f30b8b0b96e750792c69e8e1fbeb2">pugi::xml_node_iterator</a><li>xml_tree_walker()
+: <a class="el" href="classpugi_1_1xml__tree__walker.html#93c03157cff8f8a0ead30c2d256d061b">pugi::xml_tree_walker</a><li>xpath_exception()
+: <a class="el" href="classpugi_1_1xpath__exception.html#9236dd8d2e0674417b2cb53760791017">pugi::xpath_exception</a><li>xpath_node()
+: <a class="el" href="classpugi_1_1xpath__node.html#5cc7cfd8ceb6cae4be45b2f29fe57f34">pugi::xpath_node</a><li>xpath_node_set()
+: <a class="el" href="classpugi_1_1xpath__node__set.html#59f1f078606bb6c4f1a081bb82bcf901">pugi::xpath_node_set</a><li>xpath_query()
+: <a class="el" href="classpugi_1_1xpath__query.html#df3ce6efc17c1b58a1ff60bedb632140">pugi::xpath_query</a></ul>
+<h3><a class="anchor" name="index_~">- ~ -</a></h3><ul>
+<li>~xml_document()
+: <a class="el" href="classpugi_1_1xml__document.html#16c086e679286271b0ccd4541d1c1290">pugi::xml_document</a><li>~xml_tree_walker()
+: <a class="el" href="classpugi_1_1xml__tree__walker.html#aa0d4eb42c6518a2a90bc264588ece84">pugi::xml_tree_walker</a><li>~xpath_node_set()
+: <a class="el" href="classpugi_1_1xpath__node__set.html#6ca44658aa0126e12f9fc3e3f8017376">pugi::xpath_node_set</a><li>~xpath_query()
+: <a class="el" href="classpugi_1_1xpath__query.html#0ca09e7de62e46feb64d03995f389da3">pugi::xpath_query</a></ul>
+<hr size="1"><address style="align: right;"><small>Generated on Wed Feb 21 22:19:50 2007 for pugixml by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6-NO </small></address>
+</body>
+</html>
diff --git a/docs/html/functions_enum.html b/docs/html/functions_enum.html
new file mode 100644
index 0000000..5f676d1
--- /dev/null
+++ b/docs/html/functions_enum.html
@@ -0,0 +1,38 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pugixml: Class Members - Enumerations</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6-NO -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+ <li id="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_type.html"><span>Typedefs</span></a></li>
+ <li id="current"><a href="functions_enum.html"><span>Enumerations</span></a></li>
+ <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+ </ul>
+</div>
+&nbsp;
+<p>
+<ul>
+<li>type_t
+: <a class="el" href="classpugi_1_1xpath__node__set.html#6c6899c8ecfbce9e42ec85540907080e">pugi::xpath_node_set</a></ul>
+<hr size="1"><address style="align: right;"><small>Generated on Wed Feb 21 22:19:50 2007 for pugixml by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6-NO </small></address>
+</body>
+</html>
diff --git a/docs/html/functions_eval.html b/docs/html/functions_eval.html
new file mode 100644
index 0000000..ae211d9
--- /dev/null
+++ b/docs/html/functions_eval.html
@@ -0,0 +1,40 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pugixml: Class Members - Enumerator</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6-NO -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+ <li id="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_type.html"><span>Typedefs</span></a></li>
+ <li><a href="functions_enum.html"><span>Enumerations</span></a></li>
+ <li id="current"><a href="functions_eval.html"><span>Enumerator</span></a></li>
+ </ul>
+</div>
+&nbsp;
+<p>
+<ul>
+<li>type_sorted
+: <a class="el" href="classpugi_1_1xpath__node__set.html#6c6899c8ecfbce9e42ec85540907080e9d5ce5e6194ac2003da0d86d9af87437">pugi::xpath_node_set</a><li>type_sorted_reverse
+: <a class="el" href="classpugi_1_1xpath__node__set.html#6c6899c8ecfbce9e42ec85540907080e7035df3be16759292de59850d6c0b9be">pugi::xpath_node_set</a><li>type_unsorted
+: <a class="el" href="classpugi_1_1xpath__node__set.html#6c6899c8ecfbce9e42ec85540907080e7636fa164710ab9b069850ea3b3e4924">pugi::xpath_node_set</a></ul>
+<hr size="1"><address style="align: right;"><small>Generated on Wed Feb 21 22:19:50 2007 for pugixml by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6-NO </small></address>
+</body>
+</html>
diff --git a/docs/html/functions_func.html b/docs/html/functions_func.html
new file mode 100644
index 0000000..a68a6c0
--- /dev/null
+++ b/docs/html/functions_func.html
@@ -0,0 +1,188 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pugixml: Class Members - Functions</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6-NO -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+ <li id="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li id="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_type.html"><span>Typedefs</span></a></li>
+ <li><a href="functions_enum.html"><span>Enumerations</span></a></li>
+ <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+ </ul>
+</div>
+<div class="tabs">
+ <ul>
+ <li><a href="#index_a"><span>a</span></a></li>
+ <li><a href="#index_b"><span>b</span></a></li>
+ <li><a href="#index_c"><span>c</span></a></li>
+ <li><a href="#index_d"><span>d</span></a></li>
+ <li><a href="#index_e"><span>e</span></a></li>
+ <li><a href="#index_f"><span>f</span></a></li>
+ <li><a href="#index_i"><span>i</span></a></li>
+ <li><a href="#index_l"><span>l</span></a></li>
+ <li><a href="#index_n"><span>n</span></a></li>
+ <li><a href="#index_o"><span>o</span></a></li>
+ <li><a href="#index_p"><span>p</span></a></li>
+ <li><a href="#index_r"><span>r</span></a></li>
+ <li><a href="#index_s"><span>s</span></a></li>
+ <li><a href="#index_t"><span>t</span></a></li>
+ <li><a href="#index_v"><span>v</span></a></li>
+ <li><a href="#index_w"><span>w</span></a></li>
+ <li><a href="#index_x"><span>x</span></a></li>
+ <li><a href="#index_~"><span>~</span></a></li>
+ </ul>
+</div>
+
+<p>
+&nbsp;
+<p>
+<h3><a class="anchor" name="index_a">- a -</a></h3><ul>
+<li>all_elements_by_name()
+: <a class="el" href="classpugi_1_1xml__node.html#21a123c51fa592b6f2ceb2e22411edd9">pugi::xml_node</a><li>all_elements_by_name_w()
+: <a class="el" href="classpugi_1_1xml__node.html#90347629066ca2eedeaee4d5d4038fe7">pugi::xml_node</a><li>append_attribute()
+: <a class="el" href="classpugi_1_1xml__node.html#645c4d7283f755a7b25839667a5fd9c7">pugi::xml_node</a><li>append_child()
+: <a class="el" href="classpugi_1_1xml__node.html#498e41f14a04014eaf5d6af3ae8f9d99">pugi::xml_node</a><li>as_bool()
+: <a class="el" href="classpugi_1_1xml__attribute.html#f512177dd662f69c4259bc15312c54f0">pugi::xml_attribute</a><li>as_double()
+: <a class="el" href="classpugi_1_1xml__attribute.html#e3bdc34a10c904a95c066b49249e75bd">pugi::xml_attribute</a><li>as_float()
+: <a class="el" href="classpugi_1_1xml__attribute.html#6de96400d33e382db1c30dba9302604c">pugi::xml_attribute</a><li>as_int()
+: <a class="el" href="classpugi_1_1xml__attribute.html#9f11964a8cef05be2c3410fc5da69064">pugi::xml_attribute</a><li>attribute()
+: <a class="el" href="classpugi_1_1xpath__node.html#1d4b104aa945a3364dd45f8d6a9f7031">pugi::xpath_node</a>, <a class="el" href="classpugi_1_1xml__node.html#974b051c270013d889d57cda2e8af669">pugi::xml_node</a><li>attribute_w()
+: <a class="el" href="classpugi_1_1xml__node.html#690982cdfd2c6181e1118d8238d64a54">pugi::xml_node</a><li>attributes_begin()
+: <a class="el" href="classpugi_1_1xml__node.html#b62a944c00d7ed00519e83c23bed0675">pugi::xml_node</a><li>attributes_end()
+: <a class="el" href="classpugi_1_1xml__node.html#3dffd0eff455030c2075451327403beb">pugi::xml_node</a></ul>
+<h3><a class="anchor" name="index_b">- b -</a></h3><ul>
+<li>begin()
+: <a class="el" href="classpugi_1_1xpath__node__set.html#cf8a0a6e24b502941f5f182c44e14587">pugi::xpath_node_set</a>, <a class="el" href="classpugi_1_1xml__tree__walker.html#118c8c5a323745053ae52dc0e1276a9b">pugi::xml_tree_walker</a>, <a class="el" href="classpugi_1_1xml__node.html#af4acdf745dfb4b01e3f144ed314d28a">pugi::xml_node</a></ul>
+<h3><a class="anchor" name="index_c">- c -</a></h3><ul>
+<li>child()
+: <a class="el" href="classpugi_1_1xml__node.html#eecbadd7bdc18c503064f7c47efe067a">pugi::xml_node</a><li>child_value()
+: <a class="el" href="classpugi_1_1xml__node.html#be85f5f7160c0b314691d4a45fb61151">pugi::xml_node</a><li>child_value_w()
+: <a class="el" href="classpugi_1_1xml__node.html#441dfaf2aa8435154674cae81e5fb77c">pugi::xml_node</a><li>child_w()
+: <a class="el" href="classpugi_1_1xml__node.html#961024c2c8424a01a8528c96f520c05f">pugi::xml_node</a></ul>
+<h3><a class="anchor" name="index_d">- d -</a></h3><ul>
+<li>depth()
+: <a class="el" href="classpugi_1_1xml__tree__walker.html#45420eb7809aae9d35feaca33835dbe2">pugi::xml_tree_walker</a></ul>
+<h3><a class="anchor" name="index_e">- e -</a></h3><ul>
+<li>empty()
+: <a class="el" href="classpugi_1_1xpath__node__set.html#8c6ade2a234af974edb4df861e30ca14">pugi::xpath_node_set</a>, <a class="el" href="classpugi_1_1xml__node.html#3516f879718f3ea1782a0324cb31f798">pugi::xml_node</a>, <a class="el" href="classpugi_1_1xml__attribute.html#5578d661daebb2188ea8856805e6be2f">pugi::xml_attribute</a><li>end()
+: <a class="el" href="classpugi_1_1xpath__node__set.html#0252547cd7016f105598d649ec4ff0b1">pugi::xpath_node_set</a>, <a class="el" href="classpugi_1_1xml__tree__walker.html#19c4f587afbd022959d81c6bf129a8fd">pugi::xml_tree_walker</a>, <a class="el" href="classpugi_1_1xml__node.html#1cfc6360de985d724812f67650892658">pugi::xml_node</a><li>evaluate_boolean()
+: <a class="el" href="classpugi_1_1xpath__query.html#0b6e208704f8aec7130fdde78f526c9f">pugi::xpath_query</a><li>evaluate_node_set()
+: <a class="el" href="classpugi_1_1xpath__query.html#6d3db9ec25068ca3efccb5126de6b28d">pugi::xpath_query</a><li>evaluate_number()
+: <a class="el" href="classpugi_1_1xpath__query.html#0e04ba6218d5af799aca3c9a5921fde1">pugi::xpath_query</a><li>evaluate_string()
+: <a class="el" href="classpugi_1_1xpath__query.html#0327ba2d1a1dddac08f18d400856dafc">pugi::xpath_query</a></ul>
+<h3><a class="anchor" name="index_f">- f -</a></h3><ul>
+<li>find_attribute()
+: <a class="el" href="classpugi_1_1xml__node.html#6b921b19dbf2c792daaf46544df44fb6">pugi::xml_node</a><li>find_child()
+: <a class="el" href="classpugi_1_1xml__node.html#132ca635cc0ab99180be0ffcc156a616">pugi::xml_node</a><li>find_node()
+: <a class="el" href="classpugi_1_1xml__node.html#f3a5796f1c99df52244f3c73f5c03d8e">pugi::xml_node</a><li>first()
+: <a class="el" href="classpugi_1_1xpath__node__set.html#e786ac9ff330b2dbd7b4da2d8d55b61a">pugi::xpath_node_set</a><li>first_attribute()
+: <a class="el" href="classpugi_1_1xml__node.html#aae0bdb0c69fb895f66b239720d5d2d0">pugi::xml_node</a><li>first_child()
+: <a class="el" href="classpugi_1_1xml__node.html#da6e0ce4318d7f72f8b037e39433b298">pugi::xml_node</a><li>first_element_by_path()
+: <a class="el" href="classpugi_1_1xml__node.html#4be3a6da6307a33954fbdc5f210de209">pugi::xml_node</a><li>for_each()
+: <a class="el" href="classpugi_1_1xml__tree__walker.html#caf3a12a8cfdd55ef421ad045dfef764">pugi::xml_tree_walker</a></ul>
+<h3><a class="anchor" name="index_i">- i -</a></h3><ul>
+<li>insert_attribute_after()
+: <a class="el" href="classpugi_1_1xml__node.html#395ce9c52840edead28b50a7a69565ab">pugi::xml_node</a><li>insert_attribute_before()
+: <a class="el" href="classpugi_1_1xml__node.html#36cfed4439fba1f140d89e351c2bb552">pugi::xml_node</a><li>insert_child_after()
+: <a class="el" href="classpugi_1_1xml__node.html#fb2c70e3908e65b001dcd9bcf794d605">pugi::xml_node</a><li>insert_child_before()
+: <a class="el" href="classpugi_1_1xml__node.html#a07c23d9835e8174fbe75f0c9a0c7d7b">pugi::xml_node</a></ul>
+<h3><a class="anchor" name="index_l">- l -</a></h3><ul>
+<li>last_attribute()
+: <a class="el" href="classpugi_1_1xml__node.html#3e93125923e0b195de4369d50776ecc6">pugi::xml_node</a><li>last_child()
+: <a class="el" href="classpugi_1_1xml__node.html#b92290e7dbc9292e4ff5d6949bd02e01">pugi::xml_node</a><li>load()
+: <a class="el" href="classpugi_1_1xml__document.html#77501ece75c709bfb4e479d7cf5f92e3">pugi::xml_document</a><li>load_file()
+: <a class="el" href="classpugi_1_1xml__document.html#0362034d3715646568869514dbf8f419">pugi::xml_document</a></ul>
+<h3><a class="anchor" name="index_n">- n -</a></h3><ul>
+<li>name()
+: <a class="el" href="classpugi_1_1xml__node.html#1f0c8b4652edc55e4f46ced685ae60f4">pugi::xml_node</a>, <a class="el" href="classpugi_1_1xml__attribute.html#b28b196c03b0a10f7c113ba6694a4cd0">pugi::xml_attribute</a><li>next_attribute()
+: <a class="el" href="classpugi_1_1xml__attribute.html#37ac446a8892430783382d0e40396d6b">pugi::xml_attribute</a><li>next_sibling()
+: <a class="el" href="classpugi_1_1xml__node.html#1d0d1e460eff5305e6bf50d9f65a58bc">pugi::xml_node</a><li>next_sibling_w()
+: <a class="el" href="classpugi_1_1xml__node.html#3154a0d481e54bbde8f01edd1901698c">pugi::xml_node</a><li>node()
+: <a class="el" href="classpugi_1_1xpath__node.html#733aedafcaac5d4c0f18cfd2e2fac8d5">pugi::xpath_node</a></ul>
+<h3><a class="anchor" name="index_o">- o -</a></h3><ul>
+<li>operator *()
+: <a class="el" href="classpugi_1_1xml__attribute__iterator.html#ef0da918a50b53390faef17f6c81ce58">pugi::xml_attribute_iterator</a>, <a class="el" href="classpugi_1_1xml__node__iterator.html#eb7903145d612c84bae22e0aa103608f">pugi::xml_node_iterator</a><li>operator unspecified_bool_type()
+: <a class="el" href="classpugi_1_1xpath__node.html#4993b929cb8ae5c8a759788e0c5d199c">pugi::xpath_node</a>, <a class="el" href="classpugi_1_1xml__node.html#fa8c35f7bc0254101cf4979372deb52e">pugi::xml_node</a>, <a class="el" href="classpugi_1_1xml__attribute.html#176a1a482f838100f1147401f81de430">pugi::xml_attribute</a><li>operator!=()
+: <a class="el" href="classpugi_1_1xpath__node.html#1d681c030d20036dc89530a4d1fbea59">pugi::xpath_node</a>, <a class="el" href="classpugi_1_1xml__attribute__iterator.html#ff31d15fb408f567e8aaa03569865c87">pugi::xml_attribute_iterator</a>, <a class="el" href="classpugi_1_1xml__node__iterator.html#5905460cbc3433ff7edfa20ce02c11da">pugi::xml_node_iterator</a>, <a class="el" href="classpugi_1_1xml__node.html#7b5aeeff39fd31e5123ba5c23d6b8676">pugi::xml_node</a>, <a class="el" href="classpugi_1_1xml__attribute.html#3904027c125612776ad4bf834ad73761">pugi::xml_attribute</a><li>operator++()
+: <a class="el" href="classpugi_1_1xml__attribute__iterator.html#6b97c3b1a278c668240d7ab0b20d77ae">pugi::xml_attribute_iterator</a>, <a class="el" href="classpugi_1_1xml__node__iterator.html#da8f21676a3ac62b0dc98293b2baa257">pugi::xml_node_iterator</a><li>operator--()
+: <a class="el" href="classpugi_1_1xml__attribute__iterator.html#4b172ad267089d166221967c3b3a05ae">pugi::xml_attribute_iterator</a>, <a class="el" href="classpugi_1_1xml__node__iterator.html#88f5f1a39e84b6fcb1574eb5366092ba">pugi::xml_node_iterator</a><li>operator-&gt;()
+: <a class="el" href="classpugi_1_1xml__attribute__iterator.html#205b888a86103197a70f57860c4c2ae4">pugi::xml_attribute_iterator</a>, <a class="el" href="classpugi_1_1xml__node__iterator.html#7589cb0bc9ecf04b4553049ccd442fc6">pugi::xml_node_iterator</a><li>operator&lt;()
+: <a class="el" href="classpugi_1_1xml__node.html#8d7c1b506be1b2ee0dea7dca1f2e80d6">pugi::xml_node</a>, <a class="el" href="classpugi_1_1xml__attribute.html#8ae8a5e3fc967d42d9c830e4fbde0fe2">pugi::xml_attribute</a><li>operator&lt;=()
+: <a class="el" href="classpugi_1_1xml__node.html#a97cf42c013ec35eb76c5314cadb4e26">pugi::xml_node</a>, <a class="el" href="classpugi_1_1xml__attribute.html#4cf978e6d5bfc56952f9d5b4eebfe68e">pugi::xml_attribute</a><li>operator=()
+: <a class="el" href="classpugi_1_1xpath__node__set.html#2dda399273322331ad99409319baa75a">pugi::xpath_node_set</a>, <a class="el" href="classpugi_1_1xml__attribute.html#79df9ba6c6d7adc08ea5bb9d214a11e8">pugi::xml_attribute</a><li>operator==()
+: <a class="el" href="classpugi_1_1xpath__node.html#391f897a4be5b6c4a84b97bbbb680c63">pugi::xpath_node</a>, <a class="el" href="classpugi_1_1xml__attribute__iterator.html#6478076e6a12f5900992008311e42963">pugi::xml_attribute_iterator</a>, <a class="el" href="classpugi_1_1xml__node__iterator.html#d879ac5ca8ec10d5d9a6e24f978ffde1">pugi::xml_node_iterator</a>, <a class="el" href="classpugi_1_1xml__node.html#427236c4a20d1fa232bd2233f72c73be">pugi::xml_node</a>, <a class="el" href="classpugi_1_1xml__attribute.html#26431cc9dae292a7ae629138969e3824">pugi::xml_attribute</a><li>operator&gt;()
+: <a class="el" href="classpugi_1_1xml__node.html#04a82fd56f91edb82bf34cc409bdcf04">pugi::xml_node</a>, <a class="el" href="classpugi_1_1xml__attribute.html#be8436c6a7fb6a151bfc160989b0948a">pugi::xml_attribute</a><li>operator&gt;=()
+: <a class="el" href="classpugi_1_1xml__node.html#08e0c3feeb7909e6234a8fe7ccb07d7c">pugi::xml_node</a>, <a class="el" href="classpugi_1_1xml__attribute.html#6f52a1362f7f8564f75e39e35e87d4ef">pugi::xml_attribute</a></ul>
+<h3><a class="anchor" name="index_p">- p -</a></h3><ul>
+<li>parent()
+: <a class="el" href="classpugi_1_1xpath__node.html#7e293086926c36f781beb0f25629c614">pugi::xpath_node</a>, <a class="el" href="classpugi_1_1xml__node.html#aa4c19abe199d4eacae18f832deb4d70">pugi::xml_node</a><li>parse()
+: <a class="el" href="classpugi_1_1xml__document.html#2742c9acf467f0d3e2651c25bed76634">pugi::xml_document</a><li>path()
+: <a class="el" href="classpugi_1_1xml__node.html#9d5ed8a5d73d252e5786f034d277d504">pugi::xml_node</a><li>precompute_document_order()
+: <a class="el" href="classpugi_1_1xml__document.html#952fa74a00a02d64ab7600ac2c72fb4b">pugi::xml_document</a><li>previous_attribute()
+: <a class="el" href="classpugi_1_1xml__attribute.html#584444ba6bcb328cfa9cd5c6cf08ef7f">pugi::xml_attribute</a><li>previous_sibling()
+: <a class="el" href="classpugi_1_1xml__node.html#919305f60b3ac08432867cbc94f6e3da">pugi::xml_node</a><li>previous_sibling_w()
+: <a class="el" href="classpugi_1_1xml__node.html#f98f6bc32514761133fc01eec3c77a09">pugi::xml_node</a><li>print()
+: <a class="el" href="classpugi_1_1xml__node.html#8a0a9d086cc2e5c1f92cb79452695949">pugi::xml_node</a></ul>
+<h3><a class="anchor" name="index_r">- r -</a></h3><ul>
+<li>remove_attribute()
+: <a class="el" href="classpugi_1_1xml__node.html#177097ca7770e8d80350d15cc96a3dd9">pugi::xml_node</a><li>remove_child()
+: <a class="el" href="classpugi_1_1xml__node.html#023157bd57e3696c9f49f23944ac909f">pugi::xml_node</a><li>root()
+: <a class="el" href="classpugi_1_1xml__node.html#f7d6cc0124c07dbb192e779c375a7c16">pugi::xml_node</a></ul>
+<h3><a class="anchor" name="index_s">- s -</a></h3><ul>
+<li>save_file()
+: <a class="el" href="classpugi_1_1xml__document.html#716c23429fcac408ee1073353056485d">pugi::xml_document</a><li>select_nodes()
+: <a class="el" href="classpugi_1_1xml__node.html#041475ecea08aeab971707daefe0c3c7">pugi::xml_node</a><li>select_single_node()
+: <a class="el" href="classpugi_1_1xml__node.html#30e004e4939797a84da7916ea950ec33">pugi::xml_node</a><li>set_name()
+: <a class="el" href="classpugi_1_1xml__node.html#f81bf55a3f7b9d40ee8807ac1be93a86">pugi::xml_node</a>, <a class="el" href="classpugi_1_1xml__attribute.html#959bc0ffe307e16b1c19da6611005a3e">pugi::xml_attribute</a><li>set_value()
+: <a class="el" href="classpugi_1_1xml__node.html#afa7b8f3ffa652e5e279f79e04d22d4c">pugi::xml_node</a>, <a class="el" href="classpugi_1_1xml__attribute.html#2d4f2552eeb4a51a8126f228c03a400e">pugi::xml_attribute</a><li>size()
+: <a class="el" href="classpugi_1_1xpath__node__set.html#2d8be3dbf5d38d3fb4ee04daed4d72a7">pugi::xpath_node_set</a><li>sort()
+: <a class="el" href="classpugi_1_1xpath__node__set.html#53b4915362d3c73100d3b73ac40ab8f2">pugi::xpath_node_set</a></ul>
+<h3><a class="anchor" name="index_t">- t -</a></h3><ul>
+<li>traverse()
+: <a class="el" href="classpugi_1_1xml__node.html#41be22248598bdf1575ed8d7bdd77807">pugi::xml_node</a><li>type()
+: <a class="el" href="classpugi_1_1xpath__node__set.html#42a943e60d5809620f0d77809bef122c">pugi::xpath_node_set</a>, <a class="el" href="classpugi_1_1xml__node.html#28231e644bc70075286c75175a05d849">pugi::xml_node</a></ul>
+<h3><a class="anchor" name="index_v">- v -</a></h3><ul>
+<li>value()
+: <a class="el" href="classpugi_1_1xml__node.html#0f28b7a44f40d1ac58fdc8202e04805e">pugi::xml_node</a>, <a class="el" href="classpugi_1_1xml__attribute.html#5867b6362af3e7419199d4c58384b92a">pugi::xml_attribute</a></ul>
+<h3><a class="anchor" name="index_w">- w -</a></h3><ul>
+<li>what()
+: <a class="el" href="classpugi_1_1xpath__exception.html#436980baf3d09670ecc15a110ed0f654">pugi::xpath_exception</a></ul>
+<h3><a class="anchor" name="index_x">- x -</a></h3><ul>
+<li>xml_attribute()
+: <a class="el" href="classpugi_1_1xml__attribute.html#a555fccff52247e39f823d564a31e4d8">pugi::xml_attribute</a><li>xml_attribute_iterator()
+: <a class="el" href="classpugi_1_1xml__attribute__iterator.html#c99270b894dd2faeab9fc6eb3832dc94">pugi::xml_attribute_iterator</a><li>xml_document()
+: <a class="el" href="classpugi_1_1xml__document.html#8db801c1d42eaa9073d14dfafda84f37">pugi::xml_document</a><li>xml_node()
+: <a class="el" href="classpugi_1_1xml__node.html#1db6c67c97cddd74f59d872057987432">pugi::xml_node</a><li>xml_node_iterator()
+: <a class="el" href="classpugi_1_1xml__node__iterator.html#b16f30b8b0b96e750792c69e8e1fbeb2">pugi::xml_node_iterator</a><li>xml_tree_walker()
+: <a class="el" href="classpugi_1_1xml__tree__walker.html#93c03157cff8f8a0ead30c2d256d061b">pugi::xml_tree_walker</a><li>xpath_exception()
+: <a class="el" href="classpugi_1_1xpath__exception.html#9236dd8d2e0674417b2cb53760791017">pugi::xpath_exception</a><li>xpath_node()
+: <a class="el" href="classpugi_1_1xpath__node.html#5cc7cfd8ceb6cae4be45b2f29fe57f34">pugi::xpath_node</a><li>xpath_node_set()
+: <a class="el" href="classpugi_1_1xpath__node__set.html#59f1f078606bb6c4f1a081bb82bcf901">pugi::xpath_node_set</a><li>xpath_query()
+: <a class="el" href="classpugi_1_1xpath__query.html#df3ce6efc17c1b58a1ff60bedb632140">pugi::xpath_query</a></ul>
+<h3><a class="anchor" name="index_~">- ~ -</a></h3><ul>
+<li>~xml_document()
+: <a class="el" href="classpugi_1_1xml__document.html#16c086e679286271b0ccd4541d1c1290">pugi::xml_document</a><li>~xml_tree_walker()
+: <a class="el" href="classpugi_1_1xml__tree__walker.html#aa0d4eb42c6518a2a90bc264588ece84">pugi::xml_tree_walker</a><li>~xpath_node_set()
+: <a class="el" href="classpugi_1_1xpath__node__set.html#6ca44658aa0126e12f9fc3e3f8017376">pugi::xpath_node_set</a><li>~xpath_query()
+: <a class="el" href="classpugi_1_1xpath__query.html#0ca09e7de62e46feb64d03995f389da3">pugi::xpath_query</a></ul>
+<hr size="1"><address style="align: right;"><small>Generated on Wed Feb 21 22:19:50 2007 for pugixml by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6-NO </small></address>
+</body>
+</html>
diff --git a/docs/html/functions_type.html b/docs/html/functions_type.html
new file mode 100644
index 0000000..e732be9
--- /dev/null
+++ b/docs/html/functions_type.html
@@ -0,0 +1,40 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pugixml: Class Members - Typedefs</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6-NO -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+ <li id="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li id="current"><a href="functions_type.html"><span>Typedefs</span></a></li>
+ <li><a href="functions_enum.html"><span>Enumerations</span></a></li>
+ <li><a href="functions_eval.html"><span>Enumerator</span></a></li>
+ </ul>
+</div>
+&nbsp;
+<p>
+<ul>
+<li>attribute_iterator
+: <a class="el" href="classpugi_1_1xml__node.html#9084f97350ffc64af1eaf7c17c57f4ba">pugi::xml_node</a><li>const_iterator
+: <a class="el" href="classpugi_1_1xpath__node__set.html#6987510e88cea4a396d186285c174de6">pugi::xpath_node_set</a><li>iterator
+: <a class="el" href="classpugi_1_1xml__node.html#e053ea39add5a64de584f7a81212e388">pugi::xml_node</a></ul>
+<hr size="1"><address style="align: right;"><small>Generated on Wed Feb 21 22:19:50 2007 for pugixml by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6-NO </small></address>
+</body>
+</html>
diff --git a/docs/html/graph_legend.dot b/docs/html/graph_legend.dot
new file mode 100644
index 0000000..5420927
--- /dev/null
+++ b/docs/html/graph_legend.dot
@@ -0,0 +1,22 @@
+digraph G
+{
+ edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10];
+ node [fontname="Helvetica",fontsize=10,shape=record];
+ Node9 [shape="box",label="Inherited",fontsize=10,height=0.2,width=0.4,fontname="Helvetica",color="black",style="filled" fontcolor="white"];
+ Node10 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="Helvetica"];
+ Node10 [shape="box",label="PublicBase",fontsize=10,height=0.2,width=0.4,fontname="Helvetica",color="black",URL="$classPublicBase.html"];
+ Node11 -> Node10 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="Helvetica"];
+ Node11 [shape="box",label="Truncated",fontsize=10,height=0.2,width=0.4,fontname="Helvetica",color="red",URL="$classTruncated.html"];
+ Node13 -> Node9 [dir=back,color="darkgreen",fontsize=10,style="solid",fontname="Helvetica"];
+ Node13 [shape="box",label="ProtectedBase",fontsize=10,height=0.2,width=0.4,fontname="Helvetica",color="black",URL="$classProtectedBase.html"];
+ Node14 -> Node9 [dir=back,color="firebrick4",fontsize=10,style="solid",fontname="Helvetica"];
+ Node14 [shape="box",label="PrivateBase",fontsize=10,height=0.2,width=0.4,fontname="Helvetica",color="black",URL="$classPrivateBase.html"];
+ Node15 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="Helvetica"];
+ Node15 [shape="box",label="Undocumented",fontsize=10,height=0.2,width=0.4,fontname="Helvetica",color="grey75"];
+ Node16 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="Helvetica"];
+ Node16 [shape="box",label="Templ< int >",fontsize=10,height=0.2,width=0.4,fontname="Helvetica",color="black",URL="$classTempl.html"];
+ Node17 -> Node16 [dir=back,color="orange",fontsize=10,style="dashed",label="< int >",fontname="Helvetica"];
+ Node17 [shape="box",label="Templ< T >",fontsize=10,height=0.2,width=0.4,fontname="Helvetica",color="black",URL="$classTempl.html"];
+ Node18 -> Node9 [dir=back,color="darkorchid3",fontsize=10,style="dashed",label="m_usedClass",fontname="Helvetica"];
+ Node18 [shape="box",label="Used",fontsize=10,height=0.2,width=0.4,fontname="Helvetica",color="black",URL="$classUsed.html"];
+}
diff --git a/docs/html/graph_legend.html b/docs/html/graph_legend.html
new file mode 100644
index 0000000..a07c58e
--- /dev/null
+++ b/docs/html/graph_legend.html
@@ -0,0 +1,80 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pugixml: Graph Legend</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6-NO -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ </ul></div>
+<h1>Graph Legend</h1>This page explains how to interpret the graphs that are generated by doxygen.<p>
+Consider the following example: <div class="fragment"><pre class="fragment"><span class="comment">/*! Invisible class because of truncation */</span>
+<span class="keyword">class </span>Invisible { };
+<span class="comment"></span>
+<span class="comment">/*! Truncated class, inheritance relation is hidden */</span>
+<span class="keyword">class </span>Truncated : <span class="keyword">public</span> Invisible { };
+
+<span class="comment">/* Class not documented with doxygen comments */</span>
+<span class="keyword">class </span>Undocumented { };
+<span class="comment"></span>
+<span class="comment">/*! Class that is inherited using public inheritance */</span>
+<span class="keyword">class </span>PublicBase : <span class="keyword">public</span> Truncated { };
+<span class="comment"></span>
+<span class="comment">/*! A template class */</span>
+<span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt; <span class="keyword">class </span>Templ { };
+<span class="comment"></span>
+<span class="comment">/*! Class that is inherited using protected inheritance */</span>
+<span class="keyword">class </span>ProtectedBase { };
+<span class="comment"></span>
+<span class="comment">/*! Class that is inherited using private inheritance */</span>
+<span class="keyword">class </span>PrivateBase { };
+<span class="comment"></span>
+<span class="comment">/*! Class that is used by the Inherited class */</span>
+<span class="keyword">class </span>Used { };
+<span class="comment"></span>
+<span class="comment">/*! Super class that inherits a number of other classes */</span>
+<span class="keyword">class </span>Inherited : <span class="keyword">public</span> PublicBase,
+ <span class="keyword">protected</span> ProtectedBase,
+ <span class="keyword">private</span> PrivateBase,
+ <span class="keyword">public</span> Undocumented
+ <span class="keyword">public</span> Templ&lt;int&gt;
+{
+ <span class="keyword">private</span>:
+ Used *m_usedClass;
+};
+</pre></div> If the <code>MAX_DOT_GRAPH_HEIGHT</code> tag in the configuration file is set to 240 this will result in the following graph:<p>
+<center><div align="center">
+<img src="graph_legend.png" alt="graph_legend.png">
+</div>
+</center> <p>
+The boxes in the above graph have the following meaning: <ul>
+<li>
+A filled black box represents the struct or class for which the graph is generated. </li>
+<li>
+A box with a black border denotes a documented struct or class. </li>
+<li>
+A box with a grey border denotes an undocumented struct or class. </li>
+<li>
+A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries. </li>
+</ul>
+The arrows have the following meaning: <ul>
+<li>
+A dark blue arrow is used to visualize a public inheritance relation between two classes. </li>
+<li>
+A dark green arrow is used for protected inheritance. </li>
+<li>
+A dark red arrow is used for private inheritance. </li>
+<li>
+A purple dashed arrow is used if a class is contained or used by another class. The arrow is labeled with the variable(s) through which the pointed class or struct is accessible. </li>
+<li>
+A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labeled with the template parameters of the instance. </li>
+</ul>
+<hr size="1"><address style="align: right;"><small>Generated on Wed Feb 21 22:19:53 2007 for pugixml by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6-NO </small></address>
+</body>
+</html>
diff --git a/docs/html/graph_legend.png b/docs/html/graph_legend.png
new file mode 100644
index 0000000..b8cfe42
--- /dev/null
+++ b/docs/html/graph_legend.png
Binary files differ
diff --git a/docs/html/hierarchy.html b/docs/html/hierarchy.html
new file mode 100644
index 0000000..bcd7f02
--- /dev/null
+++ b/docs/html/hierarchy.html
@@ -0,0 +1,45 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pugixml: Hierarchical Index</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6-NO -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li id="current"><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul></div>
+<h1>pugixml Class Hierarchy</h1><a href="inherits.html">Go to the graphical class hierarchy</a>
+<p>
+This inheritance list is sorted roughly, but not completely, alphabetically:<ul>
+<li><b>exception</b><ul>
+<li><a class="el" href="classpugi_1_1xpath__exception.html">pugi::xpath_exception</a>
+</ul>
+<li><b>iterator</b><ul>
+<li><a class="el" href="classpugi_1_1xml__attribute__iterator.html">pugi::xml_attribute_iterator</a>
+<li><a class="el" href="classpugi_1_1xml__node__iterator.html">pugi::xml_node_iterator</a>
+</ul>
+<li><a class="el" href="structpugi_1_1transfer__ownership__tag.html">pugi::transfer_ownership_tag</a>
+<li><a class="el" href="classpugi_1_1xml__attribute.html">pugi::xml_attribute</a>
+<li><a class="el" href="classpugi_1_1xml__node.html">pugi::xml_node</a>
+<ul>
+<li><a class="el" href="classpugi_1_1xml__document.html">pugi::xml_document</a>
+</ul>
+<li><a class="el" href="classpugi_1_1xml__tree__walker.html">pugi::xml_tree_walker</a>
+<li><a class="el" href="classpugi_1_1xpath__node.html">pugi::xpath_node</a>
+<li><a class="el" href="classpugi_1_1xpath__node__set.html">pugi::xpath_node_set</a>
+<li><a class="el" href="classpugi_1_1xpath__query.html">pugi::xpath_query</a>
+</ul>
+<hr size="1"><address style="align: right;"><small>Generated on Wed Feb 21 22:19:50 2007 for pugixml by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6-NO </small></address>
+</body>
+</html>
diff --git a/docs/html/index.html b/docs/html/index.html
new file mode 100644
index 0000000..39fb2e8
--- /dev/null
+++ b/docs/html/index.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pugixml: Main Page</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6-NO -->
+<div class="tabs">
+ <ul>
+ <li id="current"><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ </ul></div>
+<h1>pugixml Documentation</h1>
+<p>
+<h3 align="center">0.3 </h3><hr size="1"><address style="align: right;"><small>Generated on Wed Feb 21 22:19:50 2007 for pugixml by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6-NO </small></address>
+</body>
+</html>
diff --git a/docs/html/inherit__graph__0.map b/docs/html/inherit__graph__0.map
new file mode 100644
index 0000000..795e91c
--- /dev/null
+++ b/docs/html/inherit__graph__0.map
@@ -0,0 +1,2 @@
+base referer
+rect $structpugi_1_1transfer__ownership__tag.html 8,8 202,34
diff --git a/docs/html/inherit__graph__0.md5 b/docs/html/inherit__graph__0.md5
new file mode 100644
index 0000000..dcd3819
--- /dev/null
+++ b/docs/html/inherit__graph__0.md5
@@ -0,0 +1 @@
+fa65747bb299b27710c65a261c62df42 \ No newline at end of file
diff --git a/docs/html/inherit__graph__0.png b/docs/html/inherit__graph__0.png
new file mode 100644
index 0000000..1f839bd
--- /dev/null
+++ b/docs/html/inherit__graph__0.png
Binary files differ
diff --git a/docs/html/inherit__graph__1.map b/docs/html/inherit__graph__1.map
new file mode 100644
index 0000000..8f51b91
--- /dev/null
+++ b/docs/html/inherit__graph__1.map
@@ -0,0 +1,2 @@
+base referer
+rect $classpugi_1_1xml__attribute.html 7,8 141,34
diff --git a/docs/html/inherit__graph__1.md5 b/docs/html/inherit__graph__1.md5
new file mode 100644
index 0000000..584e00e
--- /dev/null
+++ b/docs/html/inherit__graph__1.md5
@@ -0,0 +1 @@
+8a34c90a8a44150412d4efe4e02856c6 \ No newline at end of file
diff --git a/docs/html/inherit__graph__1.png b/docs/html/inherit__graph__1.png
new file mode 100644
index 0000000..1984539
--- /dev/null
+++ b/docs/html/inherit__graph__1.png
Binary files differ
diff --git a/docs/html/inherit__graph__2.map b/docs/html/inherit__graph__2.map
new file mode 100644
index 0000000..c81fa55
--- /dev/null
+++ b/docs/html/inherit__graph__2.map
@@ -0,0 +1,3 @@
+base referer
+rect $classpugi_1_1xml__attribute__iterator.html 121,7 302,34
+rect $classpugi_1_1xml__node__iterator.html 130,58 293,85
diff --git a/docs/html/inherit__graph__2.md5 b/docs/html/inherit__graph__2.md5
new file mode 100644
index 0000000..0ced39c
--- /dev/null
+++ b/docs/html/inherit__graph__2.md5
@@ -0,0 +1 @@
+0a31bb256f9ea1e428ad381426e2138a \ No newline at end of file
diff --git a/docs/html/inherit__graph__2.png b/docs/html/inherit__graph__2.png
new file mode 100644
index 0000000..c0f9a3f
--- /dev/null
+++ b/docs/html/inherit__graph__2.png
Binary files differ
diff --git a/docs/html/inherit__graph__3.map b/docs/html/inherit__graph__3.map
new file mode 100644
index 0000000..ac3e60d
--- /dev/null
+++ b/docs/html/inherit__graph__3.map
@@ -0,0 +1,3 @@
+base referer
+rect $classpugi_1_1xml__node.html 9,8 121,34
+rect $classpugi_1_1xml__document.html 170,8 314,34
diff --git a/docs/html/inherit__graph__3.md5 b/docs/html/inherit__graph__3.md5
new file mode 100644
index 0000000..0b2554a
--- /dev/null
+++ b/docs/html/inherit__graph__3.md5
@@ -0,0 +1 @@
+3ac52082f65d390a3aa62f772b82deb2 \ No newline at end of file
diff --git a/docs/html/inherit__graph__3.png b/docs/html/inherit__graph__3.png
new file mode 100644
index 0000000..4d9a231
--- /dev/null
+++ b/docs/html/inherit__graph__3.png
Binary files differ
diff --git a/docs/html/inherit__graph__4.map b/docs/html/inherit__graph__4.map
new file mode 100644
index 0000000..a42cb31
--- /dev/null
+++ b/docs/html/inherit__graph__4.map
@@ -0,0 +1,2 @@
+base referer
+rect $classpugi_1_1xml__tree__walker.html 9,8 161,34
diff --git a/docs/html/inherit__graph__4.md5 b/docs/html/inherit__graph__4.md5
new file mode 100644
index 0000000..0ef35dc
--- /dev/null
+++ b/docs/html/inherit__graph__4.md5
@@ -0,0 +1 @@
+660d4318c9e8103b2831b4787c62da46 \ No newline at end of file
diff --git a/docs/html/inherit__graph__4.png b/docs/html/inherit__graph__4.png
new file mode 100644
index 0000000..96d08a5
--- /dev/null
+++ b/docs/html/inherit__graph__4.png
Binary files differ
diff --git a/docs/html/inherit__graph__5.map b/docs/html/inherit__graph__5.map
new file mode 100644
index 0000000..4cda6cd
--- /dev/null
+++ b/docs/html/inherit__graph__5.map
@@ -0,0 +1,2 @@
+base referer
+rect $classpugi_1_1xpath__exception.html 137,8 289,34
diff --git a/docs/html/inherit__graph__5.md5 b/docs/html/inherit__graph__5.md5
new file mode 100644
index 0000000..68b862c
--- /dev/null
+++ b/docs/html/inherit__graph__5.md5
@@ -0,0 +1 @@
+fffb0beaca2cbe6da35b67b995ae9ff1 \ No newline at end of file
diff --git a/docs/html/inherit__graph__5.png b/docs/html/inherit__graph__5.png
new file mode 100644
index 0000000..f833cf9
--- /dev/null
+++ b/docs/html/inherit__graph__5.png
Binary files differ
diff --git a/docs/html/inherit__graph__6.map b/docs/html/inherit__graph__6.map
new file mode 100644
index 0000000..a984b26
--- /dev/null
+++ b/docs/html/inherit__graph__6.map
@@ -0,0 +1,2 @@
+base referer
+rect $classpugi_1_1xpath__node.html 7,8 133,34
diff --git a/docs/html/inherit__graph__6.md5 b/docs/html/inherit__graph__6.md5
new file mode 100644
index 0000000..2019dc5
--- /dev/null
+++ b/docs/html/inherit__graph__6.md5
@@ -0,0 +1 @@
+0a388cc004e983eab729bc6d5c666cce \ No newline at end of file
diff --git a/docs/html/inherit__graph__6.png b/docs/html/inherit__graph__6.png
new file mode 100644
index 0000000..1468a8b
--- /dev/null
+++ b/docs/html/inherit__graph__6.png
Binary files differ
diff --git a/docs/html/inherit__graph__7.map b/docs/html/inherit__graph__7.map
new file mode 100644
index 0000000..95b7466
--- /dev/null
+++ b/docs/html/inherit__graph__7.map
@@ -0,0 +1,2 @@
+base referer
+rect $classpugi_1_1xpath__node__set.html 9,8 158,34
diff --git a/docs/html/inherit__graph__7.md5 b/docs/html/inherit__graph__7.md5
new file mode 100644
index 0000000..e3b0507
--- /dev/null
+++ b/docs/html/inherit__graph__7.md5
@@ -0,0 +1 @@
+7052cf580394885a252e97fd06476596 \ No newline at end of file
diff --git a/docs/html/inherit__graph__7.png b/docs/html/inherit__graph__7.png
new file mode 100644
index 0000000..adc2e3a
--- /dev/null
+++ b/docs/html/inherit__graph__7.png
Binary files differ
diff --git a/docs/html/inherit__graph__8.map b/docs/html/inherit__graph__8.map
new file mode 100644
index 0000000..442f8f7
--- /dev/null
+++ b/docs/html/inherit__graph__8.map
@@ -0,0 +1,2 @@
+base referer
+rect $classpugi_1_1xpath__query.html 9,8 137,34
diff --git a/docs/html/inherit__graph__8.md5 b/docs/html/inherit__graph__8.md5
new file mode 100644
index 0000000..563962a
--- /dev/null
+++ b/docs/html/inherit__graph__8.md5
@@ -0,0 +1 @@
+965d93716ac65e345066d158b1bec3f1 \ No newline at end of file
diff --git a/docs/html/inherit__graph__8.png b/docs/html/inherit__graph__8.png
new file mode 100644
index 0000000..6bfb42e
--- /dev/null
+++ b/docs/html/inherit__graph__8.png
Binary files differ
diff --git a/docs/html/inherits.html b/docs/html/inherits.html
new file mode 100644
index 0000000..310e5fa
--- /dev/null
+++ b/docs/html/inherits.html
@@ -0,0 +1,66 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pugixml: Graphical Class Hierarchy</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6-NO -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li id="current"><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul></div>
+<h1>pugixml Graphical Class Hierarchy</h1><a href="hierarchy.html">Go to the textual class hierarchy</a>
+<p>
+<table border="0" cellspacing="10" cellpadding="0">
+<tr><td><img src="inherit__graph__0.png" border="0" alt="" usemap="#pugi_1_1transfer__ownership__tag_map">
+<map name="pugi_1_1transfer__ownership__tag_map">
+<area href="structpugi_1_1transfer__ownership__tag.html" shape="rect" coords="8,8,202,34" alt="">
+</map></td></tr>
+<tr><td><img src="inherit__graph__1.png" border="0" alt="" usemap="#pugi_1_1xml__attribute_map">
+<map name="pugi_1_1xml__attribute_map">
+<area href="classpugi_1_1xml__attribute.html" shape="rect" coords="7,8,141,34" alt="">
+</map></td></tr>
+<tr><td><img src="inherit__graph__2.png" border="0" alt="" usemap="#pugi_1_1xml__attribute__iterator_map">
+<map name="pugi_1_1xml__attribute__iterator_map">
+<area href="classpugi_1_1xml__attribute__iterator.html" shape="rect" coords="121,7,302,34" alt="">
+<area href="classpugi_1_1xml__node__iterator.html" shape="rect" coords="130,58,293,85" alt="">
+</map></td></tr>
+<tr><td><img src="inherit__graph__3.png" border="0" alt="" usemap="#pugi_1_1xml__node_map">
+<map name="pugi_1_1xml__node_map">
+<area href="classpugi_1_1xml__node.html" shape="rect" coords="9,8,121,34" alt="">
+<area href="classpugi_1_1xml__document.html" shape="rect" coords="170,8,314,34" alt="">
+</map></td></tr>
+<tr><td><img src="inherit__graph__4.png" border="0" alt="" usemap="#pugi_1_1xml__tree__walker_map">
+<map name="pugi_1_1xml__tree__walker_map">
+<area href="classpugi_1_1xml__tree__walker.html" shape="rect" coords="9,8,161,34" alt="">
+</map></td></tr>
+<tr><td><img src="inherit__graph__5.png" border="0" alt="" usemap="#pugi_1_1xpath__exception_map">
+<map name="pugi_1_1xpath__exception_map">
+<area href="classpugi_1_1xpath__exception.html" shape="rect" coords="137,8,289,34" alt="">
+</map></td></tr>
+<tr><td><img src="inherit__graph__6.png" border="0" alt="" usemap="#pugi_1_1xpath__node_map">
+<map name="pugi_1_1xpath__node_map">
+<area href="classpugi_1_1xpath__node.html" shape="rect" coords="7,8,133,34" alt="">
+</map></td></tr>
+<tr><td><img src="inherit__graph__7.png" border="0" alt="" usemap="#pugi_1_1xpath__node__set_map">
+<map name="pugi_1_1xpath__node__set_map">
+<area href="classpugi_1_1xpath__node__set.html" shape="rect" coords="9,8,158,34" alt="">
+</map></td></tr>
+<tr><td><img src="inherit__graph__8.png" border="0" alt="" usemap="#pugi_1_1xpath__query_map">
+<map name="pugi_1_1xpath__query_map">
+<area href="classpugi_1_1xpath__query.html" shape="rect" coords="9,8,137,34" alt="">
+</map></td></tr>
+</table>
+<hr size="1"><address style="align: right;"><small>Generated on Wed Feb 21 22:19:53 2007 for pugixml by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6-NO </small></address>
+</body>
+</html>
diff --git a/docs/html/namespacemembers.html b/docs/html/namespacemembers.html
new file mode 100644
index 0000000..3a874c4
--- /dev/null
+++ b/docs/html/namespacemembers.html
@@ -0,0 +1,62 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pugixml: Class Members</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6-NO -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li id="current"><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="namespaces.html"><span>Namespace List</span></a></li>
+ <li id="current"><a href="namespacemembers.html"><span>Namespace&nbsp;Members</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li id="current"><a href="namespacemembers.html"><span>All</span></a></li>
+ <li><a href="namespacemembers_func.html"><span>Functions</span></a></li>
+ <li><a href="namespacemembers_vars.html"><span>Variables</span></a></li>
+ <li><a href="namespacemembers_enum.html"><span>Enumerations</span></a></li>
+ <li><a href="namespacemembers_eval.html"><span>Enumerator</span></a></li>
+ </ul>
+</div>
+Here is a list of all documented namespace members with links to the namespaces they belong to:
+<p>
+<ul>
+<li>as_utf16()
+: <a class="el" href="namespacepugi.html#557d234d14b2da1cf7ad9b72a05d2698">pugi</a><li>as_utf8()
+: <a class="el" href="namespacepugi.html#55c7bb5900e82254aa1b9671c61030fd">pugi</a><li>format_default
+: <a class="el" href="namespacepugi.html#325f48a35abbaeacdfd8b7fc9ed1713c">pugi</a><li>format_indent
+: <a class="el" href="namespacepugi.html#ce12e8dee65c5bae8ee42a64be7421d3">pugi</a><li>format_raw
+: <a class="el" href="namespacepugi.html#2dd811716b1c0a6a2431ceca43bc649e">pugi</a><li>format_utf8
+: <a class="el" href="namespacepugi.html#9d81ecddcd68e273aa6bcf3864a0e3ee">pugi</a><li>format_write_bom
+: <a class="el" href="namespacepugi.html#b863bcafd203aeaa98953df3a998243f">pugi</a><li>memory_block_size
+: <a class="el" href="namespacepugi.html#bdec38e04651950fe8f585c912143a27">pugi</a><li>node_cdata
+: <a class="el" href="namespacepugi.html#137e94a038e4ab0ada6477cf7f6153a9df13d60a4dfd047be0700e1711aeb1ea">pugi</a><li>node_comment
+: <a class="el" href="namespacepugi.html#137e94a038e4ab0ada6477cf7f6153a9445fef674a66777dfd28dbd6bab14fed">pugi</a><li>node_document
+: <a class="el" href="namespacepugi.html#137e94a038e4ab0ada6477cf7f6153a9ab42ba83cf941f7297325eade205bf80">pugi</a><li>node_element
+: <a class="el" href="namespacepugi.html#137e94a038e4ab0ada6477cf7f6153a96d223e3a0d8ce8e4ee6f4a2697b8bcd1">pugi</a><li>node_null
+: <a class="el" href="namespacepugi.html#137e94a038e4ab0ada6477cf7f6153a9d58c55e810076e076318cc2268191b1f">pugi</a><li>node_pcdata
+: <a class="el" href="namespacepugi.html#137e94a038e4ab0ada6477cf7f6153a95c0042693a8b8b6b54c191b4403fca21">pugi</a><li>node_pi
+: <a class="el" href="namespacepugi.html#137e94a038e4ab0ada6477cf7f6153a9cd772b12b3d5442b9771151f45134440">pugi</a><li>parse_cdata
+: <a class="el" href="namespacepugi.html#47b679897f8bc15e4e152978fc88c208">pugi</a><li>parse_comments
+: <a class="el" href="namespacepugi.html#dcab316176bfaf69158339962fb4ad38">pugi</a><li>parse_default
+: <a class="el" href="namespacepugi.html#d7c927d1c1752330637c3318b0d7b366">pugi</a><li>parse_eol
+: <a class="el" href="namespacepugi.html#d4e017365d2ff3ee04e226c35129b475">pugi</a><li>parse_escapes
+: <a class="el" href="namespacepugi.html#b5ef8454110599611900ff48012c8ad6">pugi</a><li>parse_minimal
+: <a class="el" href="namespacepugi.html#e5058761cfd25d6cdb7e092659dae1fd">pugi</a><li>parse_pi
+: <a class="el" href="namespacepugi.html#8fb7ea408d60b4f2ca79dd30b651f545">pugi</a><li>parse_wconv_attribute
+: <a class="el" href="namespacepugi.html#1e943812f2de36fc3ee14f7756afdbd7">pugi</a><li>parse_wnorm_attribute
+: <a class="el" href="namespacepugi.html#8617ea5ba78c676aff8b7af960cb2f4b">pugi</a><li>parse_ws_pcdata
+: <a class="el" href="namespacepugi.html#e492a24302294f1ce3fbd56f2edbf131">pugi</a><li>xml_node_type
+: <a class="el" href="namespacepugi.html#137e94a038e4ab0ada6477cf7f6153a9">pugi</a></ul>
+<hr size="1"><address style="align: right;"><small>Generated on Wed Feb 21 22:19:52 2007 for pugixml by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6-NO </small></address>
+</body>
+</html>
diff --git a/docs/html/namespacemembers_enum.html b/docs/html/namespacemembers_enum.html
new file mode 100644
index 0000000..e682fba
--- /dev/null
+++ b/docs/html/namespacemembers_enum.html
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pugixml: Class Members</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6-NO -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li id="current"><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="namespaces.html"><span>Namespace List</span></a></li>
+ <li id="current"><a href="namespacemembers.html"><span>Namespace&nbsp;Members</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="namespacemembers.html"><span>All</span></a></li>
+ <li><a href="namespacemembers_func.html"><span>Functions</span></a></li>
+ <li><a href="namespacemembers_vars.html"><span>Variables</span></a></li>
+ <li id="current"><a href="namespacemembers_enum.html"><span>Enumerations</span></a></li>
+ <li><a href="namespacemembers_eval.html"><span>Enumerator</span></a></li>
+ </ul>
+</div>
+&nbsp;
+<p>
+<ul>
+<li>xml_node_type
+: <a class="el" href="namespacepugi.html#137e94a038e4ab0ada6477cf7f6153a9">pugi</a></ul>
+<hr size="1"><address style="align: right;"><small>Generated on Wed Feb 21 22:19:52 2007 for pugixml by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6-NO </small></address>
+</body>
+</html>
diff --git a/docs/html/namespacemembers_eval.html b/docs/html/namespacemembers_eval.html
new file mode 100644
index 0000000..4c55750
--- /dev/null
+++ b/docs/html/namespacemembers_eval.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pugixml: Class Members</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6-NO -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li id="current"><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="namespaces.html"><span>Namespace List</span></a></li>
+ <li id="current"><a href="namespacemembers.html"><span>Namespace&nbsp;Members</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="namespacemembers.html"><span>All</span></a></li>
+ <li><a href="namespacemembers_func.html"><span>Functions</span></a></li>
+ <li><a href="namespacemembers_vars.html"><span>Variables</span></a></li>
+ <li><a href="namespacemembers_enum.html"><span>Enumerations</span></a></li>
+ <li id="current"><a href="namespacemembers_eval.html"><span>Enumerator</span></a></li>
+ </ul>
+</div>
+&nbsp;
+<p>
+<ul>
+<li>node_cdata
+: <a class="el" href="namespacepugi.html#137e94a038e4ab0ada6477cf7f6153a9df13d60a4dfd047be0700e1711aeb1ea">pugi</a><li>node_comment
+: <a class="el" href="namespacepugi.html#137e94a038e4ab0ada6477cf7f6153a9445fef674a66777dfd28dbd6bab14fed">pugi</a><li>node_document
+: <a class="el" href="namespacepugi.html#137e94a038e4ab0ada6477cf7f6153a9ab42ba83cf941f7297325eade205bf80">pugi</a><li>node_element
+: <a class="el" href="namespacepugi.html#137e94a038e4ab0ada6477cf7f6153a96d223e3a0d8ce8e4ee6f4a2697b8bcd1">pugi</a><li>node_null
+: <a class="el" href="namespacepugi.html#137e94a038e4ab0ada6477cf7f6153a9d58c55e810076e076318cc2268191b1f">pugi</a><li>node_pcdata
+: <a class="el" href="namespacepugi.html#137e94a038e4ab0ada6477cf7f6153a95c0042693a8b8b6b54c191b4403fca21">pugi</a><li>node_pi
+: <a class="el" href="namespacepugi.html#137e94a038e4ab0ada6477cf7f6153a9cd772b12b3d5442b9771151f45134440">pugi</a></ul>
+<hr size="1"><address style="align: right;"><small>Generated on Wed Feb 21 22:19:52 2007 for pugixml by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6-NO </small></address>
+</body>
+</html>
diff --git a/docs/html/namespacemembers_func.html b/docs/html/namespacemembers_func.html
new file mode 100644
index 0000000..1c6e897
--- /dev/null
+++ b/docs/html/namespacemembers_func.html
@@ -0,0 +1,38 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pugixml: Class Members</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6-NO -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li id="current"><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="namespaces.html"><span>Namespace List</span></a></li>
+ <li id="current"><a href="namespacemembers.html"><span>Namespace&nbsp;Members</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="namespacemembers.html"><span>All</span></a></li>
+ <li id="current"><a href="namespacemembers_func.html"><span>Functions</span></a></li>
+ <li><a href="namespacemembers_vars.html"><span>Variables</span></a></li>
+ <li><a href="namespacemembers_enum.html"><span>Enumerations</span></a></li>
+ <li><a href="namespacemembers_eval.html"><span>Enumerator</span></a></li>
+ </ul>
+</div>
+&nbsp;
+<p>
+<ul>
+<li>as_utf16()
+: <a class="el" href="namespacepugi.html#557d234d14b2da1cf7ad9b72a05d2698">pugi</a><li>as_utf8()
+: <a class="el" href="namespacepugi.html#55c7bb5900e82254aa1b9671c61030fd">pugi</a></ul>
+<hr size="1"><address style="align: right;"><small>Generated on Wed Feb 21 22:19:52 2007 for pugixml by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6-NO </small></address>
+</body>
+</html>
diff --git a/docs/html/namespacemembers_vars.html b/docs/html/namespacemembers_vars.html
new file mode 100644
index 0000000..9c6d3e2
--- /dev/null
+++ b/docs/html/namespacemembers_vars.html
@@ -0,0 +1,52 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pugixml: Class Members</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6-NO -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li id="current"><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="namespaces.html"><span>Namespace List</span></a></li>
+ <li id="current"><a href="namespacemembers.html"><span>Namespace&nbsp;Members</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="namespacemembers.html"><span>All</span></a></li>
+ <li><a href="namespacemembers_func.html"><span>Functions</span></a></li>
+ <li id="current"><a href="namespacemembers_vars.html"><span>Variables</span></a></li>
+ <li><a href="namespacemembers_enum.html"><span>Enumerations</span></a></li>
+ <li><a href="namespacemembers_eval.html"><span>Enumerator</span></a></li>
+ </ul>
+</div>
+&nbsp;
+<p>
+<ul>
+<li>format_default
+: <a class="el" href="namespacepugi.html#325f48a35abbaeacdfd8b7fc9ed1713c">pugi</a><li>format_indent
+: <a class="el" href="namespacepugi.html#ce12e8dee65c5bae8ee42a64be7421d3">pugi</a><li>format_raw
+: <a class="el" href="namespacepugi.html#2dd811716b1c0a6a2431ceca43bc649e">pugi</a><li>format_utf8
+: <a class="el" href="namespacepugi.html#9d81ecddcd68e273aa6bcf3864a0e3ee">pugi</a><li>format_write_bom
+: <a class="el" href="namespacepugi.html#b863bcafd203aeaa98953df3a998243f">pugi</a><li>memory_block_size
+: <a class="el" href="namespacepugi.html#bdec38e04651950fe8f585c912143a27">pugi</a><li>parse_cdata
+: <a class="el" href="namespacepugi.html#47b679897f8bc15e4e152978fc88c208">pugi</a><li>parse_comments
+: <a class="el" href="namespacepugi.html#dcab316176bfaf69158339962fb4ad38">pugi</a><li>parse_default
+: <a class="el" href="namespacepugi.html#d7c927d1c1752330637c3318b0d7b366">pugi</a><li>parse_eol
+: <a class="el" href="namespacepugi.html#d4e017365d2ff3ee04e226c35129b475">pugi</a><li>parse_escapes
+: <a class="el" href="namespacepugi.html#b5ef8454110599611900ff48012c8ad6">pugi</a><li>parse_minimal
+: <a class="el" href="namespacepugi.html#e5058761cfd25d6cdb7e092659dae1fd">pugi</a><li>parse_pi
+: <a class="el" href="namespacepugi.html#8fb7ea408d60b4f2ca79dd30b651f545">pugi</a><li>parse_wconv_attribute
+: <a class="el" href="namespacepugi.html#1e943812f2de36fc3ee14f7756afdbd7">pugi</a><li>parse_wnorm_attribute
+: <a class="el" href="namespacepugi.html#8617ea5ba78c676aff8b7af960cb2f4b">pugi</a><li>parse_ws_pcdata
+: <a class="el" href="namespacepugi.html#e492a24302294f1ce3fbd56f2edbf131">pugi</a></ul>
+<hr size="1"><address style="align: right;"><small>Generated on Wed Feb 21 22:19:52 2007 for pugixml by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6-NO </small></address>
+</body>
+</html>
diff --git a/docs/html/namespacepugi.html b/docs/html/namespacepugi.html
new file mode 100644
index 0000000..30b9247
--- /dev/null
+++ b/docs/html/namespacepugi.html
@@ -0,0 +1,668 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pugixml: pugi Namespace Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6-NO -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li id="current"><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="namespaces.html"><span>Namespace List</span></a></li>
+ <li><a href="namespacemembers.html"><span>Namespace&nbsp;Members</span></a></li>
+ </ul></div>
+<h1>pugi Namespace Reference</h1><hr><a name="_details"></a><h2>Detailed Description</h2>
+The PugiXML Parser namespace.
+<p>
+
+<p>
+<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xpath__query.html">xpath_query</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">A class that holds compiled XPath query and allows to evaluate query result. <a href="classpugi_1_1xpath__query.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__attribute.html">xml_attribute</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">A light-weight wrapper for manipulating attributes in DOM tree. <a href="classpugi_1_1xml__attribute.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node.html">xml_node</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">A light-weight wrapper for manipulating nodes in DOM tree. <a href="classpugi_1_1xml__node.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__node__iterator.html">xml_node_iterator</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Child node iterator. <a href="classpugi_1_1xml__node__iterator.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__attribute__iterator.html">xml_attribute_iterator</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Attribute iterator. <a href="classpugi_1_1xml__attribute__iterator.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__tree__walker.html">xml_tree_walker</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Abstract tree walker class. <a href="classpugi_1_1xml__tree__walker.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct &nbsp;</td><td class="memItemRight" valign="bottom"><b>xml_memory_block</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="structpugi_1_1transfer__ownership__tag.html">transfer_ownership_tag</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Struct used to distinguish parsing with ownership transfer from parsing without it. <a href="structpugi_1_1transfer__ownership__tag.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xml__document.html">xml_document</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Document class (DOM tree root). <a href="classpugi_1_1xml__document.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xpath__exception.html">xpath_exception</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">XPath exception class. <a href="classpugi_1_1xpath__exception.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xpath__node.html">xpath_node</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">XPath node class. <a href="classpugi_1_1xpath__node.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classpugi_1_1xpath__node__set.html">xpath_node_set</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Not necessarily ordered constant collection of XPath nodes. <a href="classpugi_1_1xpath__node__set.html#_details">More...</a><br></td></tr>
+<tr><td colspan="2"><br><h2>Enumerations</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacepugi.html#137e94a038e4ab0ada6477cf7f6153a9">xml_node_type</a> { <br>
+&nbsp;&nbsp;<a class="el" href="namespacepugi.html#137e94a038e4ab0ada6477cf7f6153a9d58c55e810076e076318cc2268191b1f">node_null</a>,
+<a class="el" href="namespacepugi.html#137e94a038e4ab0ada6477cf7f6153a9ab42ba83cf941f7297325eade205bf80">node_document</a>,
+<a class="el" href="namespacepugi.html#137e94a038e4ab0ada6477cf7f6153a96d223e3a0d8ce8e4ee6f4a2697b8bcd1">node_element</a>,
+<a class="el" href="namespacepugi.html#137e94a038e4ab0ada6477cf7f6153a95c0042693a8b8b6b54c191b4403fca21">node_pcdata</a>,
+<br>
+&nbsp;&nbsp;<a class="el" href="namespacepugi.html#137e94a038e4ab0ada6477cf7f6153a9df13d60a4dfd047be0700e1711aeb1ea">node_cdata</a>,
+<a class="el" href="namespacepugi.html#137e94a038e4ab0ada6477cf7f6153a9445fef674a66777dfd28dbd6bab14fed">node_comment</a>,
+<a class="el" href="namespacepugi.html#137e94a038e4ab0ada6477cf7f6153a9cd772b12b3d5442b9771151f45134440">node_pi</a>
+<br>
+ }</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Tree node classification. <a href="namespacepugi.html#137e94a038e4ab0ada6477cf7f6153a9">More...</a><br></td></tr>
+<tr><td colspan="2"><br><h2>Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">std::string&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacepugi.html#55c7bb5900e82254aa1b9671c61030fd">as_utf8</a> (const wchar_t *str)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Convert utf16 to utf8. <a href="#55c7bb5900e82254aa1b9671c61030fd"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">std::wstring&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacepugi.html#557d234d14b2da1cf7ad9b72a05d2698">as_utf16</a> (const char *str)</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Convert utf8 to utf16. <a href="#557d234d14b2da1cf7ad9b72a05d2698"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Variables</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">const size_t&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacepugi.html#bdec38e04651950fe8f585c912143a27">memory_block_size</a> = 32768</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Memory block size, used for fast allocator. <a href="#bdec38e04651950fe8f585c912143a27"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">const unsigned int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacepugi.html#e5058761cfd25d6cdb7e092659dae1fd">parse_minimal</a> = 0x0000</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Minimal parsing mode. <a href="#e5058761cfd25d6cdb7e092659dae1fd"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">const unsigned int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacepugi.html#8fb7ea408d60b4f2ca79dd30b651f545">parse_pi</a> = 0x0001</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">This flag determines if processing instructions (nodes with type node_pi; such nodes have the form of &lt;? target content ?&gt; or &lt;? target ?&gt; in XML) are to be put in DOM tree. <a href="#8fb7ea408d60b4f2ca79dd30b651f545"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">const unsigned int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacepugi.html#dcab316176bfaf69158339962fb4ad38">parse_comments</a> = 0x0002</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">This flag determines if comments (nodes with type node_comment; such nodes have the form of in XML) are to be put in DOM tree. <a href="#dcab316176bfaf69158339962fb4ad38"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">const unsigned int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacepugi.html#47b679897f8bc15e4e152978fc88c208">parse_cdata</a> = 0x0004</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">This flag determines if CDATA sections (nodes with type node_cdata; such nodes have the form of &lt;![CDATA[[content]]&gt; in XML) are to be put in DOM tree. <a href="#47b679897f8bc15e4e152978fc88c208"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">const unsigned int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacepugi.html#e492a24302294f1ce3fbd56f2edbf131">parse_ws_pcdata</a> = 0x0008</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">This flag determines if nodes with PCDATA (regular text) that consist only of whitespace characters are to be put in DOM tree. <a href="#e492a24302294f1ce3fbd56f2edbf131"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">const unsigned int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacepugi.html#b5ef8454110599611900ff48012c8ad6">parse_escapes</a> = 0x0010</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">This flag determines if character and entity references are to be expanded during the parsing process. <a href="#b5ef8454110599611900ff48012c8ad6"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">const unsigned int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacepugi.html#d4e017365d2ff3ee04e226c35129b475">parse_eol</a> = 0x0020</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">This flag determines if EOL handling (that is, replacing sequences 0x0d 0x0a by a single 0x0a character, and replacing all standalone 0x0d characters by 0x0a) is to be performed on input data (that is, comments contents, PCDATA/CDATA contents and attribute values). <a href="#d4e017365d2ff3ee04e226c35129b475"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">const unsigned int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacepugi.html#8617ea5ba78c676aff8b7af960cb2f4b">parse_wnorm_attribute</a> = 0x0040</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">This flag determines if attribute value normalization should be performed for all attributes, assuming that their type is not CDATA. <a href="#8617ea5ba78c676aff8b7af960cb2f4b"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">const unsigned int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacepugi.html#1e943812f2de36fc3ee14f7756afdbd7">parse_wconv_attribute</a> = 0x0080</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">This flag determines if attribute value normalization should be performed for all attributes, assuming that their type is CDATA. <a href="#1e943812f2de36fc3ee14f7756afdbd7"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">const unsigned int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacepugi.html#d7c927d1c1752330637c3318b0d7b366">parse_default</a> = <a class="el" href="namespacepugi.html#47b679897f8bc15e4e152978fc88c208">parse_cdata</a> | <a class="el" href="namespacepugi.html#b5ef8454110599611900ff48012c8ad6">parse_escapes</a> | <a class="el" href="namespacepugi.html#1e943812f2de36fc3ee14f7756afdbd7">parse_wconv_attribute</a> | <a class="el" href="namespacepugi.html#d4e017365d2ff3ee04e226c35129b475">parse_eol</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">This is the default set of flags. <a href="#d7c927d1c1752330637c3318b0d7b366"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">const unsigned int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacepugi.html#ce12e8dee65c5bae8ee42a64be7421d3">format_indent</a> = 0x01</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Indent the nodes that are written to output stream with as many indentation strings as deep the node is in DOM tree. <a href="#ce12e8dee65c5bae8ee42a64be7421d3"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">const unsigned int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacepugi.html#9d81ecddcd68e273aa6bcf3864a0e3ee">format_utf8</a> = 0x02</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">This flag determines how the non-printable symbols are written to output stream - they are either considered UTF-8 and are written as UTF-8 character, escaped with &amp;#. <a href="#9d81ecddcd68e273aa6bcf3864a0e3ee"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">const unsigned int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacepugi.html#b863bcafd203aeaa98953df3a998243f">format_write_bom</a> = 0x04</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">This flag determines if UTF-8 BOM is to be written to output stream. <a href="#b863bcafd203aeaa98953df3a998243f"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">const unsigned int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacepugi.html#2dd811716b1c0a6a2431ceca43bc649e">format_raw</a> = 0x08</td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">If this flag is on, no indentation is performed and no line breaks are written to output file. <a href="#2dd811716b1c0a6a2431ceca43bc649e"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">const unsigned int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacepugi.html#325f48a35abbaeacdfd8b7fc9ed1713c">format_default</a> = <a class="el" href="namespacepugi.html#ce12e8dee65c5bae8ee42a64be7421d3">format_indent</a> | <a class="el" href="namespacepugi.html#9d81ecddcd68e273aa6bcf3864a0e3ee">format_utf8</a></td></tr>
+
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">This is the default set of formatting flags. <a href="#325f48a35abbaeacdfd8b7fc9ed1713c"></a><br></td></tr>
+</table>
+<hr><h2>Enumeration Type Documentation</h2>
+<a class="anchor" name="137e94a038e4ab0ada6477cf7f6153a9"></a><!-- doxytag: member="pugi::xml_node_type" ref="137e94a038e4ab0ada6477cf7f6153a9" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">enum <a class="el" href="namespacepugi.html#137e94a038e4ab0ada6477cf7f6153a9">pugi::xml_node_type</a> </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Tree node classification.
+<p>
+<dl compact><dt><b>Enumerator: </b></dt><dd>
+<table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" name="137e94a038e4ab0ada6477cf7f6153a9d58c55e810076e076318cc2268191b1f"></a><!-- doxytag: member="node_null" ref="137e94a038e4ab0ada6477cf7f6153a9d58c55e810076e076318cc2268191b1f" args="" -->node_null</em>&nbsp;</td><td>
+Undifferentiated entity. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="137e94a038e4ab0ada6477cf7f6153a9ab42ba83cf941f7297325eade205bf80"></a><!-- doxytag: member="node_document" ref="137e94a038e4ab0ada6477cf7f6153a9ab42ba83cf941f7297325eade205bf80" args="" -->node_document</em>&nbsp;</td><td>
+A document tree's absolute root. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="137e94a038e4ab0ada6477cf7f6153a96d223e3a0d8ce8e4ee6f4a2697b8bcd1"></a><!-- doxytag: member="node_element" ref="137e94a038e4ab0ada6477cf7f6153a96d223e3a0d8ce8e4ee6f4a2697b8bcd1" args="" -->node_element</em>&nbsp;</td><td>
+E.g. '&lt;...&gt;'. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="137e94a038e4ab0ada6477cf7f6153a95c0042693a8b8b6b54c191b4403fca21"></a><!-- doxytag: member="node_pcdata" ref="137e94a038e4ab0ada6477cf7f6153a95c0042693a8b8b6b54c191b4403fca21" args="" -->node_pcdata</em>&nbsp;</td><td>
+E.g. '&gt;...&lt;'. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="137e94a038e4ab0ada6477cf7f6153a9df13d60a4dfd047be0700e1711aeb1ea"></a><!-- doxytag: member="node_cdata" ref="137e94a038e4ab0ada6477cf7f6153a9df13d60a4dfd047be0700e1711aeb1ea" args="" -->node_cdata</em>&nbsp;</td><td>
+E.g. '&lt;![CDATA[...]]&gt;'. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="137e94a038e4ab0ada6477cf7f6153a9445fef674a66777dfd28dbd6bab14fed"></a><!-- doxytag: member="node_comment" ref="137e94a038e4ab0ada6477cf7f6153a9445fef674a66777dfd28dbd6bab14fed" args="" -->node_comment</em>&nbsp;</td><td>
+E.g. ''. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="137e94a038e4ab0ada6477cf7f6153a9cd772b12b3d5442b9771151f45134440"></a><!-- doxytag: member="node_pi" ref="137e94a038e4ab0ada6477cf7f6153a9cd772b12b3d5442b9771151f45134440" args="" -->node_pi</em>&nbsp;</td><td>
+E.g. '&lt;?...?&gt;'. </td></tr>
+</table>
+</dl>
+ </td>
+ </tr>
+</table>
+<hr><h2>Function Documentation</h2>
+<a class="anchor" name="55c7bb5900e82254aa1b9671c61030fd"></a><!-- doxytag: member="pugi::as_utf8" ref="55c7bb5900e82254aa1b9671c61030fd" args="(const wchar_t *str)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">std::string pugi::as_utf8 </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const wchar_t *&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>str</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Convert utf16 to utf8.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>str</em>&nbsp;</td><td>- input UTF16 string </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>output UTF8 string </dd></dl>
+ </td>
+ </tr>
+</table>
+<a class="anchor" name="557d234d14b2da1cf7ad9b72a05d2698"></a><!-- doxytag: member="pugi::as_utf16" ref="557d234d14b2da1cf7ad9b72a05d2698" args="(const char *str)" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">std::wstring pugi::as_utf16 </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const char *&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>str</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Convert utf8 to utf16.
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>str</em>&nbsp;</td><td>- input UTF8 string </td></tr>
+ </table>
+</dl>
+<dl compact><dt><b>Returns:</b></dt><dd>output UTF16 string </dd></dl>
+ </td>
+ </tr>
+</table>
+<hr><h2>Variable Documentation</h2>
+<a class="anchor" name="bdec38e04651950fe8f585c912143a27"></a><!-- doxytag: member="pugi::memory_block_size" ref="bdec38e04651950fe8f585c912143a27" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">const size_t <a class="el" href="namespacepugi.html#bdec38e04651950fe8f585c912143a27">pugi::memory_block_size</a> = 32768 </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Memory block size, used for fast allocator.
+<p>
+Memory for DOM tree is allocated in blocks of memory_block_size + 4. This value affects size of xml_memory class. </td>
+ </tr>
+</table>
+<a class="anchor" name="e5058761cfd25d6cdb7e092659dae1fd"></a><!-- doxytag: member="pugi::parse_minimal" ref="e5058761cfd25d6cdb7e092659dae1fd" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">const unsigned int <a class="el" href="namespacepugi.html#e5058761cfd25d6cdb7e092659dae1fd">pugi::parse_minimal</a> = 0x0000 </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Minimal parsing mode.
+<p>
+Equivalent to turning all other flags off. This set of flags means that pugixml does not add pi/cdata sections or comments to DOM tree and does not perform any conversions for input data, meaning fastest parsing. </td>
+ </tr>
+</table>
+<a class="anchor" name="8fb7ea408d60b4f2ca79dd30b651f545"></a><!-- doxytag: member="pugi::parse_pi" ref="8fb7ea408d60b4f2ca79dd30b651f545" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">const unsigned int <a class="el" href="namespacepugi.html#8fb7ea408d60b4f2ca79dd30b651f545">pugi::parse_pi</a> = 0x0001 </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+This flag determines if processing instructions (nodes with type node_pi; such nodes have the form of &lt;? target content ?&gt; or &lt;? target ?&gt; in XML) are to be put in DOM tree.
+<p>
+If this flag is off, they are not put in the tree, but are still parsed and checked for correctness.<p>
+The corresponding node in DOM tree will have type node_pi, name "target" and value "content", if any.<p>
+Note that &lt;?xml ...?&gt; (document declaration) is not considered to be a PI.<p>
+This flag is off by default. </td>
+ </tr>
+</table>
+<a class="anchor" name="dcab316176bfaf69158339962fb4ad38"></a><!-- doxytag: member="pugi::parse_comments" ref="dcab316176bfaf69158339962fb4ad38" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">const unsigned int <a class="el" href="namespacepugi.html#dcab316176bfaf69158339962fb4ad38">pugi::parse_comments</a> = 0x0002 </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+This flag determines if comments (nodes with type node_comment; such nodes have the form of in XML) are to be put in DOM tree.
+<p>
+If this flag is off, they are not put in the tree, but are still parsed and checked for correctness.<p>
+The corresponding node in DOM tree will have type node_comment, empty name and value "content".<p>
+This flag is off by default. </td>
+ </tr>
+</table>
+<a class="anchor" name="47b679897f8bc15e4e152978fc88c208"></a><!-- doxytag: member="pugi::parse_cdata" ref="47b679897f8bc15e4e152978fc88c208" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">const unsigned int <a class="el" href="namespacepugi.html#47b679897f8bc15e4e152978fc88c208">pugi::parse_cdata</a> = 0x0004 </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+This flag determines if CDATA sections (nodes with type node_cdata; such nodes have the form of &lt;![CDATA[[content]]&gt; in XML) are to be put in DOM tree.
+<p>
+If this flag is off, they are not put in the tree, but are still parsed and checked for correctness.<p>
+The corresponding node in DOM tree will have type node_cdata, empty name and value "content".<p>
+This flag is on by default. </td>
+ </tr>
+</table>
+<a class="anchor" name="e492a24302294f1ce3fbd56f2edbf131"></a><!-- doxytag: member="pugi::parse_ws_pcdata" ref="e492a24302294f1ce3fbd56f2edbf131" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">const unsigned int <a class="el" href="namespacepugi.html#e492a24302294f1ce3fbd56f2edbf131">pugi::parse_ws_pcdata</a> = 0x0008 </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+This flag determines if nodes with PCDATA (regular text) that consist only of whitespace characters are to be put in DOM tree.
+<p>
+Often whitespace-only data is not significant for the application, and the cost of allocating and storing such nodes (both memory and speed-wise) can be significant. For example, after parsing XML string "&lt;node&gt; &lt;a/&gt; &lt;/node&gt;", &lt;node&gt; element will have 3 children when parse_ws_pcdata is set (child with type node_pcdata and value=" ", child with type node_element and name "a", and another child with type node_pcdata and value=" "), and only 1 child when parse_ws_pcdata is not set.<p>
+This flag is off by default. </td>
+ </tr>
+</table>
+<a class="anchor" name="b5ef8454110599611900ff48012c8ad6"></a><!-- doxytag: member="pugi::parse_escapes" ref="b5ef8454110599611900ff48012c8ad6" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">const unsigned int <a class="el" href="namespacepugi.html#b5ef8454110599611900ff48012c8ad6">pugi::parse_escapes</a> = 0x0010 </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+This flag determines if character and entity references are to be expanded during the parsing process.
+<p>
+Character references are &amp;#...; or &amp;x...; (... is Unicode numeric representation of character in either decimal (&amp;#...;) or hexadecimal (&amp;x...;) form), entity references are &amp;...; Note that as pugixml does not handle DTD, the only allowed entities are predefined ones - &amp;lt;, &amp;gt;, &amp;amp;, &amp;apos; and &amp;quot;. If character/entity reference can not be expanded, it is leaved as is, so you can do additional processing later. Reference expansion is performed in attribute values and PCDATA content.<p>
+This flag is on by default. </td>
+ </tr>
+</table>
+<a class="anchor" name="d4e017365d2ff3ee04e226c35129b475"></a><!-- doxytag: member="pugi::parse_eol" ref="d4e017365d2ff3ee04e226c35129b475" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">const unsigned int <a class="el" href="namespacepugi.html#d4e017365d2ff3ee04e226c35129b475">pugi::parse_eol</a> = 0x0020 </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+This flag determines if EOL handling (that is, replacing sequences 0x0d 0x0a by a single 0x0a character, and replacing all standalone 0x0d characters by 0x0a) is to be performed on input data (that is, comments contents, PCDATA/CDATA contents and attribute values).
+<p>
+This flag is on by default. </td>
+ </tr>
+</table>
+<a class="anchor" name="8617ea5ba78c676aff8b7af960cb2f4b"></a><!-- doxytag: member="pugi::parse_wnorm_attribute" ref="8617ea5ba78c676aff8b7af960cb2f4b" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">const unsigned int <a class="el" href="namespacepugi.html#8617ea5ba78c676aff8b7af960cb2f4b">pugi::parse_wnorm_attribute</a> = 0x0040 </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+This flag determines if attribute value normalization should be performed for all attributes, assuming that their type is not CDATA.
+<p>
+This means, that: 1. Whitespace characters (new line, tab and space) are replaced with space (' ') 2. Afterwards sequences of spaces are replaced with a single space 3. Leading/trailing whitespace characters are trimmed<p>
+This flag is off by default. </td>
+ </tr>
+</table>
+<a class="anchor" name="1e943812f2de36fc3ee14f7756afdbd7"></a><!-- doxytag: member="pugi::parse_wconv_attribute" ref="1e943812f2de36fc3ee14f7756afdbd7" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">const unsigned int <a class="el" href="namespacepugi.html#1e943812f2de36fc3ee14f7756afdbd7">pugi::parse_wconv_attribute</a> = 0x0080 </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+This flag determines if attribute value normalization should be performed for all attributes, assuming that their type is CDATA.
+<p>
+This means, that whitespace characters (new line, tab and space) are replaced with space (' '). Note, that the actions performed while this flag is on are also performed if parse_wnorm_attribute is on, so this flag has no effect if parse_wnorm_attribute flag is set.<p>
+This flag is on by default. </td>
+ </tr>
+</table>
+<a class="anchor" name="d7c927d1c1752330637c3318b0d7b366"></a><!-- doxytag: member="pugi::parse_default" ref="d7c927d1c1752330637c3318b0d7b366" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">const unsigned int <a class="el" href="namespacepugi.html#d7c927d1c1752330637c3318b0d7b366">pugi::parse_default</a> = <a class="el" href="namespacepugi.html#47b679897f8bc15e4e152978fc88c208">parse_cdata</a> | <a class="el" href="namespacepugi.html#b5ef8454110599611900ff48012c8ad6">parse_escapes</a> | <a class="el" href="namespacepugi.html#1e943812f2de36fc3ee14f7756afdbd7">parse_wconv_attribute</a> | <a class="el" href="namespacepugi.html#d4e017365d2ff3ee04e226c35129b475">parse_eol</a> </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+This is the default set of flags.
+<p>
+It includes parsing CDATA sections (comments/PIs are not parsed), performing character and entity reference expansion, replacing whitespace characters with spaces in attribute values and performing EOL handling. Note, that PCDATA sections consisting only of whitespace characters are not parsed (by default) for performance reasons. </td>
+ </tr>
+</table>
+<a class="anchor" name="ce12e8dee65c5bae8ee42a64be7421d3"></a><!-- doxytag: member="pugi::format_indent" ref="ce12e8dee65c5bae8ee42a64be7421d3" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">const unsigned int <a class="el" href="namespacepugi.html#ce12e8dee65c5bae8ee42a64be7421d3">pugi::format_indent</a> = 0x01 </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Indent the nodes that are written to output stream with as many indentation strings as deep the node is in DOM tree.
+<p>
+This flag is on by default. </td>
+ </tr>
+</table>
+<a class="anchor" name="9d81ecddcd68e273aa6bcf3864a0e3ee"></a><!-- doxytag: member="pugi::format_utf8" ref="9d81ecddcd68e273aa6bcf3864a0e3ee" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">const unsigned int <a class="el" href="namespacepugi.html#9d81ecddcd68e273aa6bcf3864a0e3ee">pugi::format_utf8</a> = 0x02 </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+This flag determines how the non-printable symbols are written to output stream - they are either considered UTF-8 and are written as UTF-8 character, escaped with &amp;#.
+<p>
+..;, or they are considered to be ASCII and each ASCII character is escaped separately.<p>
+This flag is on by default. </td>
+ </tr>
+</table>
+<a class="anchor" name="b863bcafd203aeaa98953df3a998243f"></a><!-- doxytag: member="pugi::format_write_bom" ref="b863bcafd203aeaa98953df3a998243f" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">const unsigned int <a class="el" href="namespacepugi.html#b863bcafd203aeaa98953df3a998243f">pugi::format_write_bom</a> = 0x04 </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+This flag determines if UTF-8 BOM is to be written to output stream.
+<p>
+This flag is off by default. </td>
+ </tr>
+</table>
+<a class="anchor" name="2dd811716b1c0a6a2431ceca43bc649e"></a><!-- doxytag: member="pugi::format_raw" ref="2dd811716b1c0a6a2431ceca43bc649e" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">const unsigned int <a class="el" href="namespacepugi.html#2dd811716b1c0a6a2431ceca43bc649e">pugi::format_raw</a> = 0x08 </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+If this flag is on, no indentation is performed and no line breaks are written to output file.
+<p>
+This means that the data is written to output stream as is.<p>
+This flag is off by default. </td>
+ </tr>
+</table>
+<a class="anchor" name="325f48a35abbaeacdfd8b7fc9ed1713c"></a><!-- doxytag: member="pugi::format_default" ref="325f48a35abbaeacdfd8b7fc9ed1713c" args="" --><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">const unsigned int <a class="el" href="namespacepugi.html#325f48a35abbaeacdfd8b7fc9ed1713c">pugi::format_default</a> = <a class="el" href="namespacepugi.html#ce12e8dee65c5bae8ee42a64be7421d3">format_indent</a> | <a class="el" href="namespacepugi.html#9d81ecddcd68e273aa6bcf3864a0e3ee">format_utf8</a> </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+This is the default set of formatting flags.
+<p>
+It includes indenting nodes depending on their depth in DOM tree and considering input data to be UTF-8. </td>
+ </tr>
+</table>
+<hr size="1"><address style="align: right;"><small>Generated on Wed Feb 21 22:19:50 2007 for pugixml by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6-NO </small></address>
+</body>
+</html>
diff --git a/docs/html/namespaces.html b/docs/html/namespaces.html
new file mode 100644
index 0000000..b52fc10
--- /dev/null
+++ b/docs/html/namespaces.html
@@ -0,0 +1,26 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pugixml: Namespace Index</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6-NO -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li id="current"><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li id="current"><a href="namespaces.html"><span>Namespace List</span></a></li>
+ <li><a href="namespacemembers.html"><span>Namespace&nbsp;Members</span></a></li>
+ </ul></div>
+<h1>pugixml Namespace List</h1>Here is a list of all documented namespaces with brief descriptions:<table>
+ <tr><td class="indexkey"><a class="el" href="namespacepugi.html">pugi</a></td><td class="indexvalue">The PugiXML Parser namespace </td></tr>
+</table>
+<hr size="1"><address style="align: right;"><small>Generated on Wed Feb 21 22:19:50 2007 for pugixml by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6-NO </small></address>
+</body>
+</html>
diff --git a/docs/html/structpugi_1_1transfer__ownership__tag.html b/docs/html/structpugi_1_1transfer__ownership__tag.html
new file mode 100644
index 0000000..aea2270
--- /dev/null
+++ b/docs/html/structpugi_1_1transfer__ownership__tag.html
@@ -0,0 +1,35 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>pugixml: pugi::transfer_ownership_tag Struct Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.6-NO -->
+<div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+ </ul></div>
+<div class="tabs">
+ <ul>
+ <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+ </ul></div>
+<div class="nav">
+<a class="el" href="namespacepugi.html">pugi</a>::<a class="el" href="structpugi_1_1transfer__ownership__tag.html">transfer_ownership_tag</a></div>
+<h1>pugi::transfer_ownership_tag Struct Reference</h1><!-- doxytag: class="pugi::transfer_ownership_tag" --><hr><a name="_details"></a><h2>Detailed Description</h2>
+Struct used to distinguish parsing with ownership transfer from parsing without it.
+<p>
+<dl compact><dt><b>See also:</b></dt><dd><a class="el" href="classpugi_1_1xml__document.html#6df96142a186efcbd14a496cd1d54c71">xml_document::parse</a> </dd></dl>
+
+<p>
+<table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+</table>
+<hr size="1"><address style="align: right;"><small>Generated on Wed Feb 21 22:19:51 2007 for pugixml by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6-NO </small></address>
+</body>
+</html>
diff --git a/docs/html/tab_b.gif b/docs/html/tab_b.gif
new file mode 100644
index 0000000..0d62348
--- /dev/null
+++ b/docs/html/tab_b.gif
Binary files differ
diff --git a/docs/html/tab_l.gif b/docs/html/tab_l.gif
new file mode 100644
index 0000000..9b1e633
--- /dev/null
+++ b/docs/html/tab_l.gif
Binary files differ
diff --git a/docs/html/tab_r.gif b/docs/html/tab_r.gif
new file mode 100644
index 0000000..ce9dd9f
--- /dev/null
+++ b/docs/html/tab_r.gif
Binary files differ
diff --git a/docs/html/tabs.css b/docs/html/tabs.css
new file mode 100644
index 0000000..a61552a
--- /dev/null
+++ b/docs/html/tabs.css
@@ -0,0 +1,102 @@
+/* tabs styles, based on http://www.alistapart.com/articles/slidingdoors */
+
+DIV.tabs
+{
+ float : left;
+ width : 100%;
+ background : url("tab_b.gif") repeat-x bottom;
+ margin-bottom : 4px;
+}
+
+DIV.tabs UL
+{
+ margin : 0px;
+ padding-left : 10px;
+ list-style : none;
+}
+
+DIV.tabs LI, DIV.tabs FORM
+{
+ display : inline;
+ margin : 0px;
+ padding : 0px;
+}
+
+DIV.tabs FORM
+{
+ float : right;
+}
+
+DIV.tabs A
+{
+ float : left;
+ background : url("tab_r.gif") no-repeat right top;
+ border-bottom : 1px solid #84B0C7;
+ font-size : x-small;
+ font-weight : bold;
+ text-decoration : none;
+}
+
+DIV.tabs A:hover
+{
+ background-position: 100% -150px;
+}
+
+DIV.tabs A:link, DIV.tabs A:visited,
+DIV.tabs A:active, DIV.tabs A:hover
+{
+ color: #1A419D;
+}
+
+DIV.tabs SPAN
+{
+ float : left;
+ display : block;
+ background : url("tab_l.gif") no-repeat left top;
+ padding : 5px 9px;
+ white-space : nowrap;
+}
+
+DIV.tabs INPUT
+{
+ float : right;
+ display : inline;
+ font-size : 1em;
+}
+
+DIV.tabs TD
+{
+ font-size : x-small;
+ font-weight : bold;
+ text-decoration : none;
+}
+
+
+
+/* Commented Backslash Hack hides rule from IE5-Mac \*/
+DIV.tabs SPAN {float : none;}
+/* End IE5-Mac hack */
+
+DIV.tabs A:hover SPAN
+{
+ background-position: 0% -150px;
+}
+
+DIV.tabs LI#current A
+{
+ background-position: 100% -150px;
+ border-width : 0px;
+}
+
+DIV.tabs LI#current SPAN
+{
+ background-position: 0% -150px;
+ padding-bottom : 6px;
+}
+
+DIV.nav
+{
+ background : none;
+ border : none;
+ border-bottom : 1px solid #84B0C7;
+}
diff --git a/docs/index.html b/docs/index.html
index c843bdb..7c8392f 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -15,17 +15,8 @@
<h2>Contents</h2>
<dl class="index">
<dt><a href="#Introduction">Introduction</a></dt>
- <dt><a href="#DOM">Document Object Model</a></dt>
- <dt><a href="#Documentation">Documentation</a>
- <dd><a href="#Doc_Introduction">Introduction</a></dd>
- <dd><a href="#Doc_Parser">xml_parser class</a></dd>
- <dd><a href="#Doc_Node">xml_node class</a></dd>
- <dd><a href="#Doc_Attribute">xml_attribute class</a></dd>
- <dd><a href="#Doc_Iterators">Iterators</a></dd>
- <dd><a href="#Doc_Misc">Miscellaneous</a></dd>
- <dd><a href="#Doc_Lifetime">Lifetime issues and memory management</a></dd>
- </dt>
- <dt><a href="#Parsing">Parsing process</a></dt>
+ <dt><a href="#QuickStart">Quick start</a></dt>
+ <dt><a href="#Reference">Reference</a></dt>
<dt><a href="#Compliance">W3C compliance</a></dt>
<dt><a href="#ComparisonTable">Comparison with existing parsers</a></dt>
<dt><a href="#FAQ">FAQ</a></dt>
@@ -43,7 +34,7 @@
<p><i>pugixml</i> is just another XML parser. This is a successor to
<a href="http://www.codeproject.com/soap/pugxml.asp">pugxml</a> (well, to be honest, the only part
that is left as is is wildcard matching code; the rest was either heavily refactored or rewritten
-from scratch). The main features (call it USP) are:</p>
+from scratch). The main features are:</p>
<ul>
<li>low memory consumption and fragmentation (the win over <i>pugxml</i> is ~1.3 times, <i>TinyXML</i>
@@ -53,17 +44,17 @@ be seen in <a href="#ComparisonTable">Comparison with existing parsers</a> secti
times, <i>Xerces-DOM</i> - ~17.6 times <a href="#annot-1"><sup>1</sup></a></li>
<li>extremely high parsing speed (well, I'm repeating myself, but it's so fast, that it outperforms
<i>Expat</i> by <b>2.8 times</b> on test XML) <a href="#annot-2"><sup>2</sup></a></li>
-<li>more or less standard-conformant (it will parse any standard-compliant file correctly in w3c-compliance
-mode, with the exception of DTD related issues and XML namespaces)</li>
+<li>more or less standard-conformant (it will parse any standard-compliant file correctly, with the
+exception of DTD related issues)</li>
<li>pretty much error-ignorant (it will not choke on something like &lt;text&gt;You &amp; Me&lt;/text&gt;,
-like <i>expat</i> will; it will try to recover the state even if meeting an error (like finding matching
-tags for closing ones); it will parse files with data in wrong encoding; and so on)</li>
+like <i>expat</i> will; it will parse files with data in wrong encoding; and so on)</li>
<li>clean interface (a heavily refactored pugxml's one)</li>
<li>more or less Unicode-aware (actually, it assumes UTF-8 encoding of the input data, though
it will readily work with ANSI - no UTF-16 for now (see <a href="#Future_work">Future work</a>), with
helper conversion functions (UTF-8 <-> UTF-16/32 (whatever is the default for std::wstring & wchar_t))</li>
-<li>fully standard compliant code (approved by <a href="http://www.comeaucomputing.com/tryitout/">Comeau</a>
-strict mode), multiplatform (tested on win32 only ^_^)</li>
+<li>fully standard compliant C++ code (approved by <a href="http://www.comeaucomputing.com/tryitout/">Comeau</a>
+strict mode); the library is multiplatform (see <a href="#Reference">reference</a> for platforms
+list)</li>
<li>high flexibility. You can control many aspects of file parsing and DOM tree building via parsing
options.
</ul>
@@ -84,10 +75,8 @@ ok with DOM - it should not be a problem, because the overall memory consumption
you'll need a contiguous chunk of memory, which can be a problem).</li>
<li>lack of validation, DTD processing, XML namespaces, proper handling of encoding. If you need those -
go take MSXML or XercesC or anything like that.</li>
-<li>lack of XPath & UTF-16/32 parsing. These are not implemented for now, but they are the features
-for the next release.</li>
-<li>immutability of DOM tree. It's constant. You can't change it. There are good reasons for prohibiting
-that, though it is a thing that will likely be in the next release.</li>
+<li>lack of UTF-16/32 parsing. This is not implemented for now, but this is the features for the next
+release.</li>
</ul>
<hr>
@@ -101,803 +90,345 @@ an XML file were measured.</small>
<hr>
-<a name="DOM">
-<h2>Document Object Model</h2>
+<a name="QuickStart">
+<h2>Quick start</h2>
-<p><i>pugixml</i> is a DOM-based parser. This means, that the XML document is converted to a tree.
-Each XML tag is converted to a node in DOM tree. If a tag is contained in some other tag, its node
-is a child to the outer tag's one. Comments, CDATA sections and PIs (Processing Instructions) also are
-transformed into tree nodes, as is the standalone text. Each node has its type.</p>
+<p>Here there is a small collection of code snippets to help the reader begin using <i>pugixml</i>.</p>
-<p>Here is an example of an XML document:
+<p>For everything you can do with <i>pugixml</i>, you need a document. There are several ways to obtain it:</p>
-<pre>
-<span style='color:#004a43; '>&lt;?</span><span style='color:#004a43; '>xml</span> <span style='color:#004a43; '>version</span><span style='color:#808030; '>=</span><span style='color:#008c00; '>"1.0"</span><span style='color:#004a43; '>?></span>
-<span style='color:#a65700; '>&lt;</span><span style='color:#5f5035; '>mesh</span> <span style='color:#274796; '>name</span><span style='color:#808030; '>=</span><span style='color:#0000e6; '>"</span><span style='color:#0000e6; '>mesh_root</span><span style='color:#0000e6; '>"</span><span style='color:#a65700; '>></span>
- <span style='color:#696969; '>&lt;!--</span><span style='color:#696969; '> here is a mesh node </span><span style='color:#696969; '>--></span>
- some text
- <span style='color:#606060; '>&lt;![CDATA[</span>[someothertext<span style='color:#606060; '>]]></span>
- some more text
- <span style='color:#a65700; '>&lt;</span><span style='color:#5f5035; '>node</span> <span style='color:#274796; '>attr1</span><span style='color:#808030; '>=</span><span style='color:#0000e6; '>"</span><span style='color:#0000e6; '>value1</span><span style='color:#0000e6; '>"</span> <span style='color:#a65700; '>/></span>
- <span style='color:#a65700; '>&lt;</span><span style='color:#5f5035; '>node</span> <span style='color:#274796; '>attr1</span><span style='color:#808030; '>=</span><span style='color:#0000e6; '>"</span><span style='color:#0000e6; '>value2</span><span style='color:#0000e6; '>"</span><span style='color:#a65700; '>></span>
- <span style='color:#004a43; '>&lt;?</span><span style='color:#004a43; '>TARGET</span><span style='color:#004a43; '> somedata</span><span style='color:#004a43; '>?></span>
- <span style='color:#a65700; '>&lt;</span><span style='color:#5f5035; '>innernode</span><span style='color:#a65700; '>/></span>
- <span style='color:#a65700; '>&lt;/</span><span style='color:#5f5035; '>node</span><span style='color:#a65700; '>></span>
-<span style='color:#a65700; '>&lt;/</span><span style='color:#5f5035; '>mesh</span><span style='color:#a65700; '>></span>
-</pre>
-
-It gets converted to the following tree (note, that with some parsing options comments, PIs and CDATA
-sections are not stored in the tree, and with some options there are also nodes with whitespaces
-and the contents of PCDATA sections is a bit different (with trailing/leading whitespaces). So generally
-the resulting DOM tree depends on the parsing options):</p>
-
-<p><img src="tree.png"></p>
-
-<p>The parent-children relations are shown with lines. Some nodes have previous and next siblings
-(for example, the next sibling for node_comment node is node_pcdata with value "some text", and the
-previous sibling for node_element with name "mesh" is node_pi with target "xml" (target for PI nodes
-is stored in the node name)).</p>
-<hr>
-
-<a name="Documentation">
-<h2>Documentation</h2>
-
-<a name="Doc_Introduction">
-<h3>Introduction</h3>
-
-<p><i>pugixml</i> is a library for parsing XML files, which means that you give it XML data some way,
-and it gives you the DOM tree and the ways to traverse it and to get some useful information from it.
-The library source consist of two files, the header <b>pugixml.hpp</b>, and the source code <b>pugixml.cpp</b>.
-You can either compile cpp file in your project, or build a static library (or perhaps even a DLL),
-or make the whole code use inline linkage and make one big file (as it was done in <i>pugxml</i>).
-All library classes reside in namespace <b>pugi</b>, so you can either use fully qualified
-names (<b>pugi::xml_node</b>) or write a using declaration (<b>using namespace pugi;</b>, <b>using
-pugi::xml_node</b>) and use plain names. All classes have the <b>xml_</b> prefix.</p>
-
-<p>By default it's supposed that you compile the source file with your project (add it into your
-project, or add relevant entry in your Makefile, or do whatever you need to do with your compilation
-environment). The library is written in standard-conformant C++ and was tested on win32 platform
-(MSVC 7.1 (2003), MSVC 8.0 (2005)).</p>
-
-<a name="Doc_Parser">
-<h3>xml_parser class</h3>
-
-<p><b>xml_parser</b> class is the core of parsing process; you initiate parsing with it, you get DOM
-tree from it, the nodes and attributes are stored in it. You have two ways to load a file: either
-provide a string with XML-data (it has to be null-terminated, and it will be modified during parsing
-process, so it can not be a piece of read-only memory), or with an <b>std::istream</b> object (any input
-stream, like <b>std::ifstream</b>, <b>std::istringstream</b>, etc.) - in this case the parser will allocate
-the necessary amount of memory (equivalent to stream's size) and read everything from the stream.</p>
-
-<p>The functions for parsing are:
-<dl>
-<dt>
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <b><font color="#0000ff" >void</font></b> <font color="#000000" >parse(std::istream&amp;</font> <font color="#000000" >stream,</font> <b><font color="#0000ff" >unsigned</font></b> <b><font color="#0000ff" >int</font></b> <font color="#000000" >optmsk</font> <font color="#000000" >=</font> <font color="#000000" >parse_noset);</font></font></pre></td></tr></table>
-<dd>This function will create a buffer with the size equal to that of provided <code>stream</code>,
-read the chunk of data from the stream and parse it with provided options (<code>optmsk</code>).
-The stream does not have to persist after the call to the function, the lifetime of internal buffer
-with stream's data is managed by <i>pugixml</i>.
-</dd>
-</dt>
-<dt>&nbsp;</dt>
-<dt>
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >parse(</font><b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >xmlstr,</font> <b><font color="#0000ff" >unsigned</font></b> <b><font color="#0000ff" >int</font></b> <font color="#000000" >optmsk</font> <font color="#000000" >=</font> <font color="#000000" >parse_noset);</font>
-</font></pre></td></tr></table>
-<dd>This function parses the provided string with provided options, and returns the position where the
-parsing stopped (do not expect, that parsing will stop on every error, or on most of them - as I've
-said, <i>pugixml</i> is error ignorant). The input string is modified. The string must persist for the
-lifetime of the parser.
-</dt>
-<dt>&nbsp;</dt>
-<dt>
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >parse(</font><b><font color="#0000ff" >const</font></b> <font color="#000000">ownership_transfer_tag&amp;,</font> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >xmlstr,</font> <b><font color="#0000ff" >unsigned</font></b> <b><font color="#0000ff" >int</font></b> <font color="#000000" >optmsk</font> <font color="#000000" >=</font> <font color="#000000" >parse_noset);</font>
-</font></pre></td></tr></table>
-<dd>This function parses the provided string with provided options, and returns the position where the
-parsing stopped (do not expect, that parsing will stop on every error, or on most of them - as I've
-said, <i>pugixml</i> is error ignorant). The input string is modified. The string's ownership is
-managed by parser (string's memory is freed automatically when parser's destructor is called).</dt>
-<dt>&nbsp;</dt>
-<dt>
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <font color="#000000" >xml_parser(std::istream&amp;</font> <font color="#000000" >stream,</font> <b><font color="#0000ff" >unsigned</font></b> <b><font color="#0000ff" >int</font></b> <font color="#000000" >optmsk</font> <font color="#000000" >=</font> <font color="#000000" >parse_default);</font></font></pre></td></tr></table>
-<dd>Just a convenience ctor, that calls the corresponding parse() function.</dd>
-</dt>
-<dt>&nbsp;</dt>
-<dt>
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <font color="#000000" >xml_parser(</font><b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >xmlstr,</font> <b><font color="#0000ff" >unsigned</font></b> <b><font color="#0000ff" >int</font></b> <font color="#000000" >optmsk</font> <font color="#000000" >=</font> <font color="#000000" >parse_default);</font></font></pre></td></tr></table>
-<dd>Just a convenience ctor, that calls the corresponding parse() function.</dd>
-</dt>
-<dt>&nbsp;</dt>
-<dt>
<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <font color="#000000" >xml_parser(</font><b><font color="#0000ff" >const</font></b> <font color="#000000">ownership_transfer_tag&amp;,</font> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >xmlstr,</font> <b><font color="#0000ff" >unsigned</font></b> <b><font color="#0000ff" >int</font></b> <font color="#000000" >optmsk</font> <font color="#000000" >=</font> <font color="#000000" >parse_default);</font></font></pre></td></tr></table>
-<dd>Just a convenience ctor, that calls the corresponding parse() function.</dd>
-</dt>
-</dl>
-
-<p>If you want to provide XML data after the creation of the parser, use the default ctor. Otherwise
-you are free to use either parsing ctors or default ctor and later - parsing function.</p>
-
-<p>After parsing an XML file, you'll get a DOM tree. To get access to it (or, more precisely, to its
-root), call either <b>document()</b> function or cast <b>xml_parser</b> object to <b>xml_node</b> by
-using the following functions:</p>
-
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <b><font color="#0000ff" >operator</font></b> <font color="#000000" >xml_node()</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
- <font color="#000000" >xml_node</font> <font color="#000000" >document()</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
-</font></pre></td></tr></table>
-
-<p>Ok, easy part is behind - now let's dive into parsing options. There is a variety of them, and you
-must choose them wisely to get the needed results and the best speed/least memory overhead. At first,
-there are flags that determine which parts of the document will be put into DOM tree, and which will
-be just skipped:</p>
-
-<ul>
-<li>If <b>parse_pi</b> is on, then processing instructions (<b>&lt;? ... ?&gt;</b>) are put into DOM
-tree (with node type <b>node_pi</b>) otherwise they are discarded. Note that for now the prolog
-(&lt;?xml ... ?&gt;) is parsed as a processing instruction.
-<br>Default value: off
-<br>In W3C mode: on</li>
-<li>If <b>parse_comments</b> is on, then comments (<b>&lt;!-- ... --&gt;</b>) are put into DOM
-tree (with node type <b>node_comment</b>) otherwise they are discarded.
-<br>Default value: off
-<br>In W3C mode: on</li>
-<li>If <b>parse_cdata</b> is on, then the content of CDATA section (<b>&lt;![CDATA[[ ... ]]&gt;</b>)
-is put into DOM tree (with node type <b>node_cdata</b>) otherwise it is discarded.
-<br>Default value: on
-<br>In W3C mode: on</li>
-<li>If <b>parse_ws_pcdata</b> is off, then the content of PCDATA section (it's the plain text
-in the node, like in <b>&lt;some_tag&gt;Hello!&lt;/some_tag&gt;</b>) is discarded if it consists only
-of space-like characters (spaces, tabs and newlines).
-<br>Default value: off
-<br>In W3C mode: on</li>
-<li>If <b>parse_ext_pcdata</b> is off, then the content of PCDATA section is discarded if it belongs
-to root (document) node, that is it does not have a parent tag.
-<br>Default value: on
-<br>In W3C mode: off</li>
-</ul>
-
-<p>Then there are flags that determine how the processing of the retrieved data is done. There are
-several reasons for these flags, mainly:
-<ul>
-<li>parsing speed. The less processing - the more speed.</li>
-<li>data fetching comfort. Sometimes you're ok with messed linefeeds, sometimes you're not. Sometimes
-you want your PCDATA trimmed, sometimes you do not. Sometimes you want your attribute values normalized,
-sometimes you do not. Some of these are normally specified in DOCTYPE, though...
-<li>...parser is not DOCTYPE aware (and will never be), so you need a way to set those properties -
-if not on per-node basis, then on per-document</li>
-</ul>
-So, these are the processing flags:
-</p>
-
-<ul>
-<li>If <b>parse_escapes</b> is on, then the character reference expansion is done for PCDATA content
-and for attribute values (replacing &lt;lt; with &lt;, &amp;#4c; with L, etc.).
-<br>Default value: on
-<br>In W3C mode: on</li>
-<li>If <b>parse_wnorm_attribute</b> is on, then the whitespace normalisation is done for attribute
-values (this includes replacing any space-like character by a space character, converting sequences of
-spaces into a single space and trimming of leading/trailing spaces)
-<br>Default value: off
-<br>In W3C mode: off</li>
-<li>If <b>parse_wconv_attribute</b> is on, then the whitespace conversion is done for attribute
-values (this is a subset of whitespace normalization, and includes only replacing space-like characters
-with spaces). If <b>parse_wnorm_attribute</b> is on, this flag has no effect.
-<br>Default value: on
-<br>In W3C mode: on</li>
-<li>If <b>parse_eol</b> is on, then the end-of-line handling is done for PCDATA/CDATA content and for
-attribute values (this includes converting any pair of 0x0d 0x0a characters to a single 0x0a and
-converting any standalone 0x0d to 0x0a).
-<br>Default value: on
-<br>In W3C mode: on</li>
-</ul>
-
-<p>Finally, there are two more flags, that indicate closing tag parsing. When <i>pugixml</i> meets a
-close tags, there are three ways:
-<ul>
-<li>check that the tag name matches the opening tag, return an error if it does not. This is a
-standard-compliant way, is controlled by <b>parse_check_end_tags</b> flag, which is on in W3C mode</li>
-<li>try to find the corresponding tag name (so that <b>&lt;foo&gt; &lt;bar&gt; &lt;/foo&gt;</b> will be parsed
-correctly). This is controlled by <b>parse_match_end_tags</b>, which is on by default</li>
-<li>just treat the tag as a closing tag for the node (so that <b>&lt;foo&gt; ... &lt;/bar&gt;</b> will
-be parsed as <b>&lt;foo&gt; ... &lt;/foo&gt;</b>). This is the fastest way, and this is what <i>pugxml</i>
-is doing, but it can corrupt your DOM tree. This way is chosen if both <b>parse_check_end_tags</b> and
-<b>parse_match_end_tags</b> are off.
-</ul>
-Note, that these 2 flags are mutually exclusive.
-</p>
-
-<p>Did I say finally? Ok, so <b>finally</b> there are some helper flags, or better groups of flags.
-These are:
-<ul>
-<li><b>parse_minimal</b> - no flag is set (this also means the fastest parsing)</li>
-<li><b>parse_default</b> - default set of flags</li>
-<li><b>parse_noset</b> - use the current parser options (see below)</li>
-<li><b>parse_w3c</b> - use the W3C compliance mode</li>
-</ul>
-</p>
-
-<p>A couple of words on flag usage. The parsing options are just a set of bits, with each bit corresponding
-to one flag. You can turn the flag on by OR-ing the options value with this flag's constant:
-<pre>
- parse_w3c | parse_wnorm_attribute
-</pre>
-or turn the flag off by AND-ing the options value with the NEGation of this flag's constant:
-<pre>
- parse_w3c & ~parse_comments
-</pre>
-You can access the current options of parser by <b>options()</b> method:
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <b><font color="#0000ff" >unsigned</font></b> <b><font color="#0000ff" >int</font></b> <font color="#000000" >options()</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
- <b><font color="#0000ff" >unsigned</font></b> <b><font color="#0000ff" >int</font></b> <font color="#000000" >options(</font><b><font color="#0000ff" >unsigned</font></b> <b><font color="#0000ff" >int</font></b> <font color="#000000" >optmsk);</font>
-</font></pre></td></tr></table>
-(the latter one returns previous options). These options are used when <b>parse_noset</b> flag set is
-passed to <b>parse()</b> functions (which is the default value of corresponding parameter).
-</p>
-
-<a name="Doc_Node">
-<h3>xml_node class</h3>
-
-<p>If <b>xml_parser</b> is a heart of constructing a DOM tree from file, <b>xml_node</b> is a heart
-of processing the tree. This is a simple wrapper, so it's small (4/8 bytes, depending on the size of
-pointer), you're free to copy it and it does not own anything. I'll continue with a list of methods
-with their description, with one note in advance. Some functions, that do something according to a
-string-like parameter, have a pair with a suffix <b>_w</b>. The <b>_w</b> suffix tells, that this
-function is doing a wildcard matching, instead of simple string comparison. You're free to use wildcards
-<b>*</b> (that is equal to any sequence of characters (possibly empty)), <b>?</b> (that is equal to
-any character) and character sets (<b>[Abc]</b> means 'any symbol of A, b and c', <b>[A-Z4]</b> means
-'any symbol from A to Z, or 4', <b>[!0-9]</b> means 'any symbol, that is not a digit'). So the wildcard
-<b>?ell_[0-9][0-9]_*</b> will match strings like 'cell_23_xref', 'hell_00_', but will not match the
-strings like 'ell_23_xref', 'cell_0_x' or 'cell_0a_x'.</p>
-
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <i><font color="#808080" >/// Access iterators for this node's collection of child nodes.</font></i>
- <font color="#000000" >iterator</font> <font color="#000000" >begin()</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
- <font color="#000000" >iterator</font> <font color="#000000" >end()</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
-
- <i><font color="#808080" >/// Access iterators for this node's collection of child nodes (same as begin/end).</font></i>
- <font color="#000000" >iterator</font> <font color="#000000" >children_begin()</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
- <font color="#000000" >iterator</font> <font color="#000000" >children_end()</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
-
- <i><font color="#808080" >/// Access iterators for this node's collection of attributes.</font></i>
- <font color="#000000" >attribute_iterator</font> <font color="#000000" >attributes_begin()</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
- <font color="#000000" >attribute_iterator</font> <font color="#000000" >attributes_end()</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
-
- <i><font color="#808080" >/// Access iterators for this node's collection of siblings.</font></i>
- <font color="#000000" >iterator</font> <font color="#000000" >siblings_begin()</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
- <font color="#000000" >iterator</font> <font color="#000000" >siblings_end()</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
-</font></pre></td></tr></table>
-
-<p>Functions, returning the iterators to walk through children/siblings/attributes. More on that in
-<a href="#Doc_Iterators">Iterators</a> section.</p>
-
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <b><font color="#0000ff" >operator</font></b> <font color="#000000" >unspecified_bool_type()</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
-</font></pre></td></tr></table>
-
-<p>This is a safe bool-like conversion operator. You can check node's validity (<b>if (xml_node)</b>,
- <b>if (!xml_node)</b>, <b>if (node1 && node2 && !node3 && cond1 && ...)</b> - you get the idea) with
-it.
-</p>
-
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <b><font color="#0000ff" >bool</font></b> <b><font color="#0000ff" >operator</font></b><font color="#000000" >==(</font><b><font color="#0000ff" >const</font></b> <font color="#000000" >xml_node&amp;</font> <font color="#000000" >r)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
- <b><font color="#0000ff" >bool</font></b> <b><font color="#0000ff" >operator</font></b><font color="#000000" >!=(</font><b><font color="#0000ff" >const</font></b> <font color="#000000" >xml_node&amp;</font> <font color="#000000" >r)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
- <b><font color="#0000ff" >bool</font></b> <b><font color="#0000ff" >operator</font></b><font color="#000000" ><(</font><b><font color="#0000ff" >const</font></b> <font color="#000000" >xml_node&amp;</font> <font color="#000000" >r)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
- <b><font color="#0000ff" >bool</font></b> <b><font color="#0000ff" >operator</font></b><font color="#000000" >>(</font><b><font color="#0000ff" >const</font></b> <font color="#000000" >xml_node&amp;</font> <font color="#000000" >r)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
- <b><font color="#0000ff" >bool</font></b> <b><font color="#0000ff" >operator</font></b><font color="#000000" ><=(</font><b><font color="#0000ff" >const</font></b> <font color="#000000" >xml_node&amp;</font> <font color="#000000" >r)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
- <b><font color="#0000ff" >bool</font></b> <b><font color="#0000ff" >operator</font></b><font color="#000000" >>=(</font><b><font color="#0000ff" >const</font></b> <font color="#000000" >xml_node&amp;</font> <font color="#000000" >r)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
-</font></pre></td></tr></table>
-
-<p>Comparison operators</p>
-
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <b><font color="#0000ff" >bool</font></b> <font color="#000000" >empty()</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
-</font></pre></td></tr></table>
-
-<p><code>if (node.empty())</code> is equivalent to <code>if (!node)</code></p>
-
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <font color="#000000" >xml_node_type</font> <font color="#000000" >type()</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
- <b><font color="#0000ff" >const</font></b> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >name()</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
- <b><font color="#0000ff" >const</font></b> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >value()</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
-</font></pre></td></tr></table>
-
-<p>Access node's properties (type, name and value). If there is no name/value, the corresponding functions
-return <b>""</b> - they <u>never</u> return NULL.</p>
-
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <font color="#000000" >xml_node</font> <font color="#000000" >child(</font><b><font color="#0000ff" >const</font></b> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >name)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
- <font color="#000000" >xml_node</font> <font color="#000000" >child_w(</font><b><font color="#0000ff" >const</font></b> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >name)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
-</font></pre></td></tr></table>
-
-<p>Get a child node with specified name, or <b>xml_node()</b> (this is an invalid node) if nothing is
-found</p>
-
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <font color="#000000" >xml_attribute</font> <font color="#000000" >attribute(</font><b><font color="#0000ff" >const</font></b> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >name)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
- <font color="#000000" >xml_attribute</font> <font color="#000000" >attribute_w(</font><b><font color="#0000ff" >const</font></b> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >name)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
-</font></pre></td></tr></table>
-
-<p>Get an attribute with specified name, or <b>xml_attribute()</b> (this is an invalid attribute) if
-nothing is found</p>
-
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <font color="#000000" >xml_node</font> <font color="#000000" >sibling(</font><b><font color="#0000ff" >const</font></b> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >name)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
- <font color="#000000" >xml_node</font> <font color="#000000" >sibling_w(</font><b><font color="#0000ff" >const</font></b> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >name)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
-</font></pre></td></tr></table>
-
-<p>Get a node's sibling with specified name, or <b>xml_node()</b> if nothing is found.<br>
-<code>node.sibling(name)</code> is equivalent to <code>node.parent().child(name)</code>.</p>
-
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <font color="#000000" >xml_node</font> <font color="#000000" >next_sibling(</font><b><font color="#0000ff" >const</font></b> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >name)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
- <font color="#000000" >xml_node</font> <font color="#000000" >next_sibling_w(</font><b><font color="#0000ff" >const</font></b> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >name)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
- <font color="#000000" >xml_node</font> <font color="#000000" >next_sibling()</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
-</font></pre></td></tr></table>
-
-<p>These functions get the next sibling, that is, one of the siblings of that node, that is to the
-right. <code>next_sibling()</code> just returns the right brother of the node (or <b>xml_node()</b>),
-the two other functions are searching for the sibling with the given name</p>
-
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <font color="#000000" >xml_node</font> <font color="#000000" >previous_sibling(</font><b><font color="#0000ff" >const</font></b> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >name)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
- <font color="#000000" >xml_node</font> <font color="#000000" >previous_sibling_w(</font><b><font color="#0000ff" >const</font></b> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >name)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
- <font color="#000000" >xml_node</font> <font color="#000000" >previous_sibling()</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
-</font></pre></td></tr></table>
-
-<p>These functions do exactly the same as <code>next_sibling</code> ones, with the exception that they
-search for the left siblings.</p>
-
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <font color="#000000" >xml_node</font> <font color="#000000" >parent()</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
-</font></pre></td></tr></table>
-
-<p>Get a parent node. The parent node for the root one (the document) is considered to be the document
-itself.</p>
-
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <b><font color="#0000ff" >const</font></b> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >child_value()</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
-</font></pre></td></tr></table>
-
-<p>Look for the first node of type <b>node_pcdata</b> or <b>node_cdata</b> among the
-children of the current node and return its contents (or <b>""</b> if nothing is found)</p>
-
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <b><font color="#0000ff" >const</font></b> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >child_value(</font><b><font color="#0000ff" >const</font></b> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >name)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
-</font></pre></td></tr></table>
+<font color="#008000" >#include</font> <font color="#ff0000" >&lt;fstream&gt;</font>
+<font color="#008000" >#include</font> <font color="#ff0000" >&lt;iostream&gt;</font>
-<p>This is the convenient way of looking into child's child value - that is, node.child_value(name) is equivalent to node.child(name).child_value().</p>
+<font color="#008000" >#include</font> <font color="#ff0000" >"pugixml.hpp"</font>
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <b><font color="#0000ff" >const</font></b> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >child_value_w(</font><b><font color="#0000ff" >const</font></b> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >name)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
-</font></pre></td></tr></table>
+<b><font color="#0000ff" >using</font></b> <b><font color="#0000ff" >namespace</font></b> <font color="#000000" >std;</font>
+<b><font color="#0000ff" >using</font></b> <b><font color="#0000ff" >namespace</font></b> <font color="#000000" >pugi;</font>
-<p>This is the convenient way of looking into child's child value - that is, node.child_value_w(name) is equivalent to node.child_w(name).child_value().</p>
+<b><font color="#0000ff" >int</font></b> <font color="#000000" >main()</font>
+<font color="#000000" >{</font>
+ <i><font color="#808080" >// Several ways to get XML document</font></i>
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <font color="#000000" >xml_attribute</font> <font color="#000000" >first_attribute()</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
- <font color="#000000" >xml_attribute</font> <font color="#000000" >last_attribute()</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
-</font></pre></td></tr></table>
+ <font color="#000000" >{</font>
+ <i><font color="#808080" >// Load from string</font></i>
+ <font color="#000000" >xml_document</font> <font color="#000000" >doc;</font>
-<p>These functions get the first and last attributes of the node (or <b>xml_attribute()</b> if the node
-has no attributes).</p>
+ <font color="#000000" >cout</font> <font color="#000000" >&lt;&lt;</font> <font color="#000000" >doc.load(</font><font color="#ff0000" >"&lt;sample-xml&gt;some text &lt;b&gt;in bold&lt;/b&gt; here&lt;/sample-xml&gt;"</font><font color="#000000" >)</font> <font color="#000000" >&lt;&lt;</font> <font color="#000000" >endl;</font>
+ <font color="#000000" >}</font>
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <font color="#000000" >xml_node</font> <font color="#000000" >first_child()</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
- <font color="#000000" >xml_node</font> <font color="#000000" >last_child()</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
-</font></pre></td></tr></table>
+ <font color="#000000" >{</font>
+ <i><font color="#808080" >// Load from file</font></i>
+ <font color="#000000" >xml_document</font> <font color="#000000" >doc;</font>
-<p>These functions get the first and last children of the node (or <b>xml_node()</b> if the node has
-no children).</p>
+ <font color="#000000" >cout</font> <font color="#000000" >&lt;&lt;</font> <font color="#000000" >doc.load_file(</font><font color="#ff0000" >"sample.xml"</font><font color="#000000" >)</font> <font color="#000000" >&lt;&lt;</font> <font color="#000000" >endl;</font>
+ <font color="#000000" >}</font>
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <b><font color="#0000ff" >template</font></b> <font color="#000000" >&lt;</font><b><font color="#0000ff" >typename</font></b> <font color="#000000" >OutputIterator&gt;</font> <b><font color="#0000ff" >void</font></b> <font color="#000000" >all_elements_by_name(</font><b><font color="#0000ff" >const</font></b> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >name,</font> <font color="#000000" >OutputIterator</font> <font color="#000000" >it)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
- <b><font color="#0000ff" >template</font></b> <font color="#000000" >&lt;</font><b><font color="#0000ff" >typename</font></b> <font color="#000000" >OutputIterator&gt;</font> <b><font color="#0000ff" >void</font></b> <font color="#000000" >all_elements_by_name_w(</font><b><font color="#0000ff" >const</font></b> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >name,</font> <font color="#000000" >OutputIterator</font> <font color="#000000" >it)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
-</font></pre></td></tr></table>
+ <font color="#000000" >{</font>
+ <i><font color="#808080" >// Load from any input stream (STL)</font></i>
+ <font color="#000000" >xml_document</font> <font color="#000000" >doc;</font>
-<p>Get all elements with the specified name in the subtree (depth-first search) and return them with
-the help of output iterator (i.e. std::back_inserter)</p>
+ <font color="#000000" >std::ifstream</font> <font color="#000000" >in(</font><font color="#ff0000" >"sample.xml"</font><font color="#000000" >);</font>
+ <font color="#000000" >cout</font> <font color="#000000" >&lt;&lt;</font> <font color="#000000" >doc.load(in)</font> <font color="#000000" >&lt;&lt;</font> <font color="#000000" >endl;</font>
+ <font color="#000000" >}</font>
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <b><font color="#0000ff" >template</font></b> <font color="#000000" >&lt;</font><b><font color="#0000ff" >typename</font></b> <font color="#000000" >Predicate&gt;</font> <font color="#000000" >xml_attribute</font> <font color="#000000" >find_attribute(Predicate</font> <font color="#000000" >pred)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
- <b><font color="#0000ff" >template</font></b> <font color="#000000" >&lt;</font><b><font color="#0000ff" >typename</font></b> <font color="#000000" >Predicate&gt;</font> <font color="#000000" >xml_node</font> <font color="#000000" >find_child(Predicate</font> <font color="#000000" >pred)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
- <b><font color="#0000ff" >template</font></b> <font color="#000000" >&lt;</font><b><font color="#0000ff" >typename</font></b> <font color="#000000" >Predicate&gt;</font> <font color="#000000" >xml_node</font> <font color="#000000" >find_element(Predicate</font> <font color="#000000" >pred)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
-</font></pre></td></tr></table>
+ <font color="#000000" >{</font>
+ <i><font color="#808080" >// More advanced: parse the specified string without duplicating it</font></i>
+ <font color="#000000" >xml_document</font> <font color="#000000" >doc;</font>
-<p>Find attribute, child or a node in the subtree (find_element - depth-first search) with the help
-of the given predicate. Predicate should behave like a function which accepts a <b>xml_node</b> or
-<b>xml_attribute</b> (for find_attribute) parameter and returns <b>bool</b>. The first entity for which
-the predicate returned true is returned. If predicate returned false for all entities, <b>xml_node()</b>
-or <b>xml_attribute()</b> is returned.</p>
+ <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >s</font> <font color="#000000" >=</font> <font color="#000000" >new</font> <b><font color="#0000ff" >char</font></b><font color="#000000" >[</font><b><font color="#40b440" >100</font></b><font color="#000000" >];</font>
+ <font color="#000000" >strcpy(s,</font> <font color="#ff0000" >"&lt;sample-xml&gt;some text &lt;b&gt;in bold&lt;/b&gt; here&lt;/sample-xml&gt;"</font><font color="#000000" >);</font>
+ <font color="#000000" >cout</font> <font color="#000000" >&lt;&lt;</font> <font color="#000000" >doc.parse(transfer_ownership_tag(),</font> <font color="#000000" >s)</font> <font color="#000000" >&lt;&lt;</font> <font color="#000000" >endl;</font>
+ <font color="#000000" >}</font>
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <font color="#000000" >xml_node</font> <font color="#000000" >first_element(</font><b><font color="#0000ff" >const</font></b> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >name)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
- <font color="#000000" >xml_node</font> <font color="#000000" >first_element_w(</font><b><font color="#0000ff" >const</font></b> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >name)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
+ <font color="#000000" >{</font>
+ <i><font color="#808080" >// Even more advanced: assume manual lifetime control</font></i>
+ <font color="#000000" >xml_document</font> <font color="#000000" >doc;</font>
- <font color="#000000" >xml_node</font> <font color="#000000" >first_element_by_value(</font><b><font color="#0000ff" >const</font></b> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >name,</font> <b><font color="#0000ff" >const</font></b> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >value)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
- <font color="#000000" >xml_node</font> <font color="#000000" >first_element_by_value_w(</font><b><font color="#0000ff" >const</font></b> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >name,</font> <b><font color="#0000ff" >const</font></b> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >value)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
+ <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >s</font> <font color="#000000" >=</font> <font color="#000000" >new</font> <b><font color="#0000ff" >char</font></b><font color="#000000" >[</font><b><font color="#40b440" >100</font></b><font color="#000000" >];</font>
+ <font color="#000000" >strcpy(s,</font> <font color="#ff0000" >"&lt;sample-xml&gt;some text &lt;b&gt;in bold&lt;/b&gt; here&lt;/sample-xml&gt;"</font><font color="#000000" >);</font>
+ <font color="#000000" >cout</font> <font color="#000000" >&lt;&lt;</font> <font color="#000000" >doc.parse(transfer_ownership_tag(),</font> <font color="#000000" >s)</font> <font color="#000000" >&lt;&lt;</font> <font color="#000000" >endl;</font>
- <font color="#000000" >xml_node</font> <font color="#000000" >first_element_by_attribute(</font><b><font color="#0000ff" >const</font></b> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >name,</font> <b><font color="#0000ff" >const</font></b> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >attr_name,</font> <b><font color="#0000ff" >const</font></b> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >attr_value)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
- <font color="#000000" >xml_node</font> <font color="#000000" >first_element_by_attribute_w(</font><b><font color="#0000ff" >const</font></b> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >name,</font> <b><font color="#0000ff" >const</font></b> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >attr_name,</font> <b><font color="#0000ff" >const</font></b> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >attr_value)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
+ <font color="#000000" >delete[]</font> <font color="#000000" >s;</font> <i><font color="#808080" >// &lt;-- after this point, all string contents of document is invalid!</font></i>
+ <font color="#000000" >}</font>
- <font color="#000000" >xml_node</font> <font color="#000000" >first_element_by_attribute(</font><b><font color="#0000ff" >const</font></b> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >attr_name,</font> <b><font color="#0000ff" >const</font></b> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >attr_value)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
- <font color="#000000" >xml_node</font> <font color="#000000" >first_element_by_attribute_w(</font><b><font color="#0000ff" >const</font></b> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >attr_name,</font> <b><font color="#0000ff" >const</font></b> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >attr_value)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
-</font></pre></td></tr></table>
+ <font color="#000000" >{</font>
+ <i><font color="#808080" >// Or just create document from code?</font></i>
+ <font color="#000000" >xml_document</font> <font color="#000000" >doc;</font>
-<p>Find the first node (depth-first search), which corresponds to the given criteria (i.e. either has
-a matching name, or a matching value, or has an attribute with given name/value, or has an attribute
-and has a matching name). Note that <b>_w</b> versions treat all parameters as wildcards.</p>
+ <i><font color="#808080" >// add nodes to document (see next samples)</font></i>
+ <font color="#000000" >}</font>
+<font color="#000000" >}</font>
+</font></pre></td></tr><tr><td align="right"><b><i><a href="http://dobrokot.nm.ru/WinnieColorizer.html"><font color="#666666">_Winnie C++ Colorizer</font></a></i></b></td></tr></table>
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <font color="#000000" >xml_node</font> <font color="#000000" >first_node(xml_node_type</font> <font color="#000000" >type)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
-</font></pre></td></tr></table>
+<p>This sample should print a row of 1, meaning that all load/parse functions returned true (of course, if sample.xml does not exist or is malformed, there will be 0's)</p>
-<p>Return a first node (depth-first search) with a given type, or <b>xml_node()</b>.</p>
+<p>Once you have your document, there are several ways to extract data from it.</p>
<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <font color="#000000" >std::string</font> <font color="#000000" >path(</font><b><font color="#0000ff" >char</font></b> <font color="#000000" >delimiter</font> <font color="#000000" >=</font> <font color="#ff0000" >'/'</font><font color="#000000" >)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
-</font></pre></td></tr></table>
+<font color="#008000" >#include</font> <font color="#ff0000" >&lt;iostream&gt;</font>
-<p>Get a path of the node (i.e. the string of names of the nodes on the path from the DOM tree root
-to the node, separated with delimiter (/ by default).</p>
+<font color="#008000" >#include</font> <font color="#ff0000" >"pugixml.hpp"</font>
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <font color="#000000" >xml_node</font> <font color="#000000" >first_element_by_path(</font><b><font color="#0000ff" >const</font></b> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >path,</font> <b><font color="#0000ff" >char</font></b> <font color="#000000" >delimiter</font> <font color="#000000" >=</font> <font color="#ff0000" >'/'</font><font color="#000000" >)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
-</font></pre></td></tr></table>
+<b><font color="#0000ff" >using</font></b> <b><font color="#0000ff" >namespace</font></b> <font color="#000000" >std;</font>
+<b><font color="#0000ff" >using</font></b> <b><font color="#0000ff" >namespace</font></b> <font color="#000000" >pugi;</font>
-<p>Get the first element that has the following path. The path can be absolute (beginning with delimiter) or
-relative, '..' means 'up-level' (so if we are at the path <b>mesh/fragment/geometry/stream</b>, <b>../..</b>
-will lead us to <b>mesh/fragment</b>, and <b>/mesh</b> will lead us to <b>mesh</b>).</p>
+<b><font color="#0000ff" >struct</font></b> <font color="#000000" >bookstore_traverser:</font> <b><font color="#0000ff" >public</font></b> <font color="#000000" >xml_tree_walker</font>
+<font color="#000000" >{</font>
+ <b><font color="#0000ff" >virtual</font></b> <b><font color="#0000ff" >bool</font></b> <font color="#000000" >for_each(xml_node&amp;</font> <font color="#000000" >n)</font>
+ <font color="#000000" >{</font>
+ <b><font color="#0000ff" >for</font></b> <font color="#000000" >(</font><b><font color="#0000ff" >int</font></b> <font color="#000000" >i</font> <font color="#000000" >=</font> <b><font color="#40b440" >0</font></b><font color="#000000" >;</font> <font color="#000000" >i</font> <font color="#000000" >&lt;</font> <font color="#000000" >depth();</font> <font color="#000000" >++i)</font> <font color="#000000" >cout</font> <font color="#000000" >&lt;&lt;</font> <font color="#ff0000" >" "</font><font color="#000000" >;</font> <i><font color="#808080" >// indentation</font></i>
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <b><font color="#0000ff" >bool</font></b> <font color="#000000" >traverse(xml_tree_walker&amp;</font> <font color="#000000" >walker)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
-</font></pre></td></tr></table>
+ <b><font color="#0000ff" >if</font></b> <font color="#000000" >(n.type()</font> <font color="#000000" >==</font> <font color="#000000" >node_element)</font> <font color="#000000" >cout</font> <font color="#000000" >&lt;&lt;</font> <font color="#000000" >n.name()</font> <font color="#000000" >&lt;&lt;</font> <font color="#000000" >endl;</font>
+ <b><font color="#0000ff" >else</font></b> <font color="#000000" >cout</font> <font color="#000000" >&lt;&lt;</font> <font color="#000000" >n.value()</font> <font color="#000000" >&lt;&lt;</font> <font color="#000000" >endl;</font>
-<p>Traverse the subtree (beginning with current node) with the walker, return the result. See
-<a href="#Doc_Misc">Miscellaneous</a> section for details.</p>
+ <b><font color="#0000ff" >return</font></b> <b><font color="#0000ff" >true</font></b><font color="#000000" >;</font> <i><font color="#808080" >// continue traversal</font></i>
+ <font color="#000000" >}</font>
+<font color="#000000" >};</font>
-<a name="Doc_Attribute">
-<h3>xml_attribute class</h3>
+<b><font color="#0000ff" >int</font></b> <font color="#000000" >main()</font>
+<font color="#000000" >{</font>
+ <font color="#000000" >xml_document</font> <font color="#000000" >doc;</font>
+ <font color="#000000" >doc.load(</font><font color="#ff0000" >"&lt;bookstore&gt;&lt;book title='ShaderX'&gt;&lt;price&gt;3&lt;/price&gt;&lt;/book&gt;&lt;book title='GPU Gems'&gt;&lt;price&gt;4&lt;/price&gt;&lt;/book&gt;&lt;/bookstore&gt;"</font><font color="#000000" >);</font>
-<p>Like <b>xml_node</b>, <b>xml_attribute</b> is a simple wrapper of the node's attribute.</p>
+ <i><font color="#808080" >// If you want to iterate through nodes...</font></i>
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <b><font color="#0000ff" >bool</font></b> <b><font color="#0000ff" >operator</font></b><font color="#000000" >==(</font><b><font color="#0000ff" >const</font></b> <font color="#000000" >xml_attribute&amp;</font> <font color="#000000" >r)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
- <b><font color="#0000ff" >bool</font></b> <b><font color="#0000ff" >operator</font></b><font color="#000000" >!=(</font><b><font color="#0000ff" >const</font></b> <font color="#000000" >xml_attribute&amp;</font> <font color="#000000" >r)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
- <b><font color="#0000ff" >bool</font></b> <b><font color="#0000ff" >operator</font></b><font color="#000000" >&lt;(</font><b><font color="#0000ff" >const</font></b> <font color="#000000" >xml_attribute&amp;</font> <font color="#000000" >r)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
- <b><font color="#0000ff" >bool</font></b> <b><font color="#0000ff" >operator</font></b><font color="#000000" >&gt;(</font><b><font color="#0000ff" >const</font></b> <font color="#000000" >xml_attribute&amp;</font> <font color="#000000" >r)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
- <b><font color="#0000ff" >bool</font></b> <b><font color="#0000ff" >operator</font></b><font color="#000000" >&lt;=(</font><b><font color="#0000ff" >const</font></b> <font color="#000000" >xml_attribute&amp;</font> <font color="#000000" >r)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
- <b><font color="#0000ff" >bool</font></b> <b><font color="#0000ff" >operator</font></b><font color="#000000" >&gt;=(</font><b><font color="#0000ff" >const</font></b> <font color="#000000" >xml_attribute&amp;</font> <font color="#000000" >r)</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
-</font></pre></td></tr></table>
+ <font color="#000000" >{</font>
+ <i><font color="#808080" >// Get a bookstore node</font></i>
+ <font color="#000000" >xml_node</font> <font color="#000000" >bookstore</font> <font color="#000000" >=</font> <font color="#000000" >doc.child(</font><font color="#ff0000" >"bookstore"</font><font color="#000000" >);</font>
-<p>Comparison operators.</p>
+ <i><font color="#808080" >// Iterate through books</font></i>
+ <b><font color="#0000ff" >for</font></b> <font color="#000000" >(xml_node</font> <font color="#000000" >book</font> <font color="#000000" >=</font> <font color="#000000" >bookstore.child(</font><font color="#ff0000" >"book"</font><font color="#000000" >);</font> <font color="#000000" >book;</font> <font color="#000000" >book</font> <font color="#000000" >=</font> <font color="#000000" >book.next_sibling(</font><font color="#ff0000" >"book"</font><font color="#000000" >))</font>
+ <font color="#000000" >{</font>
+ <font color="#000000" >cout</font> <font color="#000000" >&lt;&lt;</font> <font color="#ff0000" >"Book "</font> <font color="#000000" >&lt;&lt;</font> <font color="#000000" >book.attribute(</font><font color="#ff0000" >"title"</font><font color="#000000" >).value()</font> <font color="#000000" >&lt;&lt;</font> <font color="#ff0000" >", price "</font> <font color="#000000" >&lt;&lt;</font> <font color="#000000" >book.child(</font><font color="#ff0000" >"price"</font><font color="#000000" >).first_child().value()</font> <font color="#000000" >&lt;&lt;</font> <font color="#000000" >endl;</font>
+ <font color="#000000" >}</font>
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <b><font color="#0000ff" >operator</font></b> <font color="#000000" >unspecified_bool_type()</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
-</font></pre></td></tr></table>
+ <i><font color="#808080" >// Output:</font></i>
+ <i><font color="#808080" >// Book ShaderX, price 3</font></i>
+ <i><font color="#808080" >// Book GPU Gems, price 4</font></i>
+ <font color="#000000" >}</font>
-<p>Safe bool conversion - like in <b>xml_node</b>, use this to check for validity.</p>
+ <font color="#000000" >{</font>
+ <i><font color="#808080" >// Alternative way to get a bookstore node (wildcards)</font></i>
+ <font color="#000000" >xml_node</font> <font color="#000000" >bookstore</font> <font color="#000000" >=</font> <font color="#000000" >doc.child_w(</font><font color="#ff0000" >"*[sS]tore"</font><font color="#000000" >);</font> <i><font color="#808080" >// this will select bookstore, anyStore, Store, etc.</font></i>
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <b><font color="#0000ff" >bool</font></b> <font color="#000000" >empty()</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
-</font></pre></td></tr></table>
+ <i><font color="#808080" >// Iterate through books with STL compatible iterators</font></i>
+ <b><font color="#0000ff" >for</font></b> <font color="#000000" >(xml_node::iterator</font> <font color="#000000" >it</font> <font color="#000000" >=</font> <font color="#000000" >bookstore.begin();</font> <font color="#000000" >it</font> <font color="#000000" >!=</font> <font color="#000000" >bookstore.end();</font> <font color="#000000" >++it)</font>
+ <font color="#000000" >{</font>
+ <i><font color="#808080" >// Note the use of helper function child_value()</font></i>
+ <font color="#000000" >cout</font> <font color="#000000" >&lt;&lt;</font> <font color="#ff0000" >"Book "</font> <font color="#000000" >&lt;&lt;</font> <font color="#000000" >it-&gt;attribute(</font><font color="#ff0000" >"title"</font><font color="#000000" >).value()</font> <font color="#000000" >&lt;&lt;</font> <font color="#ff0000" >", price "</font> <font color="#000000" >&lt;&lt;</font> <font color="#000000" >it-&gt;child_value(</font><font color="#ff0000" >"price"</font><font color="#000000" >)</font> <font color="#000000" >&lt;&lt;</font> <font color="#000000" >endl;</font>
+ <font color="#000000" >}</font>
+
+ <i><font color="#808080" >// Output:</font></i>
+ <i><font color="#808080" >// Book ShaderX, price 3</font></i>
+ <i><font color="#808080" >// Book GPU Gems, price 4</font></i>
+ <font color="#000000" >}</font>
-<p>Like with <b>xml_node</b>, <code>if (attr.empty())</code> is equivalent to <code>if (!attr)</code>.
-</p>
+ <font color="#000000" >{</font>
+ <i><font color="#808080" >// You can also traverse the whole tree (or a subtree)</font></i>
+ <font color="#000000" >bookstore_traverser</font> <font color="#000000" >t;</font>
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <font color="#000000" >xml_attribute</font> <font color="#000000" >next_attribute()</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
- <font color="#000000" >xml_attribute</font> <font color="#000000" >previous_attribute()</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
-</font></pre></td></tr></table>
+ <font color="#000000" >doc.traverse(t);</font>
+
+ <i><font color="#808080" >// Output:</font></i>
+ <i><font color="#808080" >// bookstore</font></i>
+ <i><font color="#808080" >// book</font></i>
+ <i><font color="#808080" >// price</font></i>
+ <i><font color="#808080" >// 3</font></i>
+ <i><font color="#808080" >// book</font></i>
+ <i><font color="#808080" >// price</font></i>
+ <i><font color="#808080" >// 4</font></i>
+
+ <font color="#000000" >doc.first_child().traverse(t);</font>
+
+ <i><font color="#808080" >// Output:</font></i>
+ <i><font color="#808080" >// book</font></i>
+ <i><font color="#808080" >// price</font></i>
+ <i><font color="#808080" >// 3</font></i>
+ <i><font color="#808080" >// book</font></i>
+ <i><font color="#808080" >// price</font></i>
+ <i><font color="#808080" >// 4</font></i>
+ <font color="#000000" >}</font>
-<p>Get the next/previous attribute of the node, that owns the current attribute. Return <b>xml_attribute()</b>
-if no such attribute is found.</p>
+ <i><font color="#808080" >// If you want a distinct node...</font></i>
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <b><font color="#0000ff" >const</font></b> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >name()</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
- <b><font color="#0000ff" >const</font></b> <b><font color="#0000ff" >char</font></b><font color="#000000" >*</font> <font color="#000000" >value()</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
-</font></pre></td></tr></table>
+ <font color="#000000" >{</font>
+ <i><font color="#808080" >// You can specify the way to it through child() functions</font></i>
+ <font color="#000000" >cout</font> <font color="#000000" >&lt;&lt;</font> <font color="#000000" >doc.child(</font><font color="#ff0000" >"bookstore"</font><font color="#000000" >).child(</font><font color="#ff0000" >"book"</font><font color="#000000" >).next_sibling().attribute(</font><font color="#ff0000" >"title"</font><font color="#000000" >).value()</font> <font color="#000000" >&lt;&lt;</font> <font color="#000000" >endl;</font>
-<p>Get the name and value of the attribute. These methods never return NULL - they return <b>""</b> instead.</p>
+ <i><font color="#808080" >// Output:</font></i>
+ <i><font color="#808080" >// GPU Gems</font></i>
+
+ <i><font color="#808080" >// You can use a sometimes convenient path function</font></i>
+ <font color="#000000" >cout</font> <font color="#000000" >&lt;&lt;</font> <font color="#000000" >doc.first_element_by_path(</font><font color="#ff0000" >"bookstore/book/price"</font><font color="#000000" >).child_value()</font> <font color="#000000" >&lt;&lt;</font> <font color="#000000" >endl;</font>
+
+ <i><font color="#808080" >// Output:</font></i>
+ <i><font color="#808080" >// 3</font></i>
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <b><font color="#0000ff" >int</font></b> <font color="#000000" >as_int()</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
- <b><font color="#0000ff" >double</font></b> <font color="#000000" >as_double()</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
- <b><font color="#0000ff" >float</font></b> <font color="#000000" >as_float()</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
-</font></pre></td></tr></table>
+ <i><font color="#808080" >// And you can use powerful XPath expressions</font></i>
+ <font color="#000000" >cout</font> <font color="#000000" >&lt;&lt;</font> <font color="#000000" >doc.select_single_node(</font><font color="#ff0000" >"/bookstore/book[@title = 'ShaderX']/price"</font><font color="#000000" >).node().child_value()</font> <font color="#000000" >&lt;&lt;</font> <font color="#000000" >endl;</font>
+
+ <i><font color="#808080" >// Output:</font></i>
+ <i><font color="#808080" >// 3</font></i>
-<p>Convert the value of an attribute to the desired type. If the conversion is not successfull, return
-default value (0 for int, 0.0 for double, 0.0f for float). These functions rely on CRT functions ato*.</p>
+ <i><font color="#808080" >// Of course, XPath is much more powerful</font></i>
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <b><font color="#0000ff" >bool</font></b> <font color="#000000" >as_bool()</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
-</font></pre></td></tr></table>
+ <i><font color="#808080" >// Compile query that prints total price of all Gems book in store</font></i>
+ <font color="#000000" >xpath_query</font> <font color="#000000" >query(</font><font color="#ff0000" >"sum(/bookstore/book[contains(@title, 'Gems')]/price)"</font><font color="#000000" >);</font>
-<p>Convert the value of an attribute to bool. This method returns true if the first character of the
-value is '1', 't', 'T', 'y' or 'Y'. Otherwise it returns false.</p>
+ <font color="#000000" >cout</font> <font color="#000000" >&lt;&lt;</font> <font color="#000000" >query.evaluate_number(doc)</font> <font color="#000000" >&lt;&lt;</font> <font color="#000000" >endl;</font>
-<a name="Doc_Iterators">
-<h3>Iterators</h3>
+ <i><font color="#808080" >// Output:</font></i>
+ <i><font color="#808080" >// 4</font></i>
-<p>Sometimes you have to cycle through the children or the attributes of the node. You can do it either
-by using <b>next_sibling</b>, <b>previous_sibling</b>, <b>next_attribute</b> and <b>previous_attribute</b>
-(along with <b>first_child</b>, <b>last_child</b>, <b>first_attribute</b> and <b>last_attribute</b>),
-or you can use an iterator-like interface. There are two iterator types, <b>xml_node_iterator</b> and
-<b>xml_attribute_iterator</b>. They are bidirectional constant iterators, which means that you can
-either increment or decrement them, and use dereferencing and member access operators to get constant
-access to node/attribute (the constness of iterators may change with the introducing of mutable trees).</p>
+ <i><font color="#808080" >// You can apply the same XPath query to any document. For example, let's add another Gems</font></i>
+ <i><font color="#808080" >// book (more detail about modifying tree in next sample):</font></i>
+ <font color="#000000" >xml_node</font> <font color="#000000" >book</font> <font color="#000000" >=</font> <font color="#000000" >doc.child(</font><font color="#ff0000" >"bookstore"</font><font color="#000000" >).append_child();</font>
+ <font color="#000000" >book.set_name(</font><font color="#ff0000" >"book"</font><font color="#000000" >);</font>
+ <font color="#000000" >book.append_attribute(</font><font color="#ff0000" >"title"</font><font color="#000000" >)</font> <font color="#000000" >=</font> <font color="#ff0000" >"Game Programming Gems 2"</font><font color="#000000" >;</font>
+
+ <font color="#000000" >xml_node</font> <font color="#000000" >price</font> <font color="#000000" >=</font> <font color="#000000" >book.append_child();</font>
+ <font color="#000000" >price.set_name(</font><font color="#ff0000" >"price"</font><font color="#000000" >);</font>
-<p>In order to get the iterators, use corresponding functions of <b>xml_node</b>. Note that <b>_end()</b>
-functions return past-the-end iterator, that is, in order to get the last attribute, you'll have to
-do something like:
+ <font color="#000000" >xml_node</font> <font color="#000000" >price_text</font> <font color="#000000" >=</font> <font color="#000000" >price.append_child(node_pcdata);</font>
+ <font color="#000000" >price_text.set_value(</font><font color="#ff0000" >"5.3"</font><font color="#000000" >);</font>
+
+ <i><font color="#808080" >// Now let's reevaluate query</font></i>
+ <font color="#000000" >cout</font> <font color="#000000" >&lt;&lt;</font> <font color="#000000" >query.evaluate_number(doc)</font> <font color="#000000" >&lt;&lt;</font> <font color="#000000" >endl;</font>
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <b><font color="#0000ff" >if</font></b> <font color="#000000" >(node.attributes_begin()</font> <font color="#000000" >!=</font> <font color="#000000" >node.attributes_end())</font> <i><font color="#808080" >// we have at least one attribute</font></i>
- <font color="#000000" >{</font>
- <font color="#000000" >xml_attribute</font> <font color="#000000" >last_attrib</font> <font color="#000000" >=</font> <font color="#000000" >*(--node.attributes_end());</font>
- <font color="#000000" >...</font>
+ <i><font color="#808080" >// Output:</font></i>
+ <i><font color="#808080" >// 9.3</font></i>
<font color="#000000" >}</font>
-</font></pre></td></tr></table>
-</p>
-
-<a name="Doc_Misc">
-<h3>Miscellaneous</h3>
-
-<p>If you want to traverse a subtree, you can use <b>traverse</b> function. There is a class
-<b>xml_tree_walker</b>, which has some functions that you can override in order to get custom traversing
-(the default one just does nothing).
-
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <b><font color="#0000ff" >virtual</font></b> <b><font color="#0000ff" >bool</font></b> <font color="#000000" >begin(</font><b><font color="#0000ff" >const</font></b> <font color="#000000" >xml_node&amp;);</font>
- <b><font color="#0000ff" >virtual</font></b> <b><font color="#0000ff" >bool</font></b> <font color="#000000" >end(</font><b><font color="#0000ff" >const</font></b> <font color="#000000" >xml_node&amp;);</font>
-</font></pre></td></tr></table>
-
-<p>These functions are called when the processing of the node starts/ends. First <b>begin()</b>
-is called, then all children of the node are processed recursively, then <b>end()</b> is called. If
-any of these functions returns false, the traversing is stopped and the <b>traverse()</b> function
-returns false.</p>
-
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <b><font color="#0000ff" >virtual</font></b> <b><font color="#0000ff" >void</font></b> <font color="#000000" >push();</font>
- <b><font color="#0000ff" >virtual</font></b> <b><font color="#0000ff" >void</font></b> <font color="#000000" >pop();</font>
-</font></pre></td></tr></table>
+<font color="#000000" >}</font>
+</font></pre></td></tr><tr><td align="right"><b><i><a href="http://dobrokot.nm.ru/WinnieColorizer.html"><font color="#666666">_Winnie C++ Colorizer</font></a></i></b></td></tr></table>
-<p>These functions are called before and after the processing of node's children. If node has no children,
-none of these is called. The default behavior is to increment/decrement current node depth.</p>
+<p>Finally, let's get into more details about tree modification and saving.</p>
<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <b><font color="#0000ff" >virtual</font></b> <b><font color="#0000ff" >int</font></b> <font color="#000000" >depth()</font> <b><font color="#0000ff" >const</font></b><font color="#000000" >;</font>
-</font></pre></td></tr></table>
-
-<p>Get the current depth. You can use this function to do your own indentation, for example.</p>
-
-<p>Lets get to some minor notes. You can safely write something like:
+<font color="#008000" >#include</font> <font color="#ff0000" >&lt;iostream&gt;</font>
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
- <b><font color="#0000ff" >bool</font></b> <font color="#000000" >value</font> <font color="#000000" >=</font> <font color="#000000" >node.child(</font><font color="#ff0000" >"stream"</font><font color="#000000" >).attribute(</font><font color="#ff0000" >"compress"</font><font color="#000000" >).as_bool();</font>
-</font></pre></td></tr></table>
-
-If node has a child with the name 'geometry', and this child has an attribute 'compress', than everything
-is ok. If node has a child with the name 'geometry' with no attribute 'compress', then attribute("compress")
-will return xml_attribute(), and the corresponding call to as_bool() will return default value (false).
-If there is no child node 'geometry', the child(...) call will return xml_node(), the subsequent call
-to attribute(...) will return xml_attribute() (because there are no attributes belonging to invalid
-node), and as_bool() will again return false, so this call sequence is perfectly safe.</p>
-
-<a name="Doc_Lifetime">
-<h3>Lifetime issues and memory management</h3>
-
-<p>As parsing is done in-situ, the XML data is to persist during the lifetime of <b>xml_parser</b>. If
-the parsing is called via a function of <b>xml_parser</b>, that accepts <b>char*</b>, you have to ensure
-yourself, that the string will outlive the <b>xml_parser</b> object.</p>
-
-<p>The memory for nodes and attributes is allocated in blocks of data (the blocks form a linked list;
-the default size of the block is 32 kb, though you can change it via changing a <b>memory_block_size</b>
-constant in <b>pugixml.hpp</b> file. Remember that the first block is allocated on stack (it resides
-inside <b>xml_parser</b> object), and all subsequent blocks are allocated on heap, so expect a stack overflow
-when setting too large memory block size), so the <b>xml_parser</b> object (which contains the blocks)
-should outlive all <b>xml_node</b> and <b>xml_attribute</b> objects (as well as iterators), which belong
-to the parser's tree. Again, you should ensure it yourself.</p>
+<font color="#008000" >#include</font> <font color="#ff0000" >"pugixml.hpp"</font>
-<hr>
+<b><font color="#0000ff" >using</font></b> <b><font color="#0000ff" >namespace</font></b> <font color="#000000" >std;</font>
+<b><font color="#0000ff" >using</font></b> <b><font color="#0000ff" >namespace</font></b> <font color="#000000" >pugi;</font>
-<a name="Example">
-<h2>Example</h2>
+<b><font color="#0000ff" >int</font></b> <font color="#000000" >main()</font>
+<font color="#000000" >{</font>
+ <i><font color="#808080" >// For this example, we'll start with an empty document and create nodes in it from code</font></i>
+ <font color="#000000" >xml_document</font> <font color="#000000" >doc;</font>
-<p>Ok, so you are not much of documentation reader, are you? So am I. Let's assume that you're going
-to parse an xml file... something like this:
+ <i><font color="#808080" >// Append several children and set values/names at once</font></i>
+ <font color="#000000" >doc.append_child(node_comment).set_value(</font><font color="#ff0000" >"This is a test comment"</font><font color="#000000" >);</font>
+ <font color="#000000" >doc.append_child().set_name(</font><font color="#ff0000" >"application"</font><font color="#000000" >);</font>
-<pre>
-<span style='color:#004a43; '>&lt;?</span><span style='color:#004a43; '>xml</span> <span style='color:#004a43; '>version</span><span style='color:#808030; '>=</span><span style='color:#008c00; '>"1.0"</span> <span style='color:#004a43; '>encoding</span><span style='color:#808030; '>=</span><span style='color:#0000e6; '>"UTF-8"</span><span style='color:#004a43; '>?></span>
-<span style='color:#a65700; '>&lt;</span><span style='color:#5f5035; '>mesh</span> <span style='color:#274796; '>name</span><span style='color:#808030; '>=</span><span style='color:#0000e6; '>"</span><span style='color:#0000e6; '>Cathedral</span><span style='color:#0000e6; '>"</span><span style='color:#a65700; '>></span>
- <span style='color:#a65700; '>&lt;</span><span style='color:#5f5035; '>fragment</span> <span style='color:#274796; '>name</span><span style='color:#808030; '>=</span><span style='color:#0000e6; '>"</span><span style='color:#0000e6; '>Cathedral</span><span style='color:#0000e6; '>"</span><span style='color:#a65700; '>></span>
- <span style='color:#a65700; '>&lt;</span><span style='color:#5f5035; '>geometry</span><span style='color:#a65700; '>></span>
- <span style='color:#a65700; '>&lt;</span><span style='color:#5f5035; '>stream</span> <span style='color:#274796; '>usage</span><span style='color:#808030; '>=</span><span style='color:#0000e6; '>"</span><span style='color:#0000e6; '>main</span><span style='color:#0000e6; '>"</span> <span style='color:#274796; '>source</span><span style='color:#808030; '>=</span><span style='color:#0000e6; '>"</span><span style='color:#0000e6; '>StAnna.dmesh</span><span style='color:#0000e6; '>"</span> <span style='color:#274796; '>compress</span><span style='color:#808030; '>=</span><span style='color:#0000e6; '>"</span><span style='color:#0000e6; '>true</span><span style='color:#0000e6; '>"</span> <span style='color:#a65700; '>/></span>
- <span style='color:#a65700; '>&lt;</span><span style='color:#5f5035; '>stream</span> <span style='color:#274796; '>usage</span><span style='color:#808030; '>=</span><span style='color:#0000e6; '>"</span><span style='color:#0000e6; '>ao</span><span style='color:#0000e6; '>"</span> <span style='color:#274796; '>source</span><span style='color:#808030; '>=</span><span style='color:#0000e6; '>"</span><span style='color:#0000e6; '>StAnna.ao</span><span style='color:#0000e6; '>"</span> <span style='color:#a65700; '>/></span>
- <span style='color:#a65700; '>&lt;/</span><span style='color:#5f5035; '>geometry</span><span style='color:#a65700; '>></span>
- <span style='color:#a65700; '>&lt;/</span><span style='color:#5f5035; '>fragment</span><span style='color:#a65700; '>></span>
- <span style='color:#a65700; '>&lt;</span><span style='color:#5f5035; '>fragment</span> <span style='color:#274796; '>name</span><span style='color:#808030; '>=</span><span style='color:#0000e6; '>"</span><span style='color:#0000e6; '>Cathedral</span><span style='color:#0000e6; '>"</span><span style='color:#a65700; '>></span>
- ...
- <span style='color:#a65700; '>&lt;/</span><span style='color:#5f5035; '>fragment</span><span style='color:#a65700; '>></span>
- ...
-<span style='color:#a65700; '>&lt;/</span><span style='color:#5f5035; '>mesh</span><span style='color:#a65700; '>></span>
-</pre>
+ <i><font color="#808080" >// Let's add a few modules</font></i>
+ <font color="#000000" >xml_node</font> <font color="#000000" >application</font> <font color="#000000" >=</font> <font color="#000000" >doc.child(</font><font color="#ff0000" >"application"</font><font color="#000000" >);</font>
-<p>&lt;mesh&gt; is a root node, it has 0 or more &lt;fragment&gt;s, each of them has a &lt;geometry&gt;
-node, and there are &lt;stream&gt; nodes with the shown attributes. We'd like to parse the file and...
-well, and do something with it's contents. There are several methods of doing that; I'll show 2 of them
-(the remaining one is using iterators).</p>
+ <i><font color="#808080" >// Save node wrapper for convenience</font></i>
+ <font color="#000000" >xml_node</font> <font color="#000000" >module_a</font> <font color="#000000" >=</font> <font color="#000000" >application.append_child();</font>
+ <font color="#000000" >module_a.set_name(</font><font color="#ff0000" >"module"</font><font color="#000000" >);</font>
+
+ <i><font color="#808080" >// Add an attribute, immediately setting it's value</font></i>
+ <font color="#000000" >module_a.append_attribute(</font><font color="#ff0000" >"name"</font><font color="#000000" >).set_value(</font><font color="#ff0000" >"A"</font><font color="#000000" >);</font>
-<p>Here we exploit the knowledge of the strict hierarchy of our XML document and read the nodes from
-DOM tree accordingly. When we have an <b>xml_node</b> object, we can get the desired information from
-it (name, value, attributes list, nearby nodes in a tree - siblings, parent and children).</p>
+ <i><font color="#808080" >// You can use operator=</font></i>
+ <font color="#000000" >module_a.append_attribute(</font><font color="#ff0000" >"folder"</font><font color="#000000" >)</font> <font color="#000000" >=</font> <font color="#ff0000" >"/work/app/module_a"</font><font color="#000000" >;</font>
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
-<font color="#008000" >#include</font> <font color="#ff0000" >&lt;fstream&gt;</font>
-<font color="#008000" >#include</font> <font color="#ff0000" >&lt;vector&gt;</font>
-<font color="#008000" >#include</font> <font color="#ff0000" >&lt;algorithm&gt;</font>
-<font color="#008000" >#include</font> <font color="#ff0000" >&lt;iterator&gt;</font>
+ <i><font color="#808080" >// Or even assign numbers</font></i>
+ <font color="#000000" >module_a.append_attribute(</font><font color="#ff0000" >"status"</font><font color="#000000" >)</font> <font color="#000000" >=</font> <b><font color="#40b440" >85.4</font></b><font color="#000000" >;</font>
-<font color="#008000" >#include</font> <font color="#ff0000" >"pugixml.hpp"</font>
+ <i><font color="#808080" >// Let's add another module</font></i>
+ <font color="#000000" >xml_node</font> <font color="#000000" >module_c</font> <font color="#000000" >=</font> <font color="#000000" >application.append_child();</font>
+ <font color="#000000" >module_c.set_name(</font><font color="#ff0000" >"module"</font><font color="#000000" >);</font>
+ <font color="#000000" >module_c.append_attribute(</font><font color="#ff0000" >"name"</font><font color="#000000" >)</font> <font color="#000000" >=</font> <font color="#ff0000" >"C"</font><font color="#000000" >;</font>
+ <font color="#000000" >module_c.append_attribute(</font><font color="#ff0000" >"folder"</font><font color="#000000" >)</font> <font color="#000000" >=</font> <font color="#ff0000" >"/work/app/module_c"</font><font color="#000000" >;</font>
-<b><font color="#0000ff" >using</font></b> <b><font color="#0000ff" >namespace</font></b> <font color="#000000" >pugi;</font>
+ <i><font color="#808080" >// Oh, we missed module B. Not a problem, let's insert it before module C</font></i>
+ <font color="#000000" >xml_node</font> <font color="#000000" >module_b</font> <font color="#000000" >=</font> <font color="#000000" >application.insert_child_before(node_element,</font> <font color="#000000" >module_c);</font>
+ <font color="#000000" >module_b.set_name(</font><font color="#ff0000" >"module"</font><font color="#000000" >);</font>
+ <font color="#000000" >module_b.append_attribute(</font><font color="#ff0000" >"folder"</font><font color="#000000" >)</font> <font color="#000000" >=</font> <font color="#ff0000" >"/work/app/module_b"</font><font color="#000000" >;</font>
-<b><font color="#0000ff" >int</font></b> <font color="#000000" >main()</font>
-<font color="#000000" >{</font>
- <font color="#000000" >std::ifstream</font> <font color="#000000" >in(</font><font color="#ff0000" >"mesh.xml"</font><font color="#000000" >);</font>
- <font color="#000000" >in.unsetf(std::ios::skipws);</font>
-
- <font color="#000000" >std::vector&lt;</font><b><font color="#0000ff" >char</font></b><font color="#000000" >&gt;</font> <font color="#000000" >buf;</font>
- <font color="#000000" >std::copy(std::istream_iterator&lt;</font><b><font color="#0000ff" >char</font></b><font color="#000000" >&gt;(in),</font> <font color="#000000" >std::istream_iterator&lt;</font><b><font color="#0000ff" >char</font></b><font color="#000000" >&gt;(),</font> <font color="#000000" >std::back_inserter(buf));</font>
- <font color="#000000" >buf.push_back(</font><b><font color="#40b440" >0</font></b><font color="#000000" >);</font> <i><font color="#808080" >// zero-terminate</font></i>
+ <i><font color="#808080" >// We can do the same thing for attributes</font></i>
+ <font color="#000000" >module_b.insert_attribute_before(</font><font color="#ff0000" >"name"</font><font color="#000000" >,</font> <font color="#000000" >module_b.attribute(</font><font color="#ff0000" >"folder"</font><font color="#000000" >))</font> <font color="#000000" >=</font> <font color="#ff0000" >"B"</font><font color="#000000" >;</font>
- <font color="#000000" >xml_parser</font> <font color="#000000" >parser(&amp;buf[</font><b><font color="#40b440" >0</font></b><font color="#000000" >],</font> <font color="#000000" >pugi::parse_w3c);</font>
+ <i><font color="#808080" >// Let's add some text in module A</font></i>
+ <font color="#000000" >module_a.append_child(node_pcdata).set_value(</font><font color="#ff0000" >"Module A description"</font><font color="#000000" >);</font>
- <font color="#000000" >xml_node</font> <font color="#000000" >doc</font> <font color="#000000" >=</font> <font color="#000000" >parser.document();</font>
-
- <b><font color="#0000ff" >if</font></b> <font color="#000000" >(xml_node</font> <font color="#000000" >mesh</font> <font color="#000000" >=</font> <font color="#000000" >doc.first_element(</font><font color="#ff0000" >"mesh"</font><font color="#000000" >))</font>
- <font color="#000000" >{</font>
- <i><font color="#808080" >// store mesh.attribute("name").value()</font></i>
+ <i><font color="#808080" >// Well, there's not much left to do here. Let's output our document to file using several formatting options</font></i>
- <b><font color="#0000ff" >for</font></b> <font color="#000000" >(xml_node</font> <font color="#000000" >fragment</font> <font color="#000000" >=</font> <font color="#000000" >mesh.first_element(</font><font color="#ff0000" >"fragment"</font><font color="#000000" >);</font> <font color="#000000" >fragment;</font> <font color="#000000" >fragment</font> <font color="#000000" >=</font> <font color="#000000" >fragment.next_sibling())</font>
- <font color="#000000" >{</font>
- <i><font color="#808080" >// store fragment.attribute("name").value()</font></i>
+ <font color="#000000" >doc.save_file(</font><font color="#ff0000" >"sample_saved_1.xml"</font><font color="#000000" >);</font>
- <b><font color="#0000ff" >if</font></b> <font color="#000000" >(xml_node</font> <font color="#000000" >geometry</font> <font color="#000000" >=</font> <font color="#000000" >fragment.first_element(</font><font color="#ff0000" >"geometry"</font><font color="#000000" >))</font>
- <b><font color="#0000ff" >for</font></b> <font color="#000000" >(xml_node</font> <font color="#000000" >stream</font> <font color="#000000" >=</font> <font color="#000000" >geometry.first_element(</font><font color="#ff0000" >"stream"</font><font color="#000000" >);</font> <font color="#000000" >stream;</font> <font color="#000000" >stream</font> <font color="#000000" >=</font> <font color="#000000" >stream.next_sibling())</font>
- <font color="#000000" >{</font>
- <i><font color="#808080" >// store stream.attribute("usage").value()</font></i>
- <i><font color="#808080" >// store stream.attribute("source").value()</font></i>
-
- <b><font color="#0000ff" >if</font></b> <font color="#000000" >(stream.attribute(</font><font color="#ff0000" >"compress"</font><font color="#000000" >))</font>
- <i><font color="#808080" >// store stream.attribute("compress").as_bool()</font></i>
+ <i><font color="#808080" >// Contents of file sample_saved_1.xml (tab size = 4):</font></i>
+ <i><font color="#808080" >// &lt;?xml version="1.0"?&gt;</font></i>
+ <i><font color="#808080" >// &lt;!--This is a test comment--&gt;</font></i>
+ <i><font color="#808080" >// &lt;application&gt;</font></i>
+ <i><font color="#808080" >// &lt;module name="A" folder="/work/app/module_a" status="85.4"&gt;Module A description&lt;/module&gt;</font></i>
+ <i><font color="#808080" >// &lt;module name="B" folder="/work/app/module_b" /&gt;</font></i>
+ <i><font color="#808080" >// &lt;module name="C" folder="/work/app/module_c" /&gt;</font></i>
+ <i><font color="#808080" >// &lt;/application&gt;</font></i>
+
+ <i><font color="#808080" >// Let's use two spaces for indentation instead of tab character</font></i>
+ <font color="#000000" >doc.save_file(</font><font color="#ff0000" >"sample_saved_2.xml"</font><font color="#000000" >,</font> <font color="#ff0000" >" "</font><font color="#000000" >);</font>
+
+ <i><font color="#808080" >// Contents of file sample_saved_2.xml:</font></i>
+ <i><font color="#808080" >// &lt;?xml version="1.0"?&gt;</font></i>
+ <i><font color="#808080" >// &lt;!--This is a test comment--&gt;</font></i>
+ <i><font color="#808080" >// &lt;application&gt;</font></i>
+ <i><font color="#808080" >// &lt;module name="A" folder="/work/app/module_a" status="85.4"&gt;Module A description&lt;/module&gt;</font></i>
+ <i><font color="#808080" >// &lt;module name="B" folder="/work/app/module_b" /&gt;</font></i>
+ <i><font color="#808080" >// &lt;module name="C" folder="/work/app/module_c" /&gt;</font></i>
+ <i><font color="#808080" >// &lt;/application&gt;</font></i>
- <font color="#000000" >}</font>
- <font color="#000000" >}</font>
- <font color="#000000" >}</font>
-<font color="#000000" >}</font>
-</font></pre></td></tr></table>
+ <i><font color="#808080" >// Let's save a raw XML file</font></i>
+ <font color="#000000" >doc.save_file(</font><font color="#ff0000" >"sample_saved_3.xml"</font><font color="#000000" >,</font> <font color="#ff0000" >""</font><font color="#000000" >,</font> <font color="#000000" >format_raw);</font>
+
+ <i><font color="#808080" >// Contents of file sample_saved_3.xml:</font></i>
+ <i><font color="#808080" >// &lt;?xml version="1.0"?&gt;&lt;!--This is a test comment--&gt;&lt;application&gt;&lt;module name="A" folder="/work/app/module_a" status="85.4"&gt;Module A description&lt;/module&gt;&lt;module name="B" folder="/work/app/module_b" /&gt;&lt;module name="C" folder="/work/app/module_c" /&gt;&lt;/application&gt;</font></i>
-<p>We can also write a class that will traverse the DOM tree and store the information from nodes based
-on their names, depths, attributes, etc. This way is well known by the users of SAX parsers. To do that,
-we have to write an implementation of <b>xml_tree_walker</b> interface </p>
+ <i><font color="#808080" >// Finally, you can print a subtree to any output stream (including cout)</font></i>
+ <font color="#000000" >doc.child(</font><font color="#ff0000" >"application"</font><font color="#000000" >).child(</font><font color="#ff0000" >"module"</font><font color="#000000" >).print(cout);</font>
-<table width = "100%" bgcolor="#e6e6e6"><tr><td><pre><font color="white">
-<font color="#008000" >#include</font> <font color="#ff0000" >&lt;fstream&gt;</font>
-<font color="#008000" >#include</font> <font color="#ff0000" >&lt;vector&gt;</font>
-<font color="#008000" >#include</font> <font color="#ff0000" >&lt;algorithm&gt;</font>
-<font color="#008000" >#include</font> <font color="#ff0000" >&lt;iterator&gt;</font>
+ <i><font color="#808080" >// Output:</font></i>
+ <i><font color="#808080" >// &lt;module name="A" folder="/work/app/module_a" status="85.4"&gt;Module A description&lt;/module&gt;</font></i>
+<font color="#000000" >}</font>
+</font></pre></td></tr><tr><td align="right"><b><i><a href="http://dobrokot.nm.ru/WinnieColorizer.html"><font color="#666666">_Winnie C++ Colorizer</font></a></i></b></td></tr></table>
-<font color="#008000" >#include</font> <font color="#ff0000" >"pugixml.hpp"</font>
+<p>Note, that these examples do not cover the whole <i>pugixml</i> API. For further information, look into reference section.</p>
-<b><font color="#0000ff" >using</font></b> <b><font color="#0000ff" >namespace</font></b> <font color="#000000" >pugi;</font>
+<hr>
-<b><font color="#0000ff" >struct</font></b> <font color="#000000" >mesh_parser:</font> <b><font color="#0000ff" >public</font></b> <font color="#000000" >xml_tree_walker</font>
-<font color="#000000" >{</font>
- <b><font color="#0000ff" >virtual</font></b> <b><font color="#0000ff" >bool</font></b> <font color="#000000" >begin(</font><b><font color="#0000ff" >const</font></b> <font color="#000000" >xml_node&amp;</font> <font color="#000000" >node)</font>
- <font color="#000000" >{</font>
- <b><font color="#0000ff" >if</font></b> <font color="#000000" >(strcmp(node.name(),</font> <font color="#ff0000" >"mesh"</font><font color="#000000" >)</font> <font color="#000000" >==</font> <b><font color="#40b440" >0</font></b><font color="#000000" >)</font>
- <font color="#000000" >{</font>
- <i><font color="#808080" >// store node.attribute("name").value()</font></i>
- <font color="#000000" >}</font>
- <b><font color="#0000ff" >else</font></b> <b><font color="#0000ff" >if</font></b> <font color="#000000" >(strcmp(node.name(),</font> <font color="#ff0000" >"fragment"</font><font color="#000000" >)</font> <font color="#000000" >==</font> <b><font color="#40b440" >0</font></b><font color="#000000" >)</font>
- <font color="#000000" >{</font>
- <i><font color="#808080" >// store node.attribute("name").value()</font></i>
- <font color="#000000" >}</font>
- <b><font color="#0000ff" >else</font></b> <b><font color="#0000ff" >if</font></b> <font color="#000000" >(strcmp(node.name(),</font> <font color="#ff0000" >"geometry"</font><font color="#000000" >)</font> <font color="#000000" >==</font> <b><font color="#40b440" >0</font></b><font color="#000000" >)</font>
- <font color="#000000" >{</font>
- <i><font color="#808080" >// ...</font></i>
- <font color="#000000" >}</font>
- <b><font color="#0000ff" >else</font></b> <b><font color="#0000ff" >if</font></b> <font color="#000000" >(strcmp(node.name(),</font> <font color="#ff0000" >"stream"</font><font color="#000000" >)</font> <font color="#000000" >==</font> <b><font color="#40b440" >0</font></b><font color="#000000" >)</font>
- <font color="#000000" >{</font>
- <i><font color="#808080" >// store node.attribute("usage").value()</font></i>
- <i><font color="#808080" >// store node.attribute("source").value()</font></i>
-
- <b><font color="#0000ff" >if</font></b> <font color="#000000" >(node.attribute(</font><font color="#ff0000" >"compress"</font><font color="#000000" >))</font>
- <i><font color="#808080" >// store stream.attribute("compress").as_bool()</font></i>
- <font color="#000000" >}</font>
- <b><font color="#0000ff" >else</font></b> <b><font color="#0000ff" >return</font></b> <b><font color="#0000ff" >false</font></b><font color="#000000" >;</font>
+<a name="Reference">
+<h2>Reference</h2>
- <b><font color="#0000ff" >return</font></b> <b><font color="#0000ff" >true</font></b><font color="#000000" >;</font>
- <font color="#000000" >}</font>
-<font color="#000000" >};</font>
+<p><i>pugixml</i> is a library for parsing XML files, which means that you give it XML data some way,
+and it gives you the DOM tree and the ways to traverse it and to get some useful information from it.
+The library source consist of two headers, <b>pugixml.hpp</b> and <b>pugiconfig.hpp</b>, and two source
+files, <b>pugixml.cpp</b> and <b>pugixpath.cpp</b>.
+You can either compile cpp files in your project, or build a static library.
+All library classes reside in namespace <b>pugi</b>, so you can either use fully qualified
+names (<b>pugi::xml_node</b>) or write a using declaration (<b>using namespace pugi;</b>, <b>using
+pugi::xml_node</b>) and use plain names. All classes have eitther <b>xml_</b> or <b>xpath_</b> prefix.</p>
-<b><font color="#0000ff" >int</font></b> <font color="#000000" >main()</font>
-<font color="#000000" >{</font>
- <font color="#000000" >std::ifstream</font> <font color="#000000" >in(</font><font color="#ff0000" >"mesh.xml"</font><font color="#000000" >);</font>
- <font color="#000000" >in.unsetf(std::ios::skipws);</font>
-
- <font color="#000000" >std::vector&lt;</font><b><font color="#0000ff" >char</font></b><font color="#000000" >&gt;</font> <font color="#000000" >buf;</font>
- <font color="#000000" >std::copy(std::istream_iterator&lt;</font><b><font color="#0000ff" >char</font></b><font color="#000000" >&gt;(in),</font> <font color="#000000" >std::istream_iterator&lt;</font><b><font color="#0000ff" >char</font></b><font color="#000000" >&gt;(),</font> <font color="#000000" >std::back_inserter(buf));</font>
- <font color="#000000" >buf.push_back(</font><b><font color="#40b440" >0</font></b><font color="#000000" >);</font> <i><font color="#808080" >// zero-terminate</font></i>
-
- <font color="#000000" >xml_parser</font> <font color="#000000" >parser(&amp;buf[</font><b><font color="#40b440" >0</font></b><font color="#000000" >],</font> <font color="#000000" >pugi::parse_w3c);</font>
+<p>By default it's supposed that you compile the source file with your project (add it into your
+project, or add relevant entry in your Makefile, or do whatever you need to do with your compilation
+environment). The library is written in standard-conformant C++ and was tested on following platforms:</p>
- <font color="#000000" >mesh_parser</font> <font color="#000000" >mp;</font>
+<p>
+<ul>
+<li>Windows 32-bit (MSVC<sup><a href="#annot-3">3</a></sup> 7.0 (2002), MSVC 7.1 (2003), MSVC 8.0 (2005), ICC<sup><a href="#annot-4">4</a></sup> 8.0, ICC 8.1, GCC 3.4.2 (MinGW), BCC<sup><a href="#annot-5">5</a></sup> 5.82)
+<li>Linux 32-bit (GCC 3.2)
+<li>Sony Playstation Portable (GCC 3.4.2; in PUGIXML_NO_STL mode)
+<li>Microsoft Xbox (MSVC 7.1)
+</ul>
+</p>
- <b><font color="#0000ff" >if</font></b> <font color="#000000" >(!parser.document().traverse(mp))</font>
- <i><font color="#808080" >// generate an error</font></i>
-<font color="#000000" >}</font>
-</font></pre></td></tr></table>
+<p>The documentation for <i>pugixml</i> classes, functions and constants <a href="html/index.html">is available here</a>.</p>
<hr>
-<a name="Parsing">
-<h2>Parsing process</h2>
-
-<p>So, let's talk a bit about parsing process, and about the reason for providing XML data as a contiguous
-writeable block of memory. Parsing is done in-situ. This means, that the strings, representing the
-parts of DOM tree (node names, attribute names and values, CDATA content, etc.) are not separately
-allocated on heap, but instead are parts of the original data. This is the keypoint to parsing speed,
-because it helps achieve the minimal amount of memory allocations (more on that below) and minimal
-amount of copying data.</p>
-
-<p>In-situ parsing can be done in two ways, with zero-segmenting the string (that is, set the past-the-end
-character for the part of XML string to 0, see <a href="http://www.codeproject.com/soap/pugxml/pugxml_steps.gif">
-this image</a> for further details), and storing pointer + size of the string instead of pointer to
-the beginning of ASCIIZ string.</p>
-
-<p>Originally, <i>pugxml</i> had only the first way, but then authors added the second method, 'non-segmenting'
-or non-destructive parsing. The advantages of this method are: you no longer need non-constant storage;
-you can even read data from memory-mapped files directly. Well, there are disadvantages.
-For one thing, you can not do any of the transformations in-situ. The transformations that are required
-by XML standard are:
-<ul>
-<li>End of line handling (replacing 0x0d 0x0a with 0x0a and any standalone 0x0d with 0x0a) (for the whole
-document)</li>
-<li>White space normalization for attribute values (converting space-like characters to spaces (0x20),
-sometimes trimming leading/trailing spaces and converting sequences of spaces to a single space</li>
-<li>Character reference expansion (&amp;lt; and alike, &amp;#x0a; and alike, &amp;#40; and alike)</li>
-<li>Entity reference expansion (&amp;entityname;)</li>
-</ul>
-
-None of these can be done in-situ. <i>pugxml</i> did neither character nor entity reference expansion,
-and allocated new memory when normalizing white spaces when in non-destructive mode. I chose complete
-in-situ parsing (the good thing about it is that any transformation, except entity reference, can be
-done in-situ because it does not increase the amount of characters - even converting a character
-reference to UTF-8). There is no entity reference expansion because of this and because I do not want
-to parse DOCTYPE and, moreover, use DOCTYPE in following parsing (performing selective whitespace
-normalization in attributes and CDATA sections and so on).</p>
-
-<p>In order to be able to modify the tree (change attribute/node names & values) with in-situ parsing,
-one needs to implement two ways of storing data (both in-situ and not). The DOM tree is now mutable,
-but it will change in the future releases (without introducing speed/memory overhead, except on clean-
-up stage).</p>
-
-<p>The parsing process itself is more or less straightforward, when you see it - but the impression
-is fake, because the explicit jumps are made (i.e. we know, that if we come to a closing brace (&gt;),
-we should expect CDATA after it (or a new tag), so let's just jump to the corresponding code), and,
-well, there can be bugs (see <a href="#Bugs">Bugs</a> section).</p>
-
-<p>And, to make things worse, memory allocation (which is done only for node and attribute structures)
-is done in pools. The pools are single-linked lists with predefined block size (32 kb by default), and
-well, it increases speed a lot (allocations are slow, and the memory gets fragmented when allocating
-a bunch of 16-byte (attribute) or 40-byte (node) structures)</p>
+<a name="annot-3"><sup>3</sup><small> MSVC is Microsoft Visual C++ Compiler</small> <br>
+<a name="annot-4"><sup>4</sup><small> ICC is Intel C++ Compiler</small> <br>
+<a name="annot-5"><sup>5</sup><small> BCC is Borland C++ Compiler</small>
<hr>
@@ -913,20 +444,17 @@ of ones when using <b>parse_w3c</b> mode):
correctly, let alone use them for parsing
<li>It accepts multiple attributes with the same name in one node
<li>It is charset-ignorant
-<li>It accepts invalid names of tags
<li>It accepts invalid attribute values (those with &lt; in them) and does not reject invalid entity
references or character references (in fact, it does not do DOCTYPE parsing, so it does not perform
entity reference expansion)
<li>It does not reject comments with -- inside
-<li>It does not reject PI with the names of 'xml' and alike; in fact, it parses prolog as a PI, which
-is not conformant
-<li>All characters from #x1 to #x20 are considered to be whitespaces
+<li>It does not reject PI with the names of 'xml' and alike
<li>And some other things that I forgot to mention
</ul>
-In short, it accepts most malformed XML files and does not do anything that is related to DOCTYPE.
-This is because the main goal was developing fast, easy-to-use and error ignorant (so you can always
-get something even from a malformed document) parser, there are some good validating and conformant
+In short, it accepts some malformed XML files and does not do anything that is related to DOCTYPE.
+This is because the main goal was developing fast, easy-to-use and error ignorant (so you can get
+something even from a malformed document) parser, there are some good validating and conformant
parsers already.</p>
<hr>
@@ -1015,9 +543,10 @@ off. The test system is AMD Sempron 2500+, 512 Mb RAM.</p>
<p><b>Q:</b> I do not have/want STL support. How can I compile <i>pugixml</i> without STL?</p>
<p><b>A:</b> There is an undocumented define PUGIXML_NO_STL. If you uncomment the relevant line
in <i>pugixml</i> header file, it will compile without any STL classes. The reason it is undocumented
-are that it will make some documented functions not available (specifically, xml_parser() ctor and
-parse() function that operate on std::istream, xml_node::path function, utf16 and utf8 conversion
-functions). Otherwise, it will work fine.</p>
+are that it will make some documented functions not available (specifically, xml_document::load, that
+operates on std::istream, xml_node::path function, saving functions (xml_node::print, xml_document::save),
+XPath-related functions and classes and as_utf16 and as_utf8 conversion functions). Otherwise, it will
+work fine.</p>
<p><b>Q:</b> Do paths that are accepted by <b>first_element_by_path</b> have to end with delimiter?</p>
<p><b>A:</b> Either way will work, both /path/to/node/ and /path/to/node is fine.</p>
@@ -1048,16 +577,10 @@ do not send executable files.</p>
upper ones will get there sooner).</p>
<ul>
-<li>Support for altering the tree (both changing nodes'/attributes' names and values and adding/deleting
-attributes/nodes) and writing the tree to stream
<li>Support for UTF-16 files (parsing BOM to get file's type and converting UTF-16 file to UTF-8 buffer
if necessary)
-<li>Improved API (I'm going to look at SelectNode from MS XML and perhaps there will be some other
-changes)
-<li>Externally provided entity reference table (or perhaps even taken from DOCTYPE?)
<li>More intelligent parsing of DOCTYPE (it does not always skip DOCTYPE for now)
<li>XML 1.1 changes (changed EOL handling, normalization issues, etc.)
-<li>XPath support
<li>Name your own?
</ul>
@@ -1079,6 +602,28 @@ changes)
<li>Optimizations of strconv_t
</ul>
</dt>
+<dt>21.02.2007 - v0.3
+<dd>Refactored, reworked and improved version. Changes: <ul>
+<li>Interface: <ul>
+<li>Added XPath
+<li>Added tree modification functions
+<li>Added no STL compilation mode
+<li>Added saving document to file
+<li>Refactored parsing flags
+<li>Removed xml_parser class in favor of xml_document
+<li>Added transfer ownership parsing mode
+<li>Modified the way xml_tree_walker works
+<li>Iterators are now non-constant
+</ul>
+<li>Implementation: <ul>
+<li>Support of several compilers and platforms
+<li>Refactored and sped up parsing core
+<li>Improved standard compliancy
+<li>Added XPath implementation
+<li>Fixed several bugs
+</ul>
+</dd>
+</dt>
</dl>
<hr>
@@ -1099,7 +644,7 @@ changes)
<p>The <i>pugixml</i> parser is distributed under the MIT license:</p>
<pre>
-Copyright (c) 2006 Arseny Kapoulkine
+Copyright (c) 2006-2007 Arseny Kapoulkine
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
@@ -1125,7 +670,7 @@ OTHER DEALINGS IN THE SOFTWARE.
<hr>
-<p>Revised 8 December, 2006</p>
-<p><i>&copy; Copyright <a href="mailto:arseny.kapoulkine@gmail.com">Arseny Kapoulkine</a> 2006. All Rights Reserved.</i></p>
+<p>Revised 21 February, 2007</p>
+<p><i>&copy; Copyright <a href="mailto:arseny.kapoulkine@gmail.com">Arseny Kapoulkine</a> 2006-2007. All Rights Reserved.</i></p>
</body>
</html>
diff --git a/src/pugiconfig.hpp b/src/pugiconfig.hpp
new file mode 100644
index 0000000..795a66f
--- /dev/null
+++ b/src/pugiconfig.hpp
@@ -0,0 +1,23 @@
+///////////////////////////////////////////////////////////////////////////////
+//
+// Pug Improved XML Parser - Version 0.3
+// --------------------------------------------------------
+// Copyright (C) 2006-2007, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)
+// This work is based on the pugxml parser, which is:
+// Copyright (C) 2003, by Kristen Wegner (kristen@tima.net)
+// Released into the Public Domain. Use at your own risk.
+// See pugxml.xml for further information, history, etc.
+// Contributions by Neville Franks (readonly@getsoft.com).
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef HEADER_PUGICONFIG_HPP
+#define HEADER_PUGICONFIG_HPP
+
+// Uncomment this to disable STL
+// #define PUGIXML_NO_STL
+
+// Uncomment this to disable XPath
+// #define PUGIXML_NO_XPATH
+
+#endif
diff --git a/src/pugixml.cpp b/src/pugixml.cpp
index cf74eed..e812710 100644
--- a/src/pugixml.cpp
+++ b/src/pugixml.cpp
@@ -1,2134 +1,2569 @@
-///////////////////////////////////////////////////////////////////////////////
-//
-// Pug Improved XML Parser - Version 0.2
-// --------------------------------------------------------
-// Copyright (C) 2006-2007, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)
-// This work is based on the pugxml parser, which is:
-// Copyright (C) 2003, by Kristen Wegner (kristen@tima.net)
-// Released into the Public Domain. Use at your own risk.
-// See pugxml.xml for further information, history, etc.
-// Contributions by Neville Franks (readonly@getsoft.com).
-//
-///////////////////////////////////////////////////////////////////////////////
-
+///////////////////////////////////////////////////////////////////////////////
+//
+// Pug Improved XML Parser - Version 0.3
+// --------------------------------------------------------
+// Copyright (C) 2006-2007, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)
+// This work is based on the pugxml parser, which is:
+// Copyright (C) 2003, by Kristen Wegner (kristen@tima.net)
+// Released into the Public Domain. Use at your own risk.
+// See pugxml.xml for further information, history, etc.
+// Contributions by Neville Franks (readonly@getsoft.com).
+//
+///////////////////////////////////////////////////////////////////////////////
+
#include "pugixml.hpp"
-
-#include <cstdlib>
-
-#include <new>
-
-namespace pugi
-{
- /// A 'name=value' XML attribute structure.
- struct xml_attribute_struct
- {
- /// Default ctor
- xml_attribute_struct();
-
- char* name; ///< Pointer to attribute name.
- char* value; ///< Pointer to attribute value.
-
- xml_attribute_struct* prev_attribute; ///< Previous attribute
- xml_attribute_struct* next_attribute; ///< Next attribute
- };
-
- /// An XML document tree node.
- struct xml_node_struct
- {
- /// Default ctor
- /// \param type - node type
- xml_node_struct(xml_node_type type = node_element);
-
- xml_node_type type; ///< Node type; see xml_node_type.
- xml_node_struct* parent; ///< Pointer to parent
-
- char* name; ///< Pointer to element name.
- char* value; ///< Pointer to any associated string data.
-
- xml_node_struct* first_child; ///< First child
- xml_node_struct* last_child; ///< Last child
-
- xml_node_struct* prev_sibling; ///< Left brother
- xml_node_struct* next_sibling; ///< Right brother
-
- xml_attribute_struct* first_attribute; ///< First attribute
- xml_attribute_struct* last_attribute; ///< Last attribute
- };
-
- class xml_allocator
- {
- public:
- xml_allocator(xml_memory_block* root): _root(root), _count(0)
- {
- }
-
- template <typename T> T* allocate()
- {
- void* buf = memalloc(sizeof(T));
- return new (buf) T();
- }
-
- template <typename T, typename U> T* allocate(U val)
- {
- void* buf = memalloc(sizeof(T));
- return new (buf) T(val);
- }
-
- private:
- xml_memory_block* _root;
- unsigned int _count;
-
- void* memalloc(size_t size)
- {
- if (_root->size + size <= memory_block_size)
- {
- void* buf = _root->data + _root->size;
- _root->size += size;
- return buf;
- }
- else
- {
- _root->next = new xml_memory_block();
- _root = _root->next;
-
- _root->size = size;
-
- ++_count;
-
- return _root->data;
- }
- }
- };
-}
-
-namespace
-{
- namespace utf8
- {
- const unsigned char BYTE_MASK = 0xBF;
- const unsigned char BYTE_MARK = 0x80;
- const unsigned char BYTE_MASK_READ = 0x3F;
- const unsigned char FIRST_BYTE_MARK[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };
- }
-
- enum chartype
- {
- ct_parse_pcdata = 1, // \0, &, \r, <
- ct_parse_attr = 2, // \0, &, \r, ', "
- ct_parse_attr_ws = 4, // \0, &, \r, ', ", \n, space, tab
- ct_space = 8, // \r, \n, space, tab
- ct_parse_cdata = 16, // \0, ], >, \r
- ct_parse_comment = 32, // \0, -, >, \r
- ct_symbol = 64 // Any symbol > 127, a-z, A-Z, 0-9, _, :, -, .
-
- };
-
- static unsigned char chartype_table[256] =
- {
- 55, 0, 0, 0, 0, 0, 0, 0, 0, 12, 12, 0, 0, 63, 0, 0, // 0-15
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16-31
- 12, 0, 6, 0, 0, 0, 7, 6, 0, 0, 0, 0, 0, 96, 64, 0, // 32-47
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 1, 0, 48, 0, // 48-63
- 0, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, // 64-79
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 0, 16, 0, 64, // 80-95
- 0, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, // 96-111
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 0, 0, 0, 0, // 112-127
-
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64
- };
-
- bool is_chartype(char c, chartype ct)
- {
- return !!(chartype_table[static_cast<unsigned char>(c)] & ct);
- }
-}
-
-namespace pugi
-{
- // Get the size that is needed for strutf16_utf8 applied to all s characters
- static size_t strutf16_utf8_size(const wchar_t* s)
- {
- size_t length = 0;
-
- for (; *s; ++s)
- {
- if (*s < 0x80) length += 1;
- else if (*s < 0x800) length += 2;
- else if (*s < 0x10000) length += 3;
- else if (*s < 0x200000) length += 4;
- }
-
- return length;
- }
-
- // Write utf16 char to stream, return position after the last written char
- // \param s - pointer to string
- // \param ch - char
- // \return position after the last char
- // \rem yes, this is trom TinyXML. How would you write it the other way, without switch trick?..
- static char* strutf16_utf8(char* s, unsigned int ch)
- {
- unsigned int length;
-
- if (ch < 0x80) length = 1;
- else if (ch < 0x800) length = 2;
- else if (ch < 0x10000) length = 3;
- else if (ch < 0x200000) length = 4;
- else return s;
-
- s += length;
-
- // Scary scary fall throughs.
- switch (length)
- {
- case 4:
- *--s = (char)((ch | utf8::BYTE_MARK) & utf8::BYTE_MASK);
- ch >>= 6;
- case 3:
- *--s = (char)((ch | utf8::BYTE_MARK) & utf8::BYTE_MASK);
- ch >>= 6;
- case 2:
- *--s = (char)((ch | utf8::BYTE_MARK) & utf8::BYTE_MASK);
- ch >>= 6;
- case 1:
- *--s = (char)(ch | utf8::FIRST_BYTE_MARK[length]);
- }
-
- return s + length;
- }
-
- // Get the size that is needed for strutf8_utf16 applied to all s characters
- static size_t strutf8_utf16_size(const char* s)
- {
- size_t length = 0;
-
- for (; *s; ++s)
- {
- unsigned char ch = static_cast<unsigned char>(*s);
-
- if (ch < 0x80 || (ch >= 0xC0 && ch < 0xFC)) ++length;
- }
-
- return length;
- }
-
- // Read utf16 char from utf8 stream, return position after the last read char
- // \param s - pointer to string
- // \param ch - char
- // \return position after the last char
- static const char* strutf8_utf16(const char* s, unsigned int& ch)
- {
- unsigned int length;
-
- const unsigned char* str = reinterpret_cast<const unsigned char*>(s);
-
- if (*str < utf8::BYTE_MARK)
- {
- ch = *str;
- return s + 1;
- }
- else if (*str < 0xC0)
- {
- ch = ' ';
- return s + 1;
- }
- else if (*str < 0xE0) length = 2;
- else if (*str < 0xF0) length = 3;
- else if (*str < 0xF8) length = 4;
- else if (*str < 0xFC) length = 5;
- else
- {
- ch = ' ';
- return s + 1;
- }
-
- ch = (*str++ & ~utf8::FIRST_BYTE_MARK[length]);
-
- // Scary scary fall throughs.
- switch (length)
- {
- case 5:
- ch <<= 6;
- ch += (*str++ & utf8::BYTE_MASK_READ);
- case 4:
- ch <<= 6;
- ch += (*str++ & utf8::BYTE_MASK_READ);
- case 3:
- ch <<= 6;
- ch += (*str++ & utf8::BYTE_MASK_READ);
- case 2:
- ch <<= 6;
- ch += (*str++ & utf8::BYTE_MASK_READ);
- }
-
- return reinterpret_cast<const char*>(str);
- }
-
- struct xml_parser_impl
- {
- xml_allocator& alloc;
-
- struct gap
- {
- char* end;
- size_t size;
-
- gap(): end(0), size(0)
- {
- }
-
- // Push new gap, move s count bytes further (skipping the gap).
- // Collapse previous gap.
- void push(char*& s, size_t count)
- {
- if (end) // there was a gap already; collapse it
- {
- // Move [old_gap_end, new_gap_start) to [old_gap_start, ...)
- memmove(end - size, end, s - end);
- }
-
- s += count; // end of current gap
-
- // "merge" two gaps
- end = s;
- size += count;
- }
-
- // Collapse all gaps, return past-the-end pointer
- char* flush(char* s)
- {
- if (end)
- {
- // Move [old_gap_end, current_pos) to [old_gap_start, ...)
- memmove(end - size, end, s - end);
-
- return s - size;
- }
- else return s;
- }
- };
-
- static char* strconv_escape(char* s, gap& g)
- {
- char* stre = s + 1;
-
- switch (*stre)
- {
- case '#': // &#...
- {
- unsigned int ucsc = 0;
-
- ++stre;
-
- if (*stre == 'x') // &#x... (hex code)
- {
- ++stre;
-
- while (*stre)
- {
- if (*stre >= '0' && *stre <= '9')
- ucsc = 16 * ucsc + (*stre++ - '0');
- else if (*stre >= 'A' && *stre <= 'F')
- ucsc = 16 * ucsc + (*stre++ - 'A' + 10);
- else if (*stre >= 'a' && *stre <= 'f')
- ucsc = 16 * ucsc + (*stre++ - 'a' + 10);
- else break;
- }
-
- if (*stre == ';') ++stre;
- }
- else // &#... (dec code)
- {
- while (*stre >= '0' && *stre <= '9')
- ucsc = 10 * ucsc + (*stre++ - '0');
-
- if (*stre == ';') ++stre;
- }
-
- s = strutf16_utf8(s, ucsc);
-
- g.push(s, stre - s);
- return stre;
- }
- case 'a': // &a
- {
- ++stre;
-
- if (*stre == 'm') // &am
- {
- if (*++stre == 'p' && *++stre == ';') // &amp;
- {
- *s++ = '&';
- ++stre;
-
- g.push(s, stre - s);
- return stre;
- }
- }
- else if (*stre == 'p') // &ap
- {
- if (*++stre == 'o' && *++stre == 's' && *++stre == ';') // &apos;
- {
- *s++ = '\'';
- ++stre;
-
- g.push(s, stre - s);
- return stre;
- }
- }
- break;
- }
- case 'g': // &g
- {
- if (*++stre == 't' && *++stre == ';') // &gt;
- {
- *s++ = '>';
- ++stre;
-
- g.push(s, stre - s);
- return stre;
- }
- break;
- }
- case 'l': // &l
- {
- if (*++stre == 't' && *++stre == ';') // &lt;
- {
- *s++ = '<';
- ++stre;
-
- g.push(s, stre - s);
- return stre;
- }
- break;
- }
- case 'q': // &q
- {
- if (*++stre == 'u' && *++stre == 'o' && *++stre == 't' && *++stre == ';') // &quot;
- {
- *s++ = '"';
- ++stre;
-
- g.push(s, stre - s);
- return stre;
- }
- break;
- }
- }
-
- return stre;
- }
-
- static char* strconv_comment(char* s)
- {
- if (!*s) return 0;
-
- gap g;
-
- while (true)
- {
- while (!is_chartype(*s, ct_parse_comment)) ++s;
-
- if (*s == '\r') // Either a single 0x0d or 0x0d 0x0a pair
- {
- *s++ = '\n'; // replace first one with 0x0a
-
- if (*s == '\n') g.push(s, 1);
- }
- else if (*s == '-' && *(s+1) == '-' && *(s+2) == '>') // comment ends here
- {
- *g.flush(s) = 0;
-
- return s + 3;
- }
- else if (*s == 0)
- {
- return 0;
- }
- else ++s;
- }
- }
-
- static char* strconv_cdata(char* s)
- {
- if (!*s) return 0;
-
- gap g;
-
- while (true)
- {
- while (!is_chartype(*s, ct_parse_cdata)) ++s;
-
- if (*s == '\r') // Either a single 0x0d or 0x0d 0x0a pair
- {
- *s++ = '\n'; // replace first one with 0x0a
-
- if (*s == '\n') g.push(s, 1);
- }
- else if (*s == ']' && *(s+1) == ']' && *(s+2) == '>') // CDATA ends here
- {
- *g.flush(s) = 0;
-
- return s + 1;
- }
- else if (*s == 0)
- {
- return 0;
- }
- else ++s;
- }
- }
-
- template <bool opt_escape, bool opt_eol> static char* strconv_pcdata(char* s)
- {
- if (!*s) return 0;
-
- gap g;
-
- while (true)
- {
- while (!is_chartype(*s, ct_parse_pcdata)) ++s;
-
- if (opt_eol && *s == '\r') // Either a single 0x0d or 0x0d 0x0a pair
- {
- *s++ = '\n'; // replace first one with 0x0a
-
- if (*s == '\n') g.push(s, 1);
- }
- else if (opt_escape && *s == '&')
- {
- s = strconv_escape(s, g);
- }
- else if (*s == '<') // PCDATA ends here
- {
- *g.flush(s) = 0;
-
- return s + 1;
- }
- else if (*s == 0)
- {
- return 0;
- }
- else ++s;
- }
- }
-
- static char* strconv_pcdata(char* s, unsigned int opt_escape, unsigned int opt_eol)
- {
- if (opt_escape)
- return opt_eol ? strconv_pcdata<true, true>(s) : strconv_pcdata<true, false>(s);
- else
- return opt_eol ? strconv_pcdata<false, true>(s) : strconv_pcdata<false, false>(s);
- }
-
- template <bool opt_escape, bool opt_wnorm, bool opt_wconv, bool opt_eol> static char* strconv_attr(char* s, char end_quote)
- {
- if (!*s) return 0;
-
- gap g;
-
- // Trim whitespaces
- if (opt_wnorm)
- {
- char* str = s;
-
- while (is_chartype(*str, ct_space)) ++str;
-
- if (str != s)
- g.push(s, str - s);
- }
-
- while (true)
- {
- while (!is_chartype(*s, (opt_wnorm || opt_wconv) ? ct_parse_attr_ws : ct_parse_attr)) ++s;
-
- if (opt_escape && *s == '&')
- {
- s = strconv_escape(s, g);
- }
- else if (opt_wnorm && is_chartype(*s, ct_space))
- {
- *s++ = ' ';
-
- if (is_chartype(*s, ct_space))
- {
- char* str = s + 1;
- while (is_chartype(*str, ct_space)) ++str;
-
- g.push(s, str - s);
- }
- }
- else if (opt_wconv && is_chartype(*s, ct_space))
- {
- if (opt_eol)
- {
- if (*s == '\r')
- {
- *s++ = ' ';
-
- if (*s == '\n') g.push(s, 1);
- }
- else *s++ = ' ';
- }
- else *s++ = ' ';
- }
- else if (opt_eol && *s == '\r')
- {
- *s++ = '\n';
-
- if (*s == '\n') g.push(s, 1);
- }
- else if (*s == end_quote)
- {
- char* str = g.flush(s);
-
- if (opt_wnorm)
- {
- do *str-- = 0;
- while (is_chartype(*str, ct_space));
- }
- else *str = 0;
-
- return s + 1;
- }
- else if (!*s)
- {
- return 0;
- }
- else ++s;
- }
- }
-
- static void strconv_attr_setup(char* (*&func)(char*, char), unsigned int opt_escape, unsigned int opt_wnorm, unsigned int opt_wconv, unsigned int opt_eol)
- {
- if (opt_eol)
- {
- if (opt_wconv)
- {
- if (opt_escape)
- {
- if (opt_wnorm) func = &strconv_attr<true, true, true, true>;
- else func = &strconv_attr<true, false, true, true>;
- }
- else
- {
- if (opt_wnorm) func = &strconv_attr<false, true, true, true>;
- else func = &strconv_attr<false, false, true, true>;
- }
- }
- else
- {
- if (opt_escape)
- {
- if (opt_wnorm) func = &strconv_attr<true, true, false, true>;
- else func = &strconv_attr<true, false, false, true>;
- }
- else
- {
- if (opt_wnorm) func = &strconv_attr<false, true, false, true>;
- else func = &strconv_attr<false, false, false, true>;
- }
- }
- }
- else
- {
- if (opt_wconv)
- {
- if (opt_escape)
- {
- if (opt_wnorm) func = &strconv_attr<true, true, true, false>;
- else func = &strconv_attr<true, false, true, false>;
- }
- else
- {
- if (opt_wnorm) func = &strconv_attr<false, true, true, false>;
- else func = &strconv_attr<false, false, true, false>;
- }
- }
- else
- {
- if (opt_escape)
- {
- if (opt_wnorm) func = &strconv_attr<true, true, false, false>;
- else func = &strconv_attr<true, false, false, false>;
- }
- else
- {
- if (opt_wnorm) func = &strconv_attr<false, true, false, false>;
- else func = &strconv_attr<false, false, false, false>;
- }
- }
- }
- }
-
- // Allocate & append a new xml_node_struct onto the given parent.
- // \param parent - pointer to parent node.
- // \param type - desired node type.
- // \return pointer to the new node
- xml_node_struct* append_node(xml_node_struct* parent, xml_node_type type = node_element)
- {
- if(!parent) return 0; // Must have a parent.
-
- xml_node_struct* child = alloc.allocate<xml_node_struct>(type); // Allocate a new child.
- child->parent = parent; // Set it's parent pointer.
- if (parent->last_child)
- {
- parent->last_child->next_sibling = child;
- child->prev_sibling = parent->last_child;
- parent->last_child = child;
- }
- else parent->first_child = parent->last_child = child;
- return child;
- }
-
- // Allocate & append a new attribute to the given xml_node_struct.
- // \param node - pointer to parent node.
- // \return pointer to appended xml_attribute_struct.
- xml_attribute_struct* append_attribute(xml_node_struct* node)
- {
- if(!node) return 0;
- xml_attribute_struct* a = alloc.allocate<xml_attribute_struct>();
-
- if (node->last_attribute)
- {
- node->last_attribute->next_attribute = a;
- a->prev_attribute = node->last_attribute;
- node->last_attribute = a;
- }
- else node->first_attribute = node->last_attribute = a;
-
- return a;
- }
-
- // Parser utilities.
- #define SKIPWS() { while(is_chartype(*s, ct_space)) ++s; if(*s==0) return s; }
- #define OPTSET(OPT) ( optmsk & OPT )
- #define PUSHNODE(TYPE) { cursor = append_node(cursor,TYPE); }
- #define POPNODE() { cursor = cursor->parent; }
- #define SCANFOR(X) { while(*s!=0 && !(X)) ++s; if(*s==0) return s; }
- #define SCANWHILE(X) { while((X)) ++s; if(*s==0) return s; }
- #define ENDSEG() { ch = *s; *s = 0; ++s; if(*s==0) return s; }
-
- xml_parser_impl(xml_allocator& alloc): alloc(alloc)
- {
- for (unsigned int c = 0; c < 256; ++c)
- {
- }
- }
-
- // Static single-pass in-situ parse the given xml string.
- // \param s - pointer to XML-formatted string.
- // \param xmldoc - pointer to root.
- // \param optmsk - parse options mask.
- // \return last string position or NULL.
- char* parse(register char* s,xml_node_struct* xmldoc,unsigned int optmsk = parse_default)
- {
- if(!s || !xmldoc) return s;
-
- char* (*strconv_attribute)(char*, char);
-
- strconv_attr_setup(strconv_attribute, OPTSET(parse_escapes), OPTSET(parse_wnorm_attribute), OPTSET(parse_wconv_attribute), OPTSET(parse_eol));
-
- char ch = 0; // Current char, in cases where we must null-terminate before we test.
- xml_node_struct* cursor = xmldoc; // Tree node cursor.
- char* mark = s; // Marked string position for temporary look-ahead.
- while(*s!=0)
- {
- LOC_SEARCH: // Obliviously search for next element.
- SCANFOR(*s == '<'); // Find the next '<'.
- if(*s == '<')
- {
- ++s;
- LOC_CLASSIFY: // What kind of element?
- if(*s == '?') // '<?...'
- {
- ++s;
- if(is_chartype(*s, ct_symbol) && OPTSET(parse_pi))
- {
- mark = s;
- SCANWHILE(is_chartype(*s, ct_symbol)); // Read PI target
- ENDSEG();
-
- PUSHNODE(node_pi); // Append a new node on the tree.
-
- cursor->name = mark;
-
- if (is_chartype(ch, ct_space))
- {
- SKIPWS();
-
- mark = s;
- }
- else mark = 0;
-
- SCANFOR(*s == '?' && *(s+1) == '>'); // Look for '?>'.
- ENDSEG();
-
- cursor->value = mark;
-
- POPNODE();
-
- goto LOC_LEAVE;
- }
- else // Bad PI or parse_pi not set.
- {
- SCANFOR(*s == '?' && *(s+1) == '>'); // Look for '?>'.
- ++s;
- goto LOC_LEAVE;
- }
- }
- else if(*s == '!') // '<!...'
- {
- ++s;
- if(*s == '-') // '<!-...'
- {
- ++s;
- if(*s == '-') // '<!--...'
- {
- ++s;
-
- if (OPTSET(parse_comments))
- {
- PUSHNODE(node_comment); // Append a new node on the tree.
- cursor->value = s; // Save the offset.
- }
-
- if (OPTSET(parse_eol) && OPTSET(parse_comments))
- {
- s = strconv_comment(s);
-
- if (!s) return s;
- }
- else
- {
- // Scan for terminating '-->'.
- SCANFOR(*s == '-' && *(s+1) == '-' && *(s+2) == '>');
-
- if (OPTSET(parse_comments))
- *s = 0; // Zero-terminate this segment at the first terminating '-'.
-
- s += 2; // Step over the '\0-'.
- }
-
- if (OPTSET(parse_comments))
- {
- POPNODE(); // Pop since this is a standalone.
- }
-
- goto LOC_LEAVE; // Look for any following PCDATA.
- }
- }
- else if(*s == '[')
- {
- // '<![CDATA[...'
- if(*++s=='C' && *++s=='D' && *++s=='A' && *++s=='T' && *++s=='A' && *++s == '[')
- {
- ++s;
- if(OPTSET(parse_cdata))
- {
- PUSHNODE(node_cdata); // Append a new node on the tree.
- cursor->value = s; // Save the offset.
-
- if (OPTSET(parse_eol))
- {
- s = strconv_cdata(s);
-
- if (!s) return s;
- }
- else
- {
- // Scan for terminating ']]>'.
- SCANFOR(*s == ']' && *(s+1) == ']' && *(s+2) == '>');
- ENDSEG(); // Zero-terminate this segment.
- }
-
- POPNODE(); // Pop since this is a standalone.
- }
- else // Flagged for discard, but we still have to scan for the terminator.
- {
- // Scan for terminating ']]>'.
- SCANFOR(*s == ']' && *(s+1) == ']' && *(s+2) == '>');
- ++s;
- }
- ++s; // Step over the last ']'.
- goto LOC_LEAVE; // Look for any following PCDATA.
- }
- continue; // Probably a corrupted CDATA section, so just eat it.
- }
- else if(*s=='D' && *++s=='O' && *++s=='C' && *++s=='T' && *++s=='Y' && *++s=='P' && *++s=='E')
- {
- ++s;
- SKIPWS(); // Eat any whitespace.
- LOC_DOCTYPE:
- SCANWHILE(*s == '\'' || *s == '"' || *s == '[' || *s == '>');
- if(*s == '\'' || *s == '"') // '...SYSTEM "..."
- {
- ch = *s++;
- SCANFOR(*s == ch);
- ++s;
- goto LOC_DOCTYPE;
- }
- if(*s == '[') // '...[...'
- {
- ++s;
- unsigned int bd = 1; // Bracket depth counter.
- while(*s!=0) // Loop till we're out of all brackets.
- {
- if(*s == ']') --bd;
- else if(*s == '[') ++bd;
- if(bd == 0) break;
- ++s;
- }
- // Note: 's' now points to end of DTD, i.e.: ']'.
- SCANFOR(*s == '>');
- continue;
- }
- // Fall-through
- continue;
- }
- }
- else if(is_chartype(*s, ct_symbol)) // '<#...'
- {
- cursor = append_node(cursor); // Append a new node to the tree.
-
- cursor->name = s;
- SCANWHILE(is_chartype(*s, ct_symbol)); // Scan for a terminator.
- ENDSEG(); // Save char in 'ch', terminate & step over.
- if (*s!=0 && ch == '/') // '</...'
- {
- SCANFOR(*s == '>'); // Scan for '>'
- POPNODE(); // Pop.
- goto LOC_LEAVE;
- }
- else if(*s!=0 && !is_chartype(ch, ct_space))
- {
- if (ch != '>') SCANWHILE(*s != '>');
- if (!*s) return s;
- goto LOC_PCDATA; // No attributes, so scan for PCDATA.
- }
- else if(*s!=0 && is_chartype(ch, ct_space))
- {
- SKIPWS(); // Eat any whitespace.
- LOC_ATTRIBUTE:
- if(is_chartype(*s, ct_symbol)) // <... #...
- {
- xml_attribute_struct* a = append_attribute(cursor); // Make space for this attribute.
- a->name = s; // Save the offset.
- SCANWHILE(is_chartype(*s, ct_symbol)); // Scan for a terminator.
- ENDSEG(); // Save char in 'ch', terminate & step over.
- if(*s!=0 && is_chartype(ch, ct_space)) SKIPWS(); // Eat any whitespace.
- if(*s!=0 && (ch == '=' || *s == '=')) // '<... #=...'
- {
- if(*s == '=') ++s;
- SKIPWS(); // Eat any whitespace.
- if(*s == '\'' || *s == '"') // '<... #="...'
- {
- ch = *s; // Save quote char to avoid breaking on "''" -or- '""'.
- ++s; // Step over the quote.
- a->value = s; // Save the offset.
-
- s = strconv_attribute(s, ch);
-
- if (!s) return s;
-
- if(*s == '>')
- {
- ++s;
- goto LOC_PCDATA;
- }
- else if(*s == '/')
- {
- ++s;
- POPNODE();
- SKIPWS(); // Eat any whitespace.
- goto LOC_LEAVE;
- }
- else if(is_chartype(*s, ct_space)) // This may indicate a following attribute.
- {
- SKIPWS(); // Eat any whitespace.
- goto LOC_ATTRIBUTE; // Go scan for additional attributes.
- }
- }
- }
- goto LOC_ATTRIBUTE;
- }
-
- SCANWHILE(*s != '>' && *s != '/');
- }
- LOC_LEAVE:
- if(*s == '>') // '...>'
- {
- ++s; // Step over the '>'.
- LOC_PCDATA: // '>...<'
- mark = s; // Save this offset while searching for a terminator.
- SKIPWS(); // Eat whitespace if no genuine PCDATA here.
- // We hit a '<...', with only whitespace, so don't bother storing anything.
- if((mark == s || !OPTSET(parse_ws_pcdata)) && *s == '<')
- {
- if(*(s+1) == '/') // '</...'
- {
- ++s;
- goto LOC_CLOSE;
- }
- else goto LOC_SEARCH; // Expect a new element enter, so go scan for it.
- }
-
- s = mark;
-
- bool preserve = OPTSET(parse_ext_pcdata) || cursor->type != node_document;
-
- if (preserve)
- {
- PUSHNODE(node_pcdata); // Append a new node on the tree.
- cursor->value = s; // Save the offset.
-
- s = strconv_pcdata(s, OPTSET(parse_escapes), OPTSET(parse_eol));
-
- if (!s) return s;
-
- POPNODE(); // Pop since this is a standalone.
- }
- else
- {
- SCANFOR(*s == '<'); // '...<'
- }
-
- // We're after '<...', otherwise we would not get here
- if(*s == '/') goto LOC_CLOSE;
- else if(*s == '!') goto LOC_CLASSIFY; // We hit a '<!...'. We must test this here if we want comments intermixed w/PCDATA.
- else if(*s) goto LOC_CLASSIFY;
- else return s;
- }
- // Fall-through A.
- else if(*s == '/') // '.../'
- {
- ++s;
- if(*s == '>') // '.../>'
- {
- POPNODE(); // Pop.
- goto LOC_LEAVE;
- }
- }
- }
- // Fall-through B.
- else if(*s == '/') // '.../'
- {
- LOC_CLOSE:
- ++s;
-
- if (OPTSET(parse_match_end_tags))
- {
- while (cursor && cursor->type != node_document)
- {
- char* tagname = s;
-
- // is it the matching tag?
- char* name = cursor->name;
-
- if (name)
- {
- while (*tagname && is_chartype(*tagname, ct_symbol))
- {
- if (*tagname++ != *name++) goto TAG_NEXTMATCH;
- }
-
- if (!*name)
- {
- // we've found matching tag
- POPNODE();
- s = tagname;
- break;
- }
- }
-
- TAG_NEXTMATCH:
- POPNODE();
- }
- }
- else if (OPTSET(parse_check_end_tags))
- {
- char* name = cursor->name;
- if (!name) return s;
-
- while (*s && is_chartype(*s, ct_symbol))
- {
- if (*s++ != *name++) return s;
- }
- if (*name) return s;
-
- POPNODE(); // Pop.
- }
- else
- {
- SCANFOR(*s == '>'); // '...>'
- POPNODE(); // Pop.
- }
-
- SKIPWS();
-
- goto LOC_LEAVE;
- }
- }
- }
- return s;
- }
-
- private:
- const xml_parser_impl& operator=(const xml_parser_impl&);
- };
-
- // Compare lhs with [rhs_begin, rhs_end)
- static int strcmprange(const char* lhs, const char* rhs_begin, const char* rhs_end)
- {
- while (*lhs && rhs_begin != rhs_end && *lhs == *rhs_begin)
- {
- ++lhs;
- ++rhs_begin;
- }
-
- if (rhs_begin == rhs_end && *lhs == 0) return 0;
- else return 1;
- }
-
- // Character set pattern match.
- static int strcmpwild_cset(const char** src, const char** dst)
- {
- int find = 0, excl = 0, star = 0;
-
- if (**src == '!')
- {
- excl = 1;
- ++(*src);
- }
-
- while (**src != ']' || star == 1)
- {
- if (find == 0)
- {
- if (**src == '-' && *(*src-1) < *(*src+1) && *(*src+1) != ']' && star == 0)
- {
- if (**dst >= *(*src-1) && **dst <= *(*src+1))
- {
- find = 1;
- ++(*src);
- }
- }
- else if (**src == **dst) find = 1;
- }
- ++(*src);
- star = 0;
- }
-
- if (excl == 1) find = (1 - find);
- if (find == 1) ++(*dst);
-
- return find;
- }
-
- // Wildcard pattern match.
- static int strcmpwild_astr(const char** src, const char** dst)
- {
- int find = 1;
- ++(*src);
- while ((**dst != 0 && **src == '?') || **src == '*')
- {
- if(**src == '?') ++(*dst);
- ++(*src);
- }
- while (**src == '*') ++(*src);
- if (**dst == 0 && **src != 0) return 0;
- if (**dst == 0 && **src == 0) return 1;
- else
- {
- if (impl::strcmpwild(*src,*dst))
- {
- do
- {
- ++(*dst);
- while(**src != **dst && **src != '[' && **dst != 0)
- ++(*dst);
- }
- while ((**dst != 0) ? impl::strcmpwild(*src,*dst) : 0 != (find=0));
- }
- if (**dst == 0 && **src == 0) find = 1;
- return find;
- }
- }
-
- namespace impl
- {
- // Compare two strings, with globbing, and character sets.
- int strcmpwild(const char* src, const char* dst)
- {
- int find = 1;
- for(; *src != 0 && find == 1 && *dst != 0; ++src)
- {
- switch (*src)
- {
- case '?': ++dst; break;
- case '[': ++src; find = strcmpwild_cset(&src,&dst); break;
- case '*': find = strcmpwild_astr(&src,&dst); --src; break;
- default : find = (int) (*src == *dst); ++dst;
- }
- }
- while (*src == '*' && find == 1) ++src;
- return (find == 1 && *dst == 0 && *src == 0) ? 0 : 1;
- }
- }
-
- int strcmp(const char* lhs, const char* rhs)
- {
- return ::strcmp(lhs, rhs);
- }
-
- int strcmpwildimpl(const char* src, const char* dst)
- {
- return impl::strcmpwild(src, dst);
- }
-
- typedef int (*strcmpfunc)(const char*, const char*);
-
- xml_attribute_struct::xml_attribute_struct(): name(0), value(0), prev_attribute(0), next_attribute(0)
- {
- }
-
- xml_node_struct::xml_node_struct(xml_node_type type): type(type), parent(0), name(0), value(0), first_child(0), last_child(0), prev_sibling(0), next_sibling(0), first_attribute(0), last_attribute(0)
- {
- }
-
- xml_tree_walker::xml_tree_walker() : _deep(0)
- {
- }
-
- xml_tree_walker::~xml_tree_walker()
- {
- }
-
- void xml_tree_walker::push()
- {
- ++_deep;
- }
-
- void xml_tree_walker::pop()
- {
- --_deep;
- }
-
- int xml_tree_walker::depth() const
- {
- return (_deep > 0) ? _deep : 0;
- }
-
- bool xml_tree_walker::begin(const xml_node&)
- {
- return true;
- }
-
- bool xml_tree_walker::end(const xml_node&)
- {
- return true;
- }
-
- xml_attribute::xml_attribute(): _attr(0)
- {
- }
-
- xml_attribute::xml_attribute(const xml_attribute_struct* attr): _attr(attr)
- {
- }
-
- xml_attribute::operator xml_attribute::unspecified_bool_type() const
- {
- return empty() ? 0 : &xml_attribute::_attr;
- }
-
- bool xml_attribute::operator==(const xml_attribute& r) const
- {
- return (_attr == r._attr);
- }
-
- bool xml_attribute::operator!=(const xml_attribute& r) const
- {
- return (_attr != r._attr);
- }
-
- bool xml_attribute::operator<(const xml_attribute& r) const
- {
- return (_attr < r._attr);
- }
-
- bool xml_attribute::operator>(const xml_attribute& r) const
- {
- return (_attr > r._attr);
- }
-
- bool xml_attribute::operator<=(const xml_attribute& r) const
- {
- return (_attr <= r._attr);
- }
-
- bool xml_attribute::operator>=(const xml_attribute& r) const
- {
- return (_attr >= r._attr);
- }
-
- xml_attribute xml_attribute::next_attribute() const
- {
- return _attr ? xml_attribute(_attr->next_attribute) : xml_attribute();
- }
-
- xml_attribute xml_attribute::previous_attribute() const
- {
- return _attr ? xml_attribute(_attr->prev_attribute) : xml_attribute();
- }
-
- int xml_attribute::as_int() const
- {
- if(empty() || !_attr->value) return 0;
- return atoi(_attr->value);
- }
-
- double xml_attribute::as_double() const
- {
- if(empty() || !_attr->value) return 0.0;
- return atof(_attr->value);
- }
-
- float xml_attribute::as_float() const
- {
- if(empty() || !_attr->value) return 0.0f;
- return (float)atof(_attr->value);
- }
-
- bool xml_attribute::as_bool() const
- {
- if(empty() || !_attr->value) return false;
- if(*(_attr->value))
- {
- return // Only look at first char:
- (
- *(_attr->value) == '1' || // 1*
- *(_attr->value) == 't' || // t* (true)
- *(_attr->value) == 'T' || // T* (true|true)
- *(_attr->value) == 'y' || // y* (yes)
- *(_attr->value) == 'Y' // Y* (Yes|YES)
- )
- ? true : false; // Return true if matches above, else false.
- }
- else return false;
- }
-
- bool xml_attribute::empty() const
- {
- return (_attr == 0);
- }
-
- const char* xml_attribute::name() const
- {
- return (!empty() && _attr->name) ? _attr->name : "";
- }
-
- const char* xml_attribute::value() const
- {
- return (!empty() && _attr->value) ? _attr->value : "";
- }
-
- xml_node::xml_node(): _root(0)
- {
- }
-
- xml_node::xml_node(const xml_node_struct* p): _root(p)
- {
- }
-
- xml_node::operator xml_node::unspecified_bool_type() const
- {
- return empty() ? 0 : &xml_node::_root;
- }
-
- xml_node::iterator xml_node::begin() const
- {
- return iterator(_root->first_child);
- }
-
- xml_node::iterator xml_node::end() const
- {
- return iterator(0, _root->last_child);
- }
-
- xml_node::iterator xml_node::children_begin() const
- {
- return iterator(_root->first_child);
- }
-
- xml_node::iterator xml_node::children_end() const
- {
- return iterator(0, _root->last_child);
- }
-
- xml_node::attribute_iterator xml_node::attributes_begin() const
- {
- return attribute_iterator(_root->first_attribute);
- }
-
- xml_node::attribute_iterator xml_node::attributes_end() const
- {
- return attribute_iterator(0, _root->last_attribute);
- }
-
- xml_node::iterator xml_node::siblings_begin() const
- {
- return parent().children_begin();
- }
-
- xml_node::iterator xml_node::siblings_end() const
- {
- return parent().children_end();
- }
-
- bool xml_node::operator==(const xml_node& r) const
- {
- return (_root == r._root);
- }
-
- bool xml_node::operator!=(const xml_node& r) const
- {
- return (_root != r._root);
- }
-
- bool xml_node::operator<(const xml_node& r) const
- {
- return (_root < r._root);
- }
-
- bool xml_node::operator>(const xml_node& r) const
- {
- return (_root > r._root);
- }
-
- bool xml_node::operator<=(const xml_node& r) const
- {
- return (_root <= r._root);
- }
-
- bool xml_node::operator>=(const xml_node& r) const
- {
- return (_root >= r._root);
- }
-
- bool xml_node::empty() const
- {
- return (_root == 0 || _root->type == node_null);
- }
-
- bool xml_node::type_document() const
- {
- return (_root && _root == _root->parent && _root->type == node_document);
- }
-
- const char* xml_node::name() const
- {
- return (!empty() && _root->name) ? _root->name : "";
- }
-
- xml_node_type xml_node::type() const
- {
- return (_root) ? (xml_node_type)_root->type : node_null;
- }
-
- const char* xml_node::value() const
- {
- return (!empty() && _root->value) ? _root->value : "";
- }
-
- xml_node xml_node::child(const char* name) const
- {
- if (!empty())
- for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling)
- if (i->name && !strcmp(name, i->name)) return xml_node(i);
-
- return xml_node();
- }
-
- xml_node xml_node::child_w(const char* name) const
- {
- if (!empty())
- for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling)
- if (i->name && !impl::strcmpwild(name, i->name)) return xml_node(i);
-
- return xml_node();
- }
-
- xml_attribute xml_node::attribute(const char* name) const
- {
- if (!_root) return xml_attribute();
-
- for (xml_attribute_struct* i = _root->first_attribute; i; i = i->next_attribute)
- if (i->name && !strcmp(name, i->name))
- return xml_attribute(i);
-
- return xml_attribute();
- }
-
- xml_attribute xml_node::attribute_w(const char* name) const
- {
- if (!_root) return xml_attribute();
-
- for (xml_attribute_struct* i = _root->first_attribute; i; i = i->next_attribute)
- if (i->name && !impl::strcmpwild(name, i->name))
- return xml_attribute(i);
-
- return xml_attribute();
- }
-
- xml_node xml_node::sibling(const char* name) const
- {
- if (!empty() && !type_document()) return parent().child(name);
- else return xml_node();
- }
-
- xml_node xml_node::sibling_w(const char* name) const
- {
- if (!empty() && !type_document()) return parent().child_w(name);
- else return xml_node();
- }
-
- xml_node xml_node::next_sibling(const char* name) const
- {
- if(empty()) return xml_node();
-
- for (xml_node_struct* i = _root->next_sibling; i; i = i->next_sibling)
- if (i->name && !strcmp(name, i->name)) return xml_node(i);
-
- return xml_node();
- }
-
- xml_node xml_node::next_sibling_w(const char* name) const
- {
- if(empty()) return xml_node();
-
- for (xml_node_struct* i = _root->next_sibling; i; i = i->next_sibling)
- if (i->name && !impl::strcmpwild(name, i->name)) return xml_node(i);
-
- return xml_node();
- }
-
- xml_node xml_node::next_sibling() const
- {
- if(empty()) return xml_node();
-
- if (_root->next_sibling) return xml_node(_root->next_sibling);
- else return xml_node();
- }
-
- xml_node xml_node::previous_sibling(const char* name) const
- {
- if (empty()) return xml_node();
-
- for (xml_node_struct* i = _root->prev_sibling; i; i = i->prev_sibling)
- if (i->name && !strcmp(name, i->name)) return xml_node(i);
-
- return xml_node();
- }
-
- xml_node xml_node::previous_sibling_w(const char* name) const
- {
- if (empty()) return xml_node();
-
- for (xml_node_struct* i = _root->prev_sibling; i; i = i->prev_sibling)
- if (i->name && !impl::strcmpwild(name, i->name)) return xml_node(i);
-
- return xml_node();
- }
-
- xml_node xml_node::previous_sibling() const
- {
- if(empty()) return xml_node();
-
- if (_root->prev_sibling) return xml_node(_root->prev_sibling);
- else return xml_node();
- }
-
- xml_node xml_node::parent() const
- {
- return (!type_document()) ? xml_node(_root->parent) : xml_node();
- }
-
- const char* xml_node::child_value() const
- {
- if (!empty())
- for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling)
- if ((i->type == node_pcdata || i->type == node_cdata) && i->value)
- return i->value;
- return "";
- }
-
- const char* xml_node::child_value(const char* name) const
- {
- return child(name).child_value();
- }
-
- const char* xml_node::child_value_w(const char* name) const
- {
- return child_w(name).child_value();
- }
-
- xml_attribute xml_node::first_attribute() const
- {
- return _root ? xml_attribute(_root->first_attribute) : xml_attribute();
- }
-
- xml_attribute xml_node::last_attribute() const
- {
- return _root ? xml_attribute(_root->last_attribute) : xml_attribute();
- }
-
- xml_node xml_node::first_child() const
- {
- if (_root) return xml_node(_root->first_child);
- else return xml_node();
- }
-
- xml_node xml_node::last_child() const
- {
- if (_root) return xml_node(_root->last_child);
- else return xml_node();
- }
-
- namespace impl
- {
- xml_node first_element(const xml_node_struct* node, const char* name, strcmpfunc pred)
- {
- for (xml_node_struct* i = node->first_child; i; i = i->next_sibling)
- {
- if (i->name && !pred(name, i->name)) return xml_node(i);
- else if (i->first_child)
- {
- xml_node found = first_element(i, name, pred);
- if (found) return found; // Found.
- }
- }
- return xml_node(); // Not found.
- }
- }
-
- xml_node xml_node::first_element(const char* name) const
- {
- if (empty()) return xml_node();
-
- return impl::first_element(_root, name, &strcmp);
- }
-
- xml_node xml_node::first_element_w(const char* name) const
- {
- if (empty()) return xml_node();
-
- return impl::first_element(_root, name, &strcmpwildimpl);
- }
-
- namespace impl
- {
- xml_node first_element_by_value(const xml_node_struct* node, const char* name, const char* value, strcmpfunc pred)
- {
- for (xml_node_struct* i = node->first_child; i; i = i->next_sibling)
- {
- if (i->name && !pred(name,i->name))
- {
- for (xml_node_struct* j = i->first_child; j; j = j->next_sibling)
- if (j->type == node_pcdata && j->value && !pred(value, j->value))
- return xml_node(i);
- }
- else if (i->first_child)
- {
- xml_node found = first_element_by_value(i, name, value, pred);
- if(!found.empty()) return found; // Found.
- }
- }
- return xml_node(); // Not found.
- }
- }
-
- xml_node xml_node::first_element_by_value(const char* name,const char* value) const
- {
- if (empty()) return xml_node();
-
- return impl::first_element_by_value(_root, name, value, &strcmp);
- }
-
- xml_node xml_node::first_element_by_value_w(const char* name,const char* value) const
- {
- if (empty()) return xml_node();
-
- return impl::first_element_by_value(_root, name, value, &strcmpwildimpl);
- }
-
- namespace impl
- {
- xml_node first_element_by_attribute(const xml_node_struct* node, const char* name, const char* attr_name, const char* attr_value, strcmpfunc pred)
- {
- for (xml_node_struct* i = node->first_child; i; i = i->next_sibling)
- {
- if (i->name && !pred(name, i->name))
- {
- for (xml_attribute_struct* j = i->first_attribute; j; j = j->next_attribute)
- {
- if (j->name && j->value && !pred(attr_name, j->name) && !pred(attr_value, j->value))
- return xml_node(i); // Wrap it up and return.
- }
- }
- else if (i->first_child)
- {
- xml_node found = first_element_by_attribute(i, name, attr_name, attr_value, pred);
- if(!found.empty()) return found; // Found.
- }
- }
- return xml_node(); // Not found.
- }
- }
-
- xml_node xml_node::first_element_by_attribute(const char* name,const char* attr_name,const char* attr_value) const
- {
- if (empty()) return xml_node();
-
- return impl::first_element_by_attribute(_root, name, attr_name, attr_value, &strcmp);
- }
-
- xml_node xml_node::first_element_by_attribute_w(const char* name,const char* attr_name,const char* attr_value) const
- {
- if (empty()) return xml_node();
-
- return impl::first_element_by_attribute(_root, name, attr_name, attr_value, &strcmpwildimpl);
- }
-
- namespace impl
- {
- xml_node first_element_by_attribute(const xml_node_struct* node, const char* attr_name,const char* attr_value, strcmpfunc pred)
- {
- for (xml_node_struct* i = node->first_child; i; i = i->next_sibling)
- {
- for (xml_attribute_struct* j = i->first_attribute; j; j = j->next_attribute)
- {
- if (j->name && j->value && !pred(attr_name, j->name) && !pred(attr_value, j->value))
- return xml_node(i); // Wrap it up and return.
- }
-
- if (i->first_child)
- {
- xml_node found = first_element_by_attribute(i->first_child, attr_name, attr_value, pred);
- if (!found.empty()) return found; // Found.
- }
- }
- return xml_node(); // Not found.
- }
- }
-
- xml_node xml_node::first_element_by_attribute(const char* attr_name,const char* attr_value) const
- {
- if (empty()) return xml_node();
-
- return impl::first_element_by_attribute(_root, attr_name, attr_value, &strcmp);
- }
-
- xml_node xml_node::first_element_by_attribute_w(const char* attr_name,const char* attr_value) const
- {
- if (empty()) return xml_node();
-
- return impl::first_element_by_attribute(_root, attr_name, attr_value, &strcmpwildimpl);
- }
-
- xml_node xml_node::first_node(xml_node_type type) const
- {
- if(!_root) return xml_node();
- for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling)
- {
- if (i->type == type) return xml_node(i);
- else if (i->first_child)
- {
- xml_node subsearch(i);
- xml_node found = subsearch.first_node(type);
- if(!found.empty()) return found; // Found.
- }
- }
- return xml_node(); // Not found.
- }
-
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <new>
+
+#ifndef PUGIXML_NO_STL
+# include <fstream>
+#endif
+
+#ifdef _MSC_VER
+# pragma warning(disable: 4127) // conditional expression is constant
+# pragma warning(disable: 4996) // this function or variable may be unsafe
+#endif
+
+#ifdef __BORLANDC__
+# pragma warn -8008 // condition is always false
+# pragma warn -8066 // unreachable code
+#endif
+
+#define STATIC_ASSERT(cond) { static const char condition_failed[(cond) ? 1 : -1] = {0}; (void)condition_failed; }
+
+namespace pugi
+{
+ class xml_allocator
+ {
+ public:
+ xml_allocator(xml_memory_block* root): _root(root)
+ {
+ }
+
+ template <typename T> T* allocate()
+ {
+ void* buf = memalloc(sizeof(T));
+ return new (buf) T();
+ }
+
+ template <typename T, typename U> T* allocate(U val)
+ {
+ void* buf = memalloc(sizeof(T));
+ return new (buf) T(val);
+ }
+
+ private:
+ xml_memory_block* _root;
+
+ void* memalloc(size_t size)
+ {
+ if (_root->size + size <= memory_block_size)
+ {
+ void* buf = _root->data + _root->size;
+ _root->size += size;
+ return buf;
+ }
+ else
+ {
+ _root->next = new xml_memory_block();
+ _root = _root->next;
+
+ _root->size = size;
+
+ return _root->data;
+ }
+ }
+ };
+
+ /// A 'name=value' XML attribute structure.
+ struct xml_attribute_struct
+ {
+ /// Default ctor
+ xml_attribute_struct(): name_insitu(true), value_insitu(true), document_order(0), name(0), value(0), prev_attribute(0), next_attribute(0)
+ {
+ }
+
+ void free()
+ {
+ if (!name_insitu) delete[] name;
+ if (!value_insitu) delete[] value;
+ }
+
+ bool name_insitu : 1;
+ bool value_insitu : 1;
+ unsigned int document_order : 30; ///< Document order value
+
+ char* name; ///< Pointer to attribute name.
+ char* value; ///< Pointer to attribute value.
+
+ xml_attribute_struct* prev_attribute; ///< Previous attribute
+ xml_attribute_struct* next_attribute; ///< Next attribute
+ };
+
+ /// An XML document tree node.
+ struct xml_node_struct
+ {
+ /// Default ctor
+ /// \param type - node type
+ xml_node_struct(xml_node_type type = node_element): type(type), name_insitu(true), value_insitu(true), document_order(0), parent(0), name(0), value(0), first_child(0), last_child(0), prev_sibling(0), next_sibling(0), first_attribute(0), last_attribute(0)
+ {
+ }
+
+ void free()
+ {
+ if (!name_insitu) delete[] name;
+ if (!value_insitu) delete[] value;
+
+ for (xml_node_struct* cur = first_child; cur; cur = cur->next_sibling)
+ cur->free();
+
+ for (xml_attribute_struct* cur = first_attribute; cur; cur = cur->next_attribute)
+ cur->free();
+ }
+
+ xml_node_struct* append_node(xml_allocator& alloc, xml_node_type type = node_element)
+ {
+ xml_node_struct* child = alloc.allocate<xml_node_struct>(type);
+ child->parent = this;
+
+ if (last_child)
+ {
+ last_child->next_sibling = child;
+ child->prev_sibling = last_child;
+ last_child = child;
+ }
+ else first_child = last_child = child;
+
+ return child;
+ }
+
+ xml_attribute_struct* append_attribute(xml_allocator& alloc)
+ {
+ xml_attribute_struct* a = alloc.allocate<xml_attribute_struct>();
+
+ if (last_attribute)
+ {
+ last_attribute->next_attribute = a;
+ a->prev_attribute = last_attribute;
+ last_attribute = a;
+ }
+ else first_attribute = last_attribute = a;
+
+ return a;
+ }
+
+ unsigned int type : 3; ///< Node type; see xml_node_type.
+ bool name_insitu : 1;
+ bool value_insitu : 1;
+ unsigned int document_order : 27; ///< Document order value
+
+ xml_node_struct* parent; ///< Pointer to parent
+
+ char* name; ///< Pointer to element name.
+ char* value; ///< Pointer to any associated string data.
+
+ xml_node_struct* first_child; ///< First child
+ xml_node_struct* last_child; ///< Last child
+
+ xml_node_struct* prev_sibling; ///< Left brother
+ xml_node_struct* next_sibling; ///< Right brother
+
+ xml_attribute_struct* first_attribute; ///< First attribute
+ xml_attribute_struct* last_attribute; ///< Last attribute
+ };
+
+ struct xml_document_struct: public xml_node_struct
+ {
+ xml_document_struct(): xml_node_struct(node_document), allocator(0)
+ {
+ }
+
+ xml_allocator allocator;
+ };
+}
+
+namespace
+{
+ using namespace pugi;
+
+ const unsigned char UTF8_BYTE_MASK = 0xBF;
+ const unsigned char UTF8_BYTE_MARK = 0x80;
+ const unsigned char UTF8_BYTE_MASK_READ = 0x3F;
+ const unsigned char UTF8_FIRST_BYTE_MARK[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };
+
+ enum chartype
+ {
+ ct_parse_pcdata = 1, // \0, &, \r, <
+ ct_parse_attr = 2, // \0, &, \r, ', "
+ ct_parse_attr_ws = 4, // \0, &, \r, ', ", \n, space, tab
+ ct_space = 8, // \r, \n, space, tab
+ ct_parse_cdata = 16, // \0, ], >, \r
+ ct_parse_comment = 32, // \0, -, >, \r
+ ct_symbol = 64, // Any symbol > 127, a-z, A-Z, 0-9, _, :, -, .
+ ct_start_symbol = 128 // Any symbol > 127, a-z, A-Z, _, :
+ };
+
+ const unsigned char chartype_table[256] =
+ {
+ 55, 0, 0, 0, 0, 0, 0, 0, 0, 12, 12, 0, 0, 63, 0, 0, // 0-15
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16-31
+ 12, 0, 6, 0, 0, 0, 7, 6, 0, 0, 0, 0, 0, 96, 64, 0, // 32-47
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 192, 0, 1, 0, 48, 0, // 48-63
+ 0, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, // 64-79
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 0, 0, 16, 0, 192, // 80-95
+ 0, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, // 96-111
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 0, 0, 0, 0, 0, // 112-127
+
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, // 128+
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192
+ };
+
+ bool is_chartype(char c, chartype ct)
+ {
+ return !!(chartype_table[static_cast<unsigned char>(c)] & ct);
+ }
+
+ bool strcpy_insitu(char*& dest, bool& insitu, const char* source)
+ {
+ size_t source_size = strlen(source);
+
+ if (dest && strlen(dest) >= source_size)
+ {
+ strcpy(dest, source);
+
+ return true;
+ }
+ else
+ {
+ char* buf;
+
+ try
+ {
+ buf = new char[source_size + 1];
+ }
+ catch (const std::bad_alloc&)
+ {
+ return false;
+ }
+
+ strcpy(buf, source);
+
+ if (!insitu) delete[] dest;
+
+ dest = buf;
+ insitu = false;
+
+ return true;
+ }
+ }
+
+ // Get the size that is needed for strutf16_utf8 applied to all s characters
+ size_t strutf16_utf8_size(const wchar_t* s)
+ {
+ size_t length = 0;
+
+ for (; *s; ++s)
+ {
+ unsigned int ch = *s;
+
+ if (ch < 0x80) length += 1;
+ else if (ch < 0x800) length += 2;
+ else if (ch < 0x10000) length += 3;
+ else if (ch < 0x200000) length += 4;
+ }
+
+ return length;
+ }
+
+ // Write utf16 char to stream, return position after the last written char
+ // \return position after last char
+ char* strutf16_utf8(char* s, unsigned int ch)
+ {
+ unsigned int length;
+
+ if (ch < 0x80) length = 1;
+ else if (ch < 0x800) length = 2;
+ else if (ch < 0x10000) length = 3;
+ else if (ch < 0x200000) length = 4;
+ else return s;
+
+ s += length;
+
+ // Scary scary fall throughs.
+ switch (length)
+ {
+ case 4:
+ *--s = (char)((ch | UTF8_BYTE_MARK) & UTF8_BYTE_MASK);
+ ch >>= 6;
+ case 3:
+ *--s = (char)((ch | UTF8_BYTE_MARK) & UTF8_BYTE_MASK);
+ ch >>= 6;
+ case 2:
+ *--s = (char)((ch | UTF8_BYTE_MARK) & UTF8_BYTE_MASK);
+ ch >>= 6;
+ case 1:
+ *--s = (char)(ch | UTF8_FIRST_BYTE_MARK[length]);
+ }
+
+ return s + length;
+ }
+
+ // Get the size that is needed for strutf8_utf16 applied to all s characters
+ size_t strutf8_utf16_size(const char* s)
+ {
+ size_t length = 0;
+
+ for (; *s; ++s)
+ {
+ unsigned char ch = static_cast<unsigned char>(*s);
+
+ if (ch < 0x80 || (ch >= 0xC0 && ch < 0xFC)) ++length;
+ }
+
+ return length;
+ }
+
+ // Read utf16 char from utf8 stream, return position after the last read char
+ // \return position after the last char
+ const char* strutf8_utf16(const char* s, unsigned int& ch)
+ {
+ unsigned int length;
+
+ const unsigned char* str = reinterpret_cast<const unsigned char*>(s);
+
+ if (*str < UTF8_BYTE_MARK)
+ {
+ ch = *str;
+ return s + 1;
+ }
+ else if (*str < 0xC0)
+ {
+ ch = ' ';
+ return s + 1;
+ }
+ else if (*str < 0xE0) length = 2;
+ else if (*str < 0xF0) length = 3;
+ else if (*str < 0xF8) length = 4;
+ else if (*str < 0xFC) length = 5;
+ else
+ {
+ ch = ' ';
+ return s + 1;
+ }
+
+ ch = (*str++ & ~UTF8_FIRST_BYTE_MARK[length]);
+
+ // Scary scary fall throughs.
+ switch (length)
+ {
+ case 5:
+ ch <<= 6;
+ ch += (*str++ & UTF8_BYTE_MASK_READ);
+ case 4:
+ ch <<= 6;
+ ch += (*str++ & UTF8_BYTE_MASK_READ);
+ case 3:
+ ch <<= 6;
+ ch += (*str++ & UTF8_BYTE_MASK_READ);
+ case 2:
+ ch <<= 6;
+ ch += (*str++ & UTF8_BYTE_MASK_READ);
+ }
+
+ return reinterpret_cast<const char*>(str);
+ }
+
#ifndef PUGIXML_NO_STL
- std::string xml_node::path(char delimiter) const
- {
- std::string path;
-
- xml_node cursor = *this; // Make a copy.
-
- path = cursor.name();
-
- while (cursor.parent() && !cursor.type_document()) // Loop to parent (stopping on actual root because it has no name).
- {
- cursor = cursor.parent();
-
- std::string temp = cursor.name();
- temp += delimiter;
- temp += path;
- path.swap(temp);
- }
-
- return path;
- }
+ template <bool quotes, bool utf8> void text_output_escaped(std::ostream& os, const char* s)
+ {
+ while (*s)
+ {
+ const char* prev = s;
+
+ // While *s is a usual symbol
+ while (*s && *s != '&' && *s != '<' && *s != '>' && ((*s != '"' && *s != '\'') || !quotes)
+ && (*s >= 32 || *s == '\r' || *s == '\n' || *s == '\t'))
+ ++s;
+
+ if (prev != s) os.write(prev, static_cast<std::streamsize>(s - prev));
+
+ switch (*s)
+ {
+ case 0: break;
+ case '&':
+ os << "&amp;";
+ ++s;
+ break;
+ case '<':
+ os << "&lt;";
+ ++s;
+ break;
+ case '>':
+ os << "&gt;";
+ ++s;
+ break;
+ case '"':
+ os << "&quot;";
+ ++s;
+ break;
+ case '\'':
+ os << "&apos;";
+ ++s;
+ break;
+ default: // s is not a usual symbol
+ {
+ unsigned int ch;
+
+ if (utf8)
+ s = strutf8_utf16(s, ch);
+ else
+ ch = (unsigned char)*s++;
+
+ os << "&#" << ch << ";";
+ }
+ }
+ }
+ }
#endif
-
- xml_node xml_node::first_element_by_path(const char* path, char delimiter) const
- {
- xml_node found = *this; // Current search context.
-
- if (empty() || !path || !path[0]) return found;
-
- if (path[0] == delimiter)
- {
- // Absolute path; e.g. '/foo/bar'
- while (found.parent()) found = found.parent();
- ++path;
- }
-
- const char* path_segment = path;
-
- while (*path_segment == delimiter) ++path_segment;
-
- const char* path_segment_end = path_segment;
-
- while (*path_segment_end && *path_segment_end != delimiter) ++path_segment_end;
-
- if (path_segment == path_segment_end) return found;
-
- const char* next_segment = path_segment_end;
-
- while (*next_segment == delimiter) ++next_segment;
-
- if (*path_segment == '.' && path_segment + 1 == path_segment_end)
- return found.first_element_by_path(next_segment, delimiter);
- else if (*path_segment == '.' && *(path_segment+1) == '.' && path_segment + 2 == path_segment_end)
- return found.parent().first_element_by_path(next_segment, delimiter);
- else
- {
- for (xml_node_struct* j = found._root->first_child; j; j = j->next_sibling)
- {
- if (j->name && !strcmprange(j->name, path_segment, path_segment_end))
- {
- xml_node subsearch = xml_node(j).first_element_by_path(next_segment, delimiter);
-
- if (subsearch) return subsearch;
- }
- }
-
- return xml_node();
- }
- }
-
- bool xml_node::traverse(xml_tree_walker& walker) const
- {
- if (!walker.begin(*this)) return false; // Send the callback for begin traverse if depth is zero.
- if(!empty()) // Don't traverse if this is a null node.
- {
- walker.push(); // Increment the walker depth counter.
-
- for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling)
- {
- xml_node subsearch(i);
- if (!subsearch.traverse(walker)) return false;
- }
- walker.pop(); // Decrement the walker depth counter.
- }
- if (!walker.end(*this)) return false; // Send the callback for end traverse if depth is zero.
-
- return true;
- }
-
- xml_node_iterator::xml_node_iterator()
- {
- }
-
- xml_node_iterator::xml_node_iterator(const xml_node& node): _wrap(node)
- {
- }
-
- xml_node_iterator::xml_node_iterator(const xml_node_struct* ref): _wrap(ref)
- {
- }
-
- xml_node_iterator::xml_node_iterator(const xml_node_struct* ref, const xml_node_struct* prev): _prev(prev), _wrap(ref)
- {
- }
-
- bool xml_node_iterator::operator==(const xml_node_iterator& rhs) const
- {
- return (_wrap == rhs._wrap);
- }
-
- bool xml_node_iterator::operator!=(const xml_node_iterator& rhs) const
- {
- return (_wrap != rhs._wrap);
- }
-
- const xml_node& xml_node_iterator::operator*() const
- {
- return _wrap;
- }
-
- const xml_node* xml_node_iterator::operator->() const
- {
- return &_wrap;
- }
-
- const xml_node_iterator& xml_node_iterator::operator++()
- {
- _prev = _wrap;
- _wrap = xml_node(_wrap._root->next_sibling);
- return *this;
- }
-
- xml_node_iterator xml_node_iterator::operator++(int)
- {
- xml_node_iterator temp = *this;
- ++*this;
- return temp;
- }
-
- const xml_node_iterator& xml_node_iterator::operator--()
- {
- if (_wrap._root) _wrap = xml_node(_wrap._root->prev_sibling);
- else _wrap = _prev;
- return *this;
- }
-
- xml_node_iterator xml_node_iterator::operator--(int)
- {
- xml_node_iterator temp = *this;
- --*this;
- return temp;
- }
-
- xml_attribute_iterator::xml_attribute_iterator()
- {
- }
-
- xml_attribute_iterator::xml_attribute_iterator(const xml_attribute& attr): _wrap(attr)
- {
- }
-
- xml_attribute_iterator::xml_attribute_iterator(const xml_attribute_struct* ref): _wrap(ref)
- {
- }
-
- xml_attribute_iterator::xml_attribute_iterator(const xml_attribute_struct* ref, const xml_attribute_struct* prev): _prev(prev), _wrap(ref)
- {
- }
-
- bool xml_attribute_iterator::operator==(const xml_attribute_iterator& rhs) const
- {
- return (_wrap == rhs._wrap);
- }
-
- bool xml_attribute_iterator::operator!=(const xml_attribute_iterator& rhs) const
- {
- return (_wrap != rhs._wrap);
- }
-
- const xml_attribute& xml_attribute_iterator::operator*() const
- {
- return _wrap;
- }
-
- const xml_attribute* xml_attribute_iterator::operator->() const
- {
- return &_wrap;
- }
-
- const xml_attribute_iterator& xml_attribute_iterator::operator++()
- {
- _prev = _wrap;
- _wrap = xml_attribute(_wrap._attr->next_attribute);
- return *this;
- }
-
- xml_attribute_iterator xml_attribute_iterator::operator++(int)
- {
- xml_attribute_iterator temp = *this;
- ++*this;
- return temp;
- }
-
- const xml_attribute_iterator& xml_attribute_iterator::operator--()
- {
- if (_wrap._attr) _wrap = xml_attribute(_wrap._attr->prev_attribute);
- else _wrap = _prev;
- return *this;
- }
-
- xml_attribute_iterator xml_attribute_iterator::operator--(int)
- {
- xml_attribute_iterator temp = *this;
- --*this;
- return temp;
- }
-
- xml_memory_block::xml_memory_block(): next(0), size(0)
- {
- }
-
- xml_parser::xml_parser(unsigned int optmsk): _buffer(0), _xmldoc(0), _optmsk(optmsk)
- {
- }
-
-#ifndef PUGIXML_NO_STL
- xml_parser::xml_parser(std::istream& stream,unsigned int optmsk): _buffer(0), _xmldoc(0), _optmsk(optmsk)
- {
- parse(stream, _optmsk);
- }
-#endif
-
- xml_parser::xml_parser(char* xmlstr,unsigned int optmsk): _buffer(0), _xmldoc(0), _optmsk(optmsk)
- {
- parse(xmlstr, _optmsk);
- }
-
- xml_parser::xml_parser(const transfer_ownership_tag& tag, char* xmlstr ,unsigned int optmsk): _buffer(0), _xmldoc(0), _optmsk(optmsk)
- {
- parse(tag, xmlstr, _optmsk);
- }
-
- xml_parser::~xml_parser()
- {
- free();
- }
-
- void xml_parser::free()
- {
- delete _buffer;
- _buffer = 0;
-
- xml_memory_block* current = _memory.next;
-
- while (current)
- {
- xml_memory_block* next = current->next;
- delete current;
- current = next;
- }
-
- _memory.next = 0;
- _memory.size = 0;
- }
-
- xml_parser::operator xml_node() const
- {
- return xml_node(_xmldoc);
- }
-
- xml_node xml_parser::document() const
- {
- return xml_node(_xmldoc);
- }
-
- unsigned int xml_parser::options() const
- {
- return _optmsk;
- }
-
- unsigned int xml_parser::options(unsigned int optmsk)
- {
- unsigned int prev = _optmsk;
- _optmsk = optmsk;
- return prev;
- }
-
-#ifndef PUGIXML_NO_STL
- void xml_parser::parse(std::istream& stream,unsigned int optmsk)
- {
- free();
-
- std::streamoff length = 0, pos = stream.tellg();
- stream.seekg(0, std::ios_base::end);
- length = stream.tellg();
- stream.seekg(pos, std::ios_base::beg);
-
- char* s = new char[length + 1];
- stream.read(s, length);
- s[length] = 0;
-
- parse(transfer_ownership_tag(), s, optmsk); // Parse the input string.
- }
-#endif
-
- char* xml_parser::parse(char* xmlstr,unsigned int optmsk)
- {
- free();
-
- if(!xmlstr) return 0;
-
- xml_allocator alloc(&_memory);
-
- _xmldoc = alloc.allocate<xml_node_struct>(node_document); // Allocate a new root.
- _xmldoc->parent = _xmldoc; // Point to self.
- if(optmsk != parse_noset) _optmsk = optmsk;
-
- xml_parser_impl parser(alloc);
-
- return parser.parse(xmlstr,_xmldoc,_optmsk); // Parse the input string.
- }
-
- char* xml_parser::parse(const transfer_ownership_tag&, char* xmlstr,unsigned int optmsk)
- {
- free();
-
- if(!xmlstr) return 0;
-
- _buffer = xmlstr;
-
- xml_allocator alloc(&_memory);
-
- _xmldoc = alloc.allocate<xml_node_struct>(node_document); // Allocate a new root.
- _xmldoc->parent = _xmldoc; // Point to self.
- if(optmsk != parse_noset) _optmsk = optmsk;
-
- xml_parser_impl parser(alloc);
-
- return parser.parse(xmlstr,_xmldoc,_optmsk); // Parse the input string.
- }
-
-#ifndef PUGIXML_NO_STL
- std::string utf8(const wchar_t* str)
- {
- std::string result;
- result.reserve(strutf16_utf8_size(str));
-
- for (; *str; ++str)
- {
- char buffer[6];
-
- result.append(buffer, strutf16_utf8(buffer, *str));
- }
-
- return result;
- }
-
- std::wstring utf16(const char* str)
- {
- std::wstring result;
- result.reserve(strutf8_utf16_size(str));
-
- for (; *str;)
- {
- unsigned int ch;
- str = strutf8_utf16(str, ch);
- result += (wchar_t)ch;
- }
-
- return result;
- }
-#endif
-}
+
+ struct gap
+ {
+ char* end;
+ size_t size;
+
+ gap(): end(0), size(0)
+ {
+ }
+
+ // Push new gap, move s count bytes further (skipping the gap).
+ // Collapse previous gap.
+ void push(char*& s, size_t count)
+ {
+ if (end) // there was a gap already; collapse it
+ {
+ // Move [old_gap_end, new_gap_start) to [old_gap_start, ...)
+ std::memmove(end - size, end, s - end);
+ }
+
+ s += count; // end of current gap
+
+ // "merge" two gaps
+ end = s;
+ size += count;
+ }
+
+ // Collapse all gaps, return past-the-end pointer
+ char* flush(char* s)
+ {
+ if (end)
+ {
+ // Move [old_gap_end, current_pos) to [old_gap_start, ...)
+ std::memmove(end - size, end, s - end);
+
+ return s - size;
+ }
+ else return s;
+ }
+ };
+
+ char* strconv_escape(char* s, gap& g)
+ {
+ char* stre = s + 1;
+
+ switch (*stre)
+ {
+ case '#': // &#...
+ {
+ unsigned int ucsc = 0;
+
+ ++stre;
+
+ if (*stre == 'x') // &#x... (hex code)
+ {
+ ++stre;
+
+ while (*stre)
+ {
+ if (*stre >= '0' && *stre <= '9')
+ ucsc = 16 * ucsc + (*stre++ - '0');
+ else if (*stre >= 'A' && *stre <= 'F')
+ ucsc = 16 * ucsc + (*stre++ - 'A' + 10);
+ else if (*stre >= 'a' && *stre <= 'f')
+ ucsc = 16 * ucsc + (*stre++ - 'a' + 10);
+ else if (*stre == ';')
+ break;
+ else // cancel
+ return stre;
+ }
+
+ if (*stre != ';') return stre;
+
+ ++stre;
+ }
+ else // &#... (dec code)
+ {
+ while (*stre >= '0' && *stre <= '9')
+ ucsc = 10 * ucsc + (*stre++ - '0');
+
+ if (*stre != ';') return stre;
+
+ ++stre;
+ }
+
+ s = strutf16_utf8(s, ucsc);
+
+ g.push(s, stre - s);
+ return stre;
+ }
+ case 'a': // &a
+ {
+ ++stre;
+
+ if (*stre == 'm') // &am
+ {
+ if (*++stre == 'p' && *++stre == ';') // &amp;
+ {
+ *s++ = '&';
+ ++stre;
+
+ g.push(s, stre - s);
+ return stre;
+ }
+ }
+ else if (*stre == 'p') // &ap
+ {
+ if (*++stre == 'o' && *++stre == 's' && *++stre == ';') // &apos;
+ {
+ *s++ = '\'';
+ ++stre;
+
+ g.push(s, stre - s);
+ return stre;
+ }
+ }
+ break;
+ }
+ case 'g': // &g
+ {
+ if (*++stre == 't' && *++stre == ';') // &gt;
+ {
+ *s++ = '>';
+ ++stre;
+
+ g.push(s, stre - s);
+ return stre;
+ }
+ break;
+ }
+ case 'l': // &l
+ {
+ if (*++stre == 't' && *++stre == ';') // &lt;
+ {
+ *s++ = '<';
+ ++stre;
+
+ g.push(s, stre - s);
+ return stre;
+ }
+ break;
+ }
+ case 'q': // &q
+ {
+ if (*++stre == 'u' && *++stre == 'o' && *++stre == 't' && *++stre == ';') // &quot;
+ {
+ *s++ = '"';
+ ++stre;
+
+ g.push(s, stre - s);
+ return stre;
+ }
+ break;
+ }
+ }
+
+ return stre;
+ }
+
+ char* strconv_comment(char* s)
+ {
+ if (!*s) return 0;
+
+ gap g;
+
+ while (true)
+ {
+ while (!is_chartype(*s, ct_parse_comment)) ++s;
+
+ if (*s == '\r') // Either a single 0x0d or 0x0d 0x0a pair
+ {
+ *s++ = '\n'; // replace first one with 0x0a
+
+ if (*s == '\n') g.push(s, 1);
+ }
+ else if (*s == '-' && *(s+1) == '-' && *(s+2) == '>') // comment ends here
+ {
+ *g.flush(s) = 0;
+
+ return s + 3;
+ }
+ else if (*s == 0)
+ {
+ return 0;
+ }
+ else ++s;
+ }
+ }
+
+ char* strconv_cdata(char* s)
+ {
+ if (!*s) return 0;
+
+ gap g;
+
+ while (true)
+ {
+ while (!is_chartype(*s, ct_parse_cdata)) ++s;
+
+ if (*s == '\r') // Either a single 0x0d or 0x0d 0x0a pair
+ {
+ *s++ = '\n'; // replace first one with 0x0a
+
+ if (*s == '\n') g.push(s, 1);
+ }
+ else if (*s == ']' && *(s+1) == ']' && *(s+2) == '>') // CDATA ends here
+ {
+ *g.flush(s) = 0;
+
+ return s + 1;
+ }
+ else if (*s == 0)
+ {
+ return 0;
+ }
+ else ++s;
+ }
+ }
+
+ template <bool opt_eol, bool opt_escape> char* strconv_pcdata_t(char* s)
+ {
+ if (!*s) return 0;
+
+ gap g;
+
+ while (true)
+ {
+ while (!is_chartype(*s, ct_parse_pcdata)) ++s;
+
+ if (opt_eol && *s == '\r') // Either a single 0x0d or 0x0d 0x0a pair
+ {
+ *s++ = '\n'; // replace first one with 0x0a
+
+ if (*s == '\n') g.push(s, 1);
+ }
+ else if (opt_escape && *s == '&')
+ {
+ s = strconv_escape(s, g);
+ }
+ else if (*s == '<') // PCDATA ends here
+ {
+ *g.flush(s) = 0;
+
+ return s + 1;
+ }
+ else if (*s == 0)
+ {
+ return s;
+ }
+ else ++s;
+ }
+ }
+
+ char* strconv_pcdata(char* s, unsigned int optmask)
+ {
+ STATIC_ASSERT(parse_escapes == 0x10 && parse_eol == 0x20);
+
+ switch ((optmask >> 4) & 3) // get bitmask for flags (eol escapes)
+ {
+ case 0: return strconv_pcdata_t<0, 0>(s);
+ case 1: return strconv_pcdata_t<0, 1>(s);
+ case 2: return strconv_pcdata_t<1, 0>(s);
+ case 3: return strconv_pcdata_t<1, 1>(s);
+ default: return 0; // should not get here
+ }
+ }
+
+ template <bool opt_wconv, bool opt_wnorm, bool opt_eol, bool opt_escape> char* strconv_attribute_t(char* s, char end_quote)
+ {
+ if (!*s) return 0;
+
+ gap g;
+
+ // Trim whitespaces
+ if (opt_wnorm)
+ {
+ char* str = s;
+
+ while (is_chartype(*str, ct_space)) ++str;
+
+ if (str != s)
+ g.push(s, str - s);
+ }
+
+ while (true)
+ {
+ while (!is_chartype(*s, (opt_wnorm || opt_wconv) ? ct_parse_attr_ws : ct_parse_attr)) ++s;
+
+ if (opt_escape && *s == '&')
+ {
+ s = strconv_escape(s, g);
+ }
+ else if (opt_wnorm && is_chartype(*s, ct_space))
+ {
+ *s++ = ' ';
+
+ if (is_chartype(*s, ct_space))
+ {
+ char* str = s + 1;
+ while (is_chartype(*str, ct_space)) ++str;
+
+ g.push(s, str - s);
+ }
+ }
+ else if (opt_wconv && is_chartype(*s, ct_space))
+ {
+ if (opt_eol)
+ {
+ if (*s == '\r')
+ {
+ *s++ = ' ';
+
+ if (*s == '\n') g.push(s, 1);
+ }
+ else *s++ = ' ';
+ }
+ else *s++ = ' ';
+ }
+ else if (opt_eol && *s == '\r')
+ {
+ *s++ = '\n';
+
+ if (*s == '\n') g.push(s, 1);
+ }
+ else if (*s == end_quote)
+ {
+ char* str = g.flush(s);
+
+ if (opt_wnorm)
+ {
+ do *str-- = 0;
+ while (is_chartype(*str, ct_space));
+ }
+ else *str = 0;
+
+ return s + 1;
+ }
+ else if (!*s)
+ {
+ return 0;
+ }
+ else ++s;
+ }
+ }
+
+ char* strconv_attribute(char* s, char end_quote, unsigned int optmask)
+ {
+ STATIC_ASSERT(parse_escapes == 0x10 && parse_eol == 0x20 && parse_wnorm_attribute == 0x40 && parse_wconv_attribute == 0x80);
+
+ switch ((optmask >> 4) & 15) // get bitmask for flags (wconv wnorm eol escapes)
+ {
+ case 0: return strconv_attribute_t <0, 0, 0, 0>(s, end_quote);
+ case 1: return strconv_attribute_t <0, 0, 0, 1>(s, end_quote);
+ case 2: return strconv_attribute_t <0, 0, 1, 0>(s, end_quote);
+ case 3: return strconv_attribute_t <0, 0, 1, 1>(s, end_quote);
+ case 4: return strconv_attribute_t <0, 1, 0, 0>(s, end_quote);
+ case 5: return strconv_attribute_t <0, 1, 0, 1>(s, end_quote);
+ case 6: return strconv_attribute_t <0, 1, 1, 0>(s, end_quote);
+ case 7: return strconv_attribute_t <0, 1, 1, 1>(s, end_quote);
+ case 8: return strconv_attribute_t <1, 0, 0, 0>(s, end_quote);
+ case 9: return strconv_attribute_t <1, 0, 0, 1>(s, end_quote);
+ case 10: return strconv_attribute_t<1, 0, 1, 0>(s, end_quote);
+ case 11: return strconv_attribute_t<1, 0, 1, 1>(s, end_quote);
+ case 12: return strconv_attribute_t<1, 1, 0, 0>(s, end_quote);
+ case 13: return strconv_attribute_t<1, 1, 0, 1>(s, end_quote);
+ case 14: return strconv_attribute_t<1, 1, 1, 0>(s, end_quote);
+ case 15: return strconv_attribute_t<1, 1, 1, 1>(s, end_quote);
+ default: return 0; // should not get here
+ }
+ }
+
+ struct xml_parser
+ {
+ xml_allocator& alloc;
+
+ // Parser utilities.
+ #define SKIPWS() { while (is_chartype(*s, ct_space)) ++s; }
+ #define OPTSET(OPT) ( optmsk & OPT )
+ #define PUSHNODE(TYPE) { cursor = cursor->append_node(alloc,TYPE); }
+ #define POPNODE() { cursor = cursor->parent; }
+ #define SCANFOR(X) { while (*s != 0 && !(X)) ++s; }
+ #define SCANWHILE(X) { while ((X)) ++s; }
+ #define ENDSEG() { ch = *s; *s = 0; ++s; }
+ #define CHECK_ERROR() { if (*s == 0) return false; }
+
+ xml_parser(xml_allocator& alloc): alloc(alloc)
+ {
+ }
+
+ bool parse(char* s, xml_node_struct* xmldoc, unsigned int optmsk = parse_default)
+ {
+ if (!s || !xmldoc) return false;
+
+ // UTF-8 BOM
+ if ((unsigned char)*s == 0xEF && (unsigned char)*(s+1) == 0xBB && (unsigned char)*(s+2) == 0xBF)
+ s += 3;
+
+ char ch = 0;
+ xml_node_struct* cursor = xmldoc;
+ char* mark = s;
+
+ while (*s != 0)
+ {
+ if (*s == '<')
+ {
+ ++s;
+
+ LOC_TAG:
+ if (*s == '?') // '<?...'
+ {
+ ++s;
+
+ if (!is_chartype(*s, ct_start_symbol)) // bad PI
+ return false;
+ else if (OPTSET(parse_pi))
+ {
+ mark = s;
+ SCANWHILE(is_chartype(*s, ct_symbol)); // Read PI target
+ CHECK_ERROR();
+
+ if (!is_chartype(*s, ct_space) && *s != '?') // Target has to end with space or ?
+ return false;
+
+ ENDSEG();
+ CHECK_ERROR();
+
+ if (ch == '?') // nothing except target present
+ {
+ if (*s != '>') return false;
+ ++s;
+
+ // stricmp / strcasecmp is not portable
+ if ((mark[0] == 'x' || mark[0] == 'X') && (mark[1] == 'm' || mark[1] == 'M')
+ && (mark[2] == 'l' || mark[2] == 'L') && mark[3] == 0)
+ {
+ }
+ else
+ {
+ PUSHNODE(node_pi); // Append a new node on the tree.
+
+ cursor->name = mark;
+
+ POPNODE();
+ }
+ }
+ // stricmp / strcasecmp is not portable
+ else if ((mark[0] == 'x' || mark[0] == 'X') && (mark[1] == 'm' || mark[1] == 'M')
+ && (mark[2] == 'l' || mark[2] == 'L') && mark[3] == 0)
+ {
+ SCANFOR(*s == '?' && *(s+1) == '>'); // Look for '?>'.
+ CHECK_ERROR();
+ s += 2;
+ }
+ else
+ {
+ PUSHNODE(node_pi); // Append a new node on the tree.
+
+ cursor->name = mark;
+
+ if (is_chartype(ch, ct_space))
+ {
+ SKIPWS();
+ CHECK_ERROR();
+
+ mark = s;
+ }
+ else mark = 0;
+
+ SCANFOR(*s == '?' && *(s+1) == '>'); // Look for '?>'.
+ CHECK_ERROR();
+
+ ENDSEG();
+ CHECK_ERROR();
+
+ ++s; // Step over >
+
+ cursor->value = mark;
+
+ POPNODE();
+ }
+ }
+ else // not parsing PI
+ {
+ SCANFOR(*s == '?' && *(s+1) == '>'); // Look for '?>'.
+ CHECK_ERROR();
+
+ s += 2;
+ }
+ }
+ else if (*s == '!') // '<!...'
+ {
+ ++s;
+
+ if (*s == '-') // '<!-...'
+ {
+ ++s;
+
+ if (*s == '-') // '<!--...'
+ {
+ ++s;
+
+ if (OPTSET(parse_comments))
+ {
+ PUSHNODE(node_comment); // Append a new node on the tree.
+ cursor->value = s; // Save the offset.
+ }
+
+ if (OPTSET(parse_eol) && OPTSET(parse_comments))
+ {
+ s = strconv_comment(s);
+
+ if (!s) return false;
+ }
+ else
+ {
+ // Scan for terminating '-->'.
+ SCANFOR(*s == '-' && *(s+1) == '-' && *(s+2) == '>');
+ CHECK_ERROR();
+
+ if (OPTSET(parse_comments))
+ *s = 0; // Zero-terminate this segment at the first terminating '-'.
+
+ s += 3; // Step over the '\0->'.
+ }
+
+ if (OPTSET(parse_comments))
+ {
+ POPNODE(); // Pop since this is a standalone.
+ }
+ }
+ else return false;
+ }
+ else if(*s == '[')
+ {
+ // '<![CDATA[...'
+ if(*++s=='C' && *++s=='D' && *++s=='A' && *++s=='T' && *++s=='A' && *++s == '[')
+ {
+ ++s;
+
+ if (OPTSET(parse_cdata))
+ {
+ PUSHNODE(node_cdata); // Append a new node on the tree.
+ cursor->value = s; // Save the offset.
+
+ if (OPTSET(parse_eol))
+ {
+ s = strconv_cdata(s);
+
+ if (!s) return false;
+ }
+ else
+ {
+ // Scan for terminating ']]>'.
+ SCANFOR(*s == ']' && *(s+1) == ']' && *(s+2) == '>');
+ CHECK_ERROR();
+
+ ENDSEG(); // Zero-terminate this segment.
+ CHECK_ERROR();
+ }
+
+ POPNODE(); // Pop since this is a standalone.
+ }
+ else // Flagged for discard, but we still have to scan for the terminator.
+ {
+ // Scan for terminating ']]>'.
+ SCANFOR(*s == ']' && *(s+1) == ']' && *(s+2) == '>');
+ CHECK_ERROR();
+
+ ++s;
+ }
+
+ s += 2; // Step over the last ']>'.
+ }
+ else return false;
+ }
+ else if (*s=='D' && *++s=='O' && *++s=='C' && *++s=='T' && *++s=='Y' && *++s=='P' && *++s=='E')
+ {
+ ++s;
+
+ SKIPWS(); // Eat any whitespace.
+ CHECK_ERROR();
+
+ LOC_DOCTYPE:
+ SCANFOR(*s == '\'' || *s == '"' || *s == '[' || *s == '>');
+ CHECK_ERROR();
+
+ if (*s == '\'' || *s == '"') // '...SYSTEM "..."
+ {
+ ch = *s++;
+ SCANFOR(*s == ch);
+ CHECK_ERROR();
+
+ ++s;
+ goto LOC_DOCTYPE;
+ }
+
+ if(*s == '[') // '...[...'
+ {
+ ++s;
+ unsigned int bd = 1; // Bracket depth counter.
+ while (*s!=0) // Loop till we're out of all brackets.
+ {
+ if (*s == ']') --bd;
+ else if (*s == '[') ++bd;
+ if (bd == 0) break;
+ ++s;
+ }
+ }
+
+ SCANFOR(*s == '>');
+ CHECK_ERROR();
+
+ ++s;
+ }
+ else return false;
+ }
+ else if (is_chartype(*s, ct_start_symbol)) // '<#...'
+ {
+ PUSHNODE(node_element); // Append a new node to the tree.
+
+ cursor->name = s;
+
+ SCANWHILE(is_chartype(*s, ct_symbol)); // Scan for a terminator.
+ CHECK_ERROR();
+
+ ENDSEG(); // Save char in 'ch', terminate & step over.
+ CHECK_ERROR();
+
+ if (ch == '/') // '<#.../'
+ {
+ if (*s != '>') return false;
+
+ POPNODE(); // Pop.
+
+ ++s;
+ }
+ else if (ch == '>')
+ {
+ // end of tag
+ }
+ else if (is_chartype(ch, ct_space))
+ {
+ while (*s)
+ {
+ SKIPWS(); // Eat any whitespace.
+ CHECK_ERROR();
+
+ if (is_chartype(*s, ct_start_symbol)) // <... #...
+ {
+ xml_attribute_struct* a = cursor->append_attribute(alloc); // Make space for this attribute.
+ a->name = s; // Save the offset.
+
+ SCANWHILE(is_chartype(*s, ct_symbol)); // Scan for a terminator.
+ CHECK_ERROR();
+
+ ENDSEG(); // Save char in 'ch', terminate & step over.
+ CHECK_ERROR();
+
+ if (is_chartype(ch, ct_space))
+ {
+ SKIPWS(); // Eat any whitespace.
+ CHECK_ERROR();
+
+ ch = *s;
+ ++s;
+ }
+
+ if (ch == '=') // '<... #=...'
+ {
+ SKIPWS(); // Eat any whitespace.
+ CHECK_ERROR();
+
+ if (*s == '\'' || *s == '"') // '<... #="...'
+ {
+ ch = *s; // Save quote char to avoid breaking on "''" -or- '""'.
+ ++s; // Step over the quote.
+ a->value = s; // Save the offset.
+
+ s = strconv_attribute(s, ch, optmsk);
+
+ if (!s) return false;
+
+ // After this line the loop continues from the start;
+ // Whitespaces, / and > are ok, symbols are wrong,
+ // everything else will be detected
+ if (is_chartype(*s, ct_start_symbol)) return false;
+ }
+ else return false;
+ }
+ else return false;
+ }
+ else if (*s == '/')
+ {
+ ++s;
+
+ if (*s != '>') return false;
+
+ POPNODE(); // Pop.
+
+ ++s;
+
+ break;
+ }
+ else if (*s == '>')
+ {
+ ++s;
+
+ break;
+ }
+ else return false;
+ }
+ }
+ else return false;
+ }
+ else if (*s == '/')
+ {
+ ++s;
+
+ if (!cursor) return false;
+
+ char* name = cursor->name;
+ if (!name) return false;
+
+ while (*s && is_chartype(*s, ct_symbol))
+ {
+ if (*s++ != *name++) return false;
+ }
+
+ if (*name) return false;
+
+ POPNODE(); // Pop.
+
+ SKIPWS();
+ CHECK_ERROR();
+
+ if (*s != '>') return false;
+ ++s;
+ }
+ else return false;
+ }
+ else
+ {
+ mark = s; // Save this offset while searching for a terminator.
+
+ SKIPWS(); // Eat whitespace if no genuine PCDATA here.
+
+ if ((mark == s || !OPTSET(parse_ws_pcdata)) && (!*s || *s == '<'))
+ {
+ continue;
+ }
+
+ s = mark;
+
+ if (static_cast<xml_node_type>(cursor->type) != node_document)
+ {
+ PUSHNODE(node_pcdata); // Append a new node on the tree.
+ cursor->value = s; // Save the offset.
+
+ s = strconv_pcdata(s, optmsk);
+
+ if (!s) return false;
+
+ POPNODE(); // Pop since this is a standalone.
+
+ if (!*s) break;
+ }
+ else
+ {
+ SCANFOR(*s == '<'); // '...<'
+ if (!*s) break;
+
+ ++s;
+ }
+
+ // We're after '<'
+ goto LOC_TAG;
+ }
+ }
+
+ if (cursor != xmldoc) return false;
+
+ return true;
+ }
+
+ private:
+ xml_parser(const xml_parser&);
+ const xml_parser& operator=(const xml_parser&);
+ };
+
+ // Compare lhs with [rhs_begin, rhs_end)
+ int strcmprange(const char* lhs, const char* rhs_begin, const char* rhs_end)
+ {
+ while (*lhs && rhs_begin != rhs_end && *lhs == *rhs_begin)
+ {
+ ++lhs;
+ ++rhs_begin;
+ }
+
+ if (rhs_begin == rhs_end && *lhs == 0) return 0;
+ else return 1;
+ }
+
+ // Character set pattern match.
+ int strcmpwild_cset(const char** src, const char** dst)
+ {
+ int find = 0, excl = 0, star = 0;
+
+ if (**src == '!')
+ {
+ excl = 1;
+ ++(*src);
+ }
+
+ while (**src != ']' || star == 1)
+ {
+ if (find == 0)
+ {
+ if (**src == '-' && *(*src-1) < *(*src+1) && *(*src+1) != ']' && star == 0)
+ {
+ if (**dst >= *(*src-1) && **dst <= *(*src+1))
+ {
+ find = 1;
+ ++(*src);
+ }
+ }
+ else if (**src == **dst) find = 1;
+ }
+ ++(*src);
+ star = 0;
+ }
+
+ if (excl == 1) find = (1 - find);
+ if (find == 1) ++(*dst);
+
+ return find;
+ }
+
+ // Wildcard pattern match.
+ int strcmpwild_astr(const char** src, const char** dst)
+ {
+ int find = 1;
+ ++(*src);
+ while ((**dst != 0 && **src == '?') || **src == '*')
+ {
+ if(**src == '?') ++(*dst);
+ ++(*src);
+ }
+ while (**src == '*') ++(*src);
+ if (**dst == 0 && **src != 0) return 0;
+ if (**dst == 0 && **src == 0) return 1;
+ else
+ {
+ if (impl::strcmpwild(*src,*dst))
+ {
+ do
+ {
+ ++(*dst);
+ while(**src != **dst && **src != '[' && **dst != 0)
+ ++(*dst);
+ }
+ while ((**dst != 0) ? impl::strcmpwild(*src,*dst) : 0 != (find=0));
+ }
+ if (**dst == 0 && **src == 0) find = 1;
+ return find;
+ }
+ }
+}
+
+namespace pugi
+{
+ namespace impl
+ {
+ // Compare two strings, with globbing, and character sets.
+ int strcmpwild(const char* src, const char* dst)
+ {
+ int find = 1;
+ for(; *src != 0 && find == 1 && *dst != 0; ++src)
+ {
+ switch (*src)
+ {
+ case '?': ++dst; break;
+ case '[': ++src; find = strcmpwild_cset(&src,&dst); break;
+ case '*': find = strcmpwild_astr(&src,&dst); --src; break;
+ default : find = (int) (*src == *dst); ++dst;
+ }
+ }
+ while (*src == '*' && find == 1) ++src;
+ return (find == 1 && *dst == 0 && *src == 0) ? 0 : 1;
+ }
+ }
+
+ xml_tree_walker::xml_tree_walker(): _depth(0)
+ {
+ }
+
+ xml_tree_walker::~xml_tree_walker()
+ {
+ }
+
+ int xml_tree_walker::depth() const
+ {
+ return _depth;
+ }
+
+ bool xml_tree_walker::begin(xml_node&)
+ {
+ return true;
+ }
+
+ bool xml_tree_walker::end(xml_node&)
+ {
+ return true;
+ }
+
+ xml_attribute::xml_attribute(): _attr(0)
+ {
+ }
+
+ xml_attribute::xml_attribute(xml_attribute_struct* attr): _attr(attr)
+ {
+ }
+
+ xml_attribute::operator xml_attribute::unspecified_bool_type() const
+ {
+ return empty() ? 0 : &xml_attribute::_attr;
+ }
+
+ bool xml_attribute::operator!() const
+ {
+ return empty();
+ }
+
+ bool xml_attribute::operator==(const xml_attribute& r) const
+ {
+ return (_attr == r._attr);
+ }
+
+ bool xml_attribute::operator!=(const xml_attribute& r) const
+ {
+ return (_attr != r._attr);
+ }
+
+ bool xml_attribute::operator<(const xml_attribute& r) const
+ {
+ return (_attr < r._attr);
+ }
+
+ bool xml_attribute::operator>(const xml_attribute& r) const
+ {
+ return (_attr > r._attr);
+ }
+
+ bool xml_attribute::operator<=(const xml_attribute& r) const
+ {
+ return (_attr <= r._attr);
+ }
+
+ bool xml_attribute::operator>=(const xml_attribute& r) const
+ {
+ return (_attr >= r._attr);
+ }
+
+ xml_attribute xml_attribute::next_attribute() const
+ {
+ return _attr ? xml_attribute(_attr->next_attribute) : xml_attribute();
+ }
+
+ xml_attribute xml_attribute::previous_attribute() const
+ {
+ return _attr ? xml_attribute(_attr->prev_attribute) : xml_attribute();
+ }
+
+ int xml_attribute::as_int() const
+ {
+ if(empty() || !_attr->value) return 0;
+ return atoi(_attr->value);
+ }
+
+ double xml_attribute::as_double() const
+ {
+ if(empty() || !_attr->value) return 0.0;
+ return atof(_attr->value);
+ }
+
+ float xml_attribute::as_float() const
+ {
+ if(empty() || !_attr->value) return 0.0f;
+ return (float)atof(_attr->value);
+ }
+
+ bool xml_attribute::as_bool() const
+ {
+ if(empty() || !_attr->value) return false;
+ if(*(_attr->value))
+ {
+ return // Only look at first char:
+ (
+ *(_attr->value) == '1' || // 1*
+ *(_attr->value) == 't' || // t* (true)
+ *(_attr->value) == 'T' || // T* (true|true)
+ *(_attr->value) == 'y' || // y* (yes)
+ *(_attr->value) == 'Y' // Y* (Yes|YES)
+ )
+ ? true : false; // Return true if matches above, else false.
+ }
+ else return false;
+ }
+
+ bool xml_attribute::empty() const
+ {
+ return (_attr == 0);
+ }
+
+ const char* xml_attribute::name() const
+ {
+ return (!empty() && _attr->name) ? _attr->name : "";
+ }
+
+ const char* xml_attribute::value() const
+ {
+ return (!empty() && _attr->value) ? _attr->value : "";
+ }
+
+ unsigned int xml_attribute::document_order() const
+ {
+ return empty() ? 0 : _attr->document_order;
+ }
+
+ xml_attribute& xml_attribute::operator=(const char* rhs)
+ {
+ set_value(rhs);
+ return *this;
+ }
+
+ xml_attribute& xml_attribute::operator=(int rhs)
+ {
+ char buf[128];
+ sprintf(buf, "%d", rhs);
+ set_value(buf);
+ return *this;
+ }
+
+ xml_attribute& xml_attribute::operator=(double rhs)
+ {
+ char buf[128];
+ sprintf(buf, "%g", rhs);
+ set_value(buf);
+ return *this;
+ }
+
+ xml_attribute& xml_attribute::operator=(bool rhs)
+ {
+ set_value(rhs ? "true" : "false");
+ return *this;
+ }
+
+ bool xml_attribute::set_name(const char* rhs)
+ {
+ if (empty()) return false;
+
+ bool insitu = _attr->name_insitu;
+ bool res = strcpy_insitu(_attr->name, insitu, rhs);
+ _attr->name_insitu = insitu;
+
+ return res;
+ }
+
+ bool xml_attribute::set_value(const char* rhs)
+ {
+ if (empty()) return false;
+
+ bool insitu = _attr->value_insitu;
+ bool res = strcpy_insitu(_attr->value, insitu, rhs);
+ _attr->value_insitu = insitu;
+
+ return res;
+ }
+
+#ifdef __BORLANDC__
+ bool operator&&(const xml_attribute& lhs, bool rhs)
+ {
+ return lhs ? rhs : false;
+ }
+
+ bool operator||(const xml_attribute& lhs, bool rhs)
+ {
+ return lhs ? true : rhs;
+ }
+#endif
+
+ xml_node::xml_node(): _root(0)
+ {
+ }
+
+ xml_node::xml_node(xml_node_struct* p): _root(p)
+ {
+ }
+
+ xml_node::operator xml_node::unspecified_bool_type() const
+ {
+ return empty() ? 0 : &xml_node::_root;
+ }
+
+ bool xml_node::operator!() const
+ {
+ return empty();
+ }
+
+ xml_node::iterator xml_node::begin() const
+ {
+ return iterator(_root->first_child);
+ }
+
+ xml_node::iterator xml_node::end() const
+ {
+ return iterator(0, _root->last_child);
+ }
+
+ xml_node::attribute_iterator xml_node::attributes_begin() const
+ {
+ return attribute_iterator(_root->first_attribute);
+ }
+
+ xml_node::attribute_iterator xml_node::attributes_end() const
+ {
+ return attribute_iterator(0, _root->last_attribute);
+ }
+
+ bool xml_node::operator==(const xml_node& r) const
+ {
+ return (_root == r._root);
+ }
+
+ bool xml_node::operator!=(const xml_node& r) const
+ {
+ return (_root != r._root);
+ }
+
+ bool xml_node::operator<(const xml_node& r) const
+ {
+ return (_root < r._root);
+ }
+
+ bool xml_node::operator>(const xml_node& r) const
+ {
+ return (_root > r._root);
+ }
+
+ bool xml_node::operator<=(const xml_node& r) const
+ {
+ return (_root <= r._root);
+ }
+
+ bool xml_node::operator>=(const xml_node& r) const
+ {
+ return (_root >= r._root);
+ }
+
+ bool xml_node::empty() const
+ {
+ return (_root == 0);
+ }
+
+ xml_allocator& xml_node::get_allocator() const
+ {
+ xml_node_struct* r = root()._root;
+
+ return static_cast<xml_document_struct*>(r)->allocator;
+ }
+
+ const char* xml_node::name() const
+ {
+ return (!empty() && _root->name) ? _root->name : "";
+ }
+
+ xml_node_type xml_node::type() const
+ {
+ return _root ? static_cast<xml_node_type>(_root->type) : node_null;
+ }
+
+ const char* xml_node::value() const
+ {
+ return (!empty() && _root->value) ? _root->value : "";
+ }
+
+ xml_node xml_node::child(const char* name) const
+ {
+ if (!empty())
+ for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling)
+ if (i->name && !strcmp(name, i->name)) return xml_node(i);
+
+ return xml_node();
+ }
+
+ xml_node xml_node::child_w(const char* name) const
+ {
+ if (!empty())
+ for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling)
+ if (i->name && !impl::strcmpwild(name, i->name)) return xml_node(i);
+
+ return xml_node();
+ }
+
+ xml_attribute xml_node::attribute(const char* name) const
+ {
+ if (!_root) return xml_attribute();
+
+ for (xml_attribute_struct* i = _root->first_attribute; i; i = i->next_attribute)
+ if (i->name && !strcmp(name, i->name))
+ return xml_attribute(i);
+
+ return xml_attribute();
+ }
+
+ xml_attribute xml_node::attribute_w(const char* name) const
+ {
+ if (!_root) return xml_attribute();
+
+ for (xml_attribute_struct* i = _root->first_attribute; i; i = i->next_attribute)
+ if (i->name && !impl::strcmpwild(name, i->name))
+ return xml_attribute(i);
+
+ return xml_attribute();
+ }
+
+ xml_node xml_node::next_sibling(const char* name) const
+ {
+ if(empty()) return xml_node();
+
+ for (xml_node_struct* i = _root->next_sibling; i; i = i->next_sibling)
+ if (i->name && !strcmp(name, i->name)) return xml_node(i);
+
+ return xml_node();
+ }
+
+ xml_node xml_node::next_sibling_w(const char* name) const
+ {
+ if(empty()) return xml_node();
+
+ for (xml_node_struct* i = _root->next_sibling; i; i = i->next_sibling)
+ if (i->name && !impl::strcmpwild(name, i->name)) return xml_node(i);
+
+ return xml_node();
+ }
+
+ xml_node xml_node::next_sibling() const
+ {
+ if(empty()) return xml_node();
+
+ if (_root->next_sibling) return xml_node(_root->next_sibling);
+ else return xml_node();
+ }
+
+ xml_node xml_node::previous_sibling(const char* name) const
+ {
+ if (empty()) return xml_node();
+
+ for (xml_node_struct* i = _root->prev_sibling; i; i = i->prev_sibling)
+ if (i->name && !strcmp(name, i->name)) return xml_node(i);
+
+ return xml_node();
+ }
+
+ xml_node xml_node::previous_sibling_w(const char* name) const
+ {
+ if (empty()) return xml_node();
+
+ for (xml_node_struct* i = _root->prev_sibling; i; i = i->prev_sibling)
+ if (i->name && !impl::strcmpwild(name, i->name)) return xml_node(i);
+
+ return xml_node();
+ }
+
+ xml_node xml_node::previous_sibling() const
+ {
+ if(empty()) return xml_node();
+
+ if (_root->prev_sibling) return xml_node(_root->prev_sibling);
+ else return xml_node();
+ }
+
+ xml_node xml_node::parent() const
+ {
+ return empty() ? xml_node() : xml_node(_root->parent);
+ }
+
+ xml_node xml_node::root() const
+ {
+ xml_node r = *this;
+ while (r && r.parent()) r = r.parent();
+ return r;
+ }
+
+ const char* xml_node::child_value() const
+ {
+ if (!empty())
+ for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling)
+ if ((static_cast<xml_node_type>(i->type) == node_pcdata || static_cast<xml_node_type>(i->type) == node_cdata) && i->value)
+ return i->value;
+ return "";
+ }
+
+ const char* xml_node::child_value(const char* name) const
+ {
+ return child(name).child_value();
+ }
+
+ const char* xml_node::child_value_w(const char* name) const
+ {
+ return child_w(name).child_value();
+ }
+
+ xml_attribute xml_node::first_attribute() const
+ {
+ return _root ? xml_attribute(_root->first_attribute) : xml_attribute();
+ }
+
+ xml_attribute xml_node::last_attribute() const
+ {
+ return _root ? xml_attribute(_root->last_attribute) : xml_attribute();
+ }
+
+ xml_node xml_node::first_child() const
+ {
+ if (_root) return xml_node(_root->first_child);
+ else return xml_node();
+ }
+
+ xml_node xml_node::last_child() const
+ {
+ if (_root) return xml_node(_root->last_child);
+ else return xml_node();
+ }
+
+ bool xml_node::set_name(const char* rhs)
+ {
+ switch (type())
+ {
+ case node_pi:
+ case node_element:
+ {
+ bool insitu = _root->name_insitu;
+ bool res = strcpy_insitu(_root->name, insitu, rhs);
+ _root->name_insitu = insitu;
+
+ return res;
+ }
+
+ default:
+ return false;
+ }
+ }
+
+ bool xml_node::set_value(const char* rhs)
+ {
+ switch (type())
+ {
+ case node_pi:
+ case node_cdata:
+ case node_pcdata:
+ case node_comment:
+ {
+ bool insitu = _root->value_insitu;
+ bool res = strcpy_insitu(_root->value, insitu, rhs);
+ _root->value_insitu = insitu;
+
+ return res;
+ }
+
+ default:
+ return false;
+ }
+ }
+
+ xml_attribute xml_node::append_attribute(const char* name)
+ {
+ if (type() != node_element) return xml_attribute();
+
+ xml_attribute a(_root->append_attribute(get_allocator()));
+ a.set_name(name);
+
+ return a;
+ }
+
+ xml_attribute xml_node::insert_attribute_before(const char* name, const xml_attribute& attr)
+ {
+ if (type() != node_element || attr.empty()) return xml_attribute();
+
+ // check that attribute belongs to *this
+ xml_attribute_struct* cur = attr._attr;
+
+ while (cur->prev_attribute) cur = cur->prev_attribute;
+
+ if (cur != _root->first_attribute) return xml_attribute();
+
+ xml_attribute a(get_allocator().allocate<xml_attribute_struct>());
+ a.set_name(name);
+
+ if (attr._attr->prev_attribute)
+ attr._attr->prev_attribute->next_attribute = a._attr;
+ else
+ _root->first_attribute = a._attr;
+
+ a._attr->prev_attribute = attr._attr->prev_attribute;
+ a._attr->next_attribute = attr._attr;
+ attr._attr->prev_attribute = a._attr;
+
+ return a;
+ }
+
+ xml_attribute xml_node::insert_attribute_after(const char* name, const xml_attribute& attr)
+ {
+ if (type() != node_element || attr.empty()) return xml_attribute();
+
+ // check that attribute belongs to *this
+ xml_attribute_struct* cur = attr._attr;
+
+ while (cur->prev_attribute) cur = cur->prev_attribute;
+
+ if (cur != _root->first_attribute) return xml_attribute();
+
+ xml_attribute a(get_allocator().allocate<xml_attribute_struct>());
+ a.set_name(name);
+
+ if (attr._attr->next_attribute)
+ attr._attr->next_attribute->prev_attribute = a._attr;
+ else
+ _root->last_attribute = a._attr;
+
+ a._attr->next_attribute = attr._attr->next_attribute;
+ a._attr->prev_attribute = attr._attr;
+ attr._attr->next_attribute = a._attr;
+
+ return a;
+ }
+
+ xml_node xml_node::append_child(xml_node_type type)
+ {
+ if ((this->type() != node_element && this->type() != node_document) || type == node_document || type == node_null) return xml_node();
+
+ return xml_node(_root->append_node(get_allocator(), type));
+ }
+
+ xml_node xml_node::insert_child_before(xml_node_type type, const xml_node& node)
+ {
+ if ((this->type() != node_element && this->type() != node_document) || type == node_document || type == node_null) return xml_node();
+ if (node.parent() != *this) return xml_node();
+
+ xml_node n(get_allocator().allocate<xml_node_struct>(type));
+ n._root->parent = _root;
+
+ if (node._root->prev_sibling)
+ node._root->prev_sibling->next_sibling = n._root;
+ else
+ _root->first_child = n._root;
+
+ n._root->prev_sibling = node._root->prev_sibling;
+ n._root->next_sibling = node._root;
+ node._root->prev_sibling = n._root;
+
+ return n;
+ }
+
+ xml_node xml_node::insert_child_after(xml_node_type type, const xml_node& node)
+ {
+ if ((this->type() != node_element && this->type() != node_document) || type == node_document || type == node_null) return xml_node();
+ if (node.parent() != *this) return xml_node();
+
+ xml_node n(get_allocator().allocate<xml_node_struct>(type));
+ n._root->parent = _root;
+
+ if (node._root->next_sibling)
+ node._root->next_sibling->prev_sibling = n._root;
+ else
+ _root->last_child = n._root;
+
+ n._root->next_sibling = node._root->next_sibling;
+ n._root->prev_sibling = node._root;
+ node._root->next_sibling = n._root;
+
+ return n;
+ }
+
+ void xml_node::remove_attribute(const char* name)
+ {
+ remove_attribute(attribute(name));
+ }
+
+ void xml_node::remove_attribute(const xml_attribute& a)
+ {
+ if (empty()) return;
+
+ // check that attribute belongs to *this
+ xml_attribute_struct* attr = a._attr;
+
+ while (attr->prev_attribute) attr = attr->prev_attribute;
+
+ if (attr != _root->first_attribute) return;
+
+ if (a._attr->next_attribute) a._attr->next_attribute->prev_attribute = a._attr->prev_attribute;
+ else _root->last_attribute = a._attr->prev_attribute;
+
+ if (a._attr->prev_attribute) a._attr->prev_attribute->next_attribute = a._attr->next_attribute;
+ else _root->first_attribute = a._attr->next_attribute;
+
+ a._attr->free();
+ }
+
+ void xml_node::remove_child(const char* name)
+ {
+ remove_child(child(name));
+ }
+
+ void xml_node::remove_child(const xml_node& n)
+ {
+ if (empty() || n.parent() != *this) return;
+
+ if (n._root->next_sibling) n._root->next_sibling->prev_sibling = n._root->prev_sibling;
+ else _root->last_child = n._root->prev_sibling;
+
+ if (n._root->prev_sibling) n._root->prev_sibling->next_sibling = n._root->next_sibling;
+ else _root->first_child = n._root->next_sibling;
+
+ n._root->free();
+ }
+
+#ifndef PUGIXML_NO_STL
+ std::string xml_node::path(char delimiter) const
+ {
+ std::string path;
+
+ xml_node cursor = *this; // Make a copy.
+
+ path = cursor.name();
+
+ while (cursor.parent())
+ {
+ cursor = cursor.parent();
+
+ std::string temp = cursor.name();
+ temp += delimiter;
+ temp += path;
+ path.swap(temp);
+ }
+
+ return path;
+ }
+#endif
+
+ xml_node xml_node::first_element_by_path(const char* path, char delimiter) const
+ {
+ xml_node found = *this; // Current search context.
+
+ if (empty() || !path || !path[0]) return found;
+
+ if (path[0] == delimiter)
+ {
+ // Absolute path; e.g. '/foo/bar'
+ while (found.parent()) found = found.parent();
+ ++path;
+ }
+
+ const char* path_segment = path;
+
+ while (*path_segment == delimiter) ++path_segment;
+
+ const char* path_segment_end = path_segment;
+
+ while (*path_segment_end && *path_segment_end != delimiter) ++path_segment_end;
+
+ if (path_segment == path_segment_end) return found;
+
+ const char* next_segment = path_segment_end;
+
+ while (*next_segment == delimiter) ++next_segment;
+
+ if (*path_segment == '.' && path_segment + 1 == path_segment_end)
+ return found.first_element_by_path(next_segment, delimiter);
+ else if (*path_segment == '.' && *(path_segment+1) == '.' && path_segment + 2 == path_segment_end)
+ return found.parent().first_element_by_path(next_segment, delimiter);
+ else
+ {
+ for (xml_node_struct* j = found._root->first_child; j; j = j->next_sibling)
+ {
+ if (j->name && !strcmprange(j->name, path_segment, path_segment_end))
+ {
+ xml_node subsearch = xml_node(j).first_element_by_path(next_segment, delimiter);
+
+ if (subsearch) return subsearch;
+ }
+ }
+
+ return xml_node();
+ }
+ }
+
+ bool xml_node::traverse(xml_tree_walker& walker)
+ {
+ walker._depth = 0;
+
+ if (!walker.begin(*this)) return false;
+
+ xml_node cur = first_child();
+
+ if (cur)
+ {
+ do
+ {
+ if (!walker.for_each(cur))
+ return false;
+
+ if (cur.first_child())
+ {
+ ++walker._depth;
+ cur = cur.first_child();
+ }
+ else if (cur.next_sibling())
+ cur = cur.next_sibling();
+ else
+ {
+ // Borland C++ workaround
+ while (!cur.next_sibling() && cur != *this && (bool)cur.parent())
+ {
+ --walker._depth;
+ cur = cur.parent();
+ }
+
+ if (cur != *this)
+ cur = cur.next_sibling();
+ }
+ }
+ while (cur && cur != *this);
+ }
+
+ if (!walker.end(*this)) return false;
+
+ return true;
+ }
+
+ unsigned int xml_node::document_order() const
+ {
+ return empty() ? 0 : _root->document_order;
+ }
+
+ void xml_node::precompute_document_order_impl()
+ {
+ if (type() != node_document) return;
+
+ unsigned int current = 1;
+ xml_node cur = *this;
+
+ for (;;)
+ {
+ cur._root->document_order = current++;
+
+ for (xml_attribute a = cur.first_attribute(); a; a = a.next_attribute())
+ a._attr->document_order = current++;
+
+ if (cur.first_child())
+ cur = cur.first_child();
+ else if (cur.next_sibling())
+ cur = cur.next_sibling();
+ else
+ {
+ while (cur && !cur.next_sibling()) cur = cur.parent();
+ cur = cur.next_sibling();
+
+ if (!cur) break;
+ }
+ }
+ }
+
+#ifndef PUGIXML_NO_STL
+ void xml_node::print(std::ostream& os, const char* indent, unsigned int flags, unsigned int depth)
+ {
+ if (empty()) return;
+
+ if ((flags & format_indent) != 0 && (flags & format_raw) == 0)
+ for (unsigned int i = 0; i < depth; ++i) os << indent;
+
+ switch (type())
+ {
+ case node_document:
+ for (xml_node n = first_child(); n; n = n.next_sibling())
+ n.print(os, indent, flags, depth);
+ break;
+
+ case node_element:
+ {
+ os << '<' << name();
+
+ for (xml_attribute a = first_attribute(); a; a = a.next_attribute())
+ {
+ os << ' ' << a.name() << "=\"";
+
+ if (flags & format_utf8)
+ text_output_escaped<true, true>(os, a.value());
+ else
+ text_output_escaped<true, false>(os, a.value());
+
+ os << "\"";
+ }
+
+ if (flags & format_raw)
+ {
+ if (!_root->first_child) // 0 children
+ os << " />";
+ else
+ {
+ os << ">";
+ for (xml_node n = first_child(); n; n = n.next_sibling())
+ n.print(os, indent, flags, depth + 1);
+ os << "</" << name() << ">";
+ }
+ }
+ else if (!_root->first_child) // 0 children
+ os << " />\n";
+ else if (_root->first_child == _root->last_child && first_child().type() == node_pcdata)
+ {
+ os << ">";
+
+ if (flags & format_utf8)
+ text_output_escaped<false, true>(os, first_child().value());
+ else
+ text_output_escaped<false, false>(os, first_child().value());
+
+ os << "</" << name() << ">\n";
+ }
+ else
+ {
+ os << ">\n";
+
+ for (xml_node n = first_child(); n; n = n.next_sibling())
+ n.print(os, indent, flags, depth + 1);
+
+ if ((flags & format_indent) != 0 && (flags & format_raw) == 0)
+ for (unsigned int i = 0; i < depth; ++i) os << indent;
+
+ os << "</" << name() << ">\n";
+ }
+
+ break;
+ }
+ case node_pcdata:
+ if (flags & format_utf8)
+ text_output_escaped<false, true>(os, value());
+ else
+ text_output_escaped<false, false>(os, value());
+ break;
+
+ case node_cdata:
+ os << "<![CDATA[" << value() << "]]>";
+ if ((flags & format_raw) == 0) os << "\n";
+ break;
+
+ case node_comment:
+ os << "<!--" << value() << "-->";
+ if ((flags & format_raw) == 0) os << "\n";
+ break;
+
+ case node_pi:
+ os << "<?" << name();
+ if (value()[0]) os << ' ' << value();
+ os << "?>";
+ if ((flags & format_raw) == 0) os << "\n";
+ break;
+
+ default:
+ ;
+ }
+ }
+#endif
+
+#ifdef __BORLANDC__
+ bool operator&&(const xml_node& lhs, bool rhs)
+ {
+ return lhs ? rhs : false;
+ }
+
+ bool operator||(const xml_node& lhs, bool rhs)
+ {
+ return lhs ? true : rhs;
+ }
+#endif
+
+ xml_node_iterator::xml_node_iterator()
+ {
+ }
+
+ xml_node_iterator::xml_node_iterator(const xml_node& node): _wrap(node)
+ {
+ }
+
+ xml_node_iterator::xml_node_iterator(xml_node_struct* ref): _wrap(ref)
+ {
+ }
+
+ xml_node_iterator::xml_node_iterator(xml_node_struct* ref, xml_node_struct* prev): _prev(prev), _wrap(ref)
+ {
+ }
+
+ bool xml_node_iterator::operator==(const xml_node_iterator& rhs) const
+ {
+ return (_wrap == rhs._wrap);
+ }
+
+ bool xml_node_iterator::operator!=(const xml_node_iterator& rhs) const
+ {
+ return (_wrap != rhs._wrap);
+ }
+
+ xml_node& xml_node_iterator::operator*()
+ {
+ return _wrap;
+ }
+
+ xml_node* xml_node_iterator::operator->()
+ {
+ return &_wrap;
+ }
+
+ const xml_node_iterator& xml_node_iterator::operator++()
+ {
+ _prev = _wrap;
+ _wrap = xml_node(_wrap._root->next_sibling);
+ return *this;
+ }
+
+ xml_node_iterator xml_node_iterator::operator++(int)
+ {
+ xml_node_iterator temp = *this;
+ ++*this;
+ return temp;
+ }
+
+ const xml_node_iterator& xml_node_iterator::operator--()
+ {
+ if (_wrap._root) _wrap = xml_node(_wrap._root->prev_sibling);
+ else _wrap = _prev;
+ return *this;
+ }
+
+ xml_node_iterator xml_node_iterator::operator--(int)
+ {
+ xml_node_iterator temp = *this;
+ --*this;
+ return temp;
+ }
+
+ xml_attribute_iterator::xml_attribute_iterator()
+ {
+ }
+
+ xml_attribute_iterator::xml_attribute_iterator(const xml_attribute& attr): _wrap(attr)
+ {
+ }
+
+ xml_attribute_iterator::xml_attribute_iterator(xml_attribute_struct* ref): _wrap(ref)
+ {
+ }
+
+ xml_attribute_iterator::xml_attribute_iterator(xml_attribute_struct* ref, xml_attribute_struct* prev): _prev(prev), _wrap(ref)
+ {
+ }
+
+ bool xml_attribute_iterator::operator==(const xml_attribute_iterator& rhs) const
+ {
+ return (_wrap == rhs._wrap);
+ }
+
+ bool xml_attribute_iterator::operator!=(const xml_attribute_iterator& rhs) const
+ {
+ return (_wrap != rhs._wrap);
+ }
+
+ xml_attribute& xml_attribute_iterator::operator*()
+ {
+ return _wrap;
+ }
+
+ xml_attribute* xml_attribute_iterator::operator->()
+ {
+ return &_wrap;
+ }
+
+ const xml_attribute_iterator& xml_attribute_iterator::operator++()
+ {
+ _prev = _wrap;
+ _wrap = xml_attribute(_wrap._attr->next_attribute);
+ return *this;
+ }
+
+ xml_attribute_iterator xml_attribute_iterator::operator++(int)
+ {
+ xml_attribute_iterator temp = *this;
+ ++*this;
+ return temp;
+ }
+
+ const xml_attribute_iterator& xml_attribute_iterator::operator--()
+ {
+ if (_wrap._attr) _wrap = xml_attribute(_wrap._attr->prev_attribute);
+ else _wrap = _prev;
+ return *this;
+ }
+
+ xml_attribute_iterator xml_attribute_iterator::operator--(int)
+ {
+ xml_attribute_iterator temp = *this;
+ --*this;
+ return temp;
+ }
+
+ xml_memory_block::xml_memory_block(): next(0), size(0)
+ {
+ }
+
+ xml_document::xml_document(): _buffer(0)
+ {
+ create();
+ }
+
+ xml_document::~xml_document()
+ {
+ free();
+ }
+
+ void xml_document::create()
+ {
+ xml_allocator alloc(&_memory);
+
+ _root = alloc.allocate<xml_document_struct>(); // Allocate a new root.
+ xml_allocator& a = static_cast<xml_document_struct*>(_root)->allocator;
+ a = alloc;
+ }
+
+ void xml_document::free()
+ {
+ delete[] _buffer;
+ _buffer = 0;
+
+ if (_root) _root->free();
+
+ xml_memory_block* current = _memory.next;
+
+ while (current)
+ {
+ xml_memory_block* next = current->next;
+ delete current;
+ current = next;
+ }
+
+ _memory.next = 0;
+ _memory.size = 0;
+
+ create();
+ }
+
+#ifndef PUGIXML_NO_STL
+ bool xml_document::load(std::istream& stream, unsigned int options)
+ {
+ if (!stream.good()) return false;
+
+ std::streamoff length, pos = stream.tellg();
+ stream.seekg(0, std::ios_base::end);
+ length = stream.tellg();
+ stream.seekg(pos, std::ios_base::beg);
+
+ if (!stream.good()) return false;
+
+ char* s;
+
+ try
+ {
+ s = new char[length + 1];
+ }
+ catch (const std::bad_alloc&)
+ {
+ return false;
+ }
+
+ stream.read(s, length);
+ s[length] = 0;
+
+ if (!stream.good())
+ {
+ delete[] s;
+ return false;
+ }
+
+ return parse(transfer_ownership_tag(), s, options); // Parse the input string.
+ }
+#endif
+
+ bool xml_document::load(const char* contents, unsigned int options)
+ {
+ char* s;
+
+ try
+ {
+ s = new char[strlen(contents) + 1];
+ }
+ catch (const std::bad_alloc&)
+ {
+ return false;
+ }
+
+ strcpy(s, contents);
+
+ return parse(transfer_ownership_tag(), s, options); // Parse the input string.
+ }
+
+ bool xml_document::load_file(const char* name, unsigned int options)
+ {
+ FILE* file = fopen(name, "rb");
+ if (!file) return false;
+
+ fseek(file, 0, SEEK_END);
+ long length = ftell(file);
+ fseek(file, 0, SEEK_SET);
+
+ if (length < 0)
+ {
+ fclose(file);
+ return false;
+ }
+
+ char* s;
+
+ try
+ {
+ s = new char[length + 1];
+ }
+ catch (const std::bad_alloc&)
+ {
+ fclose(file);
+ return false;
+ }
+
+ size_t read = fread(s, (size_t)length, 1, file);
+ fclose(file);
+
+ if (read != 1)
+ {
+ delete[] s;
+ return false;
+ }
+
+ s[length] = 0;
+
+ return parse(transfer_ownership_tag(), s, options); // Parse the input string.
+ }
+
+ bool xml_document::parse(char* xmlstr, unsigned int options)
+ {
+ free();
+
+ xml_allocator& alloc = static_cast<xml_document_struct*>(_root)->allocator;
+
+ xml_parser parser(alloc);
+
+ return parser.parse(xmlstr, _root, options); // Parse the input string.
+ }
+
+ bool xml_document::parse(const transfer_ownership_tag&, char* xmlstr, unsigned int options)
+ {
+ bool res = parse(xmlstr, options);
+
+ if (res) _buffer = xmlstr;
+
+ return res;
+ }
+
+#ifndef PUGIXML_NO_STL
+ bool xml_document::save_file(const char* name, const char* indent, unsigned int flags)
+ {
+ std::ofstream out(name, std::ios::out);
+ if (!out) return false;
+
+ if (flags & format_write_bom)
+ {
+ if (flags & format_utf8)
+ {
+ static const unsigned char utf8_bom[] = {0xEF, 0xBB, 0xBF};
+ out.write(reinterpret_cast<const char*>(utf8_bom), 3);
+ }
+ }
+
+ out << "<?xml version=\"1.0\"?>";
+ if (!(flags & format_raw)) out << "\n";
+ print(out, indent, flags);
+
+ return true;
+ }
+#endif
+
+ void xml_document::precompute_document_order()
+ {
+ precompute_document_order_impl();
+ }
+
+#ifndef PUGIXML_NO_STL
+ std::string as_utf8(const wchar_t* str)
+ {
+ std::string result;
+ result.reserve(strutf16_utf8_size(str));
+
+ for (; *str; ++str)
+ {
+ char buffer[6];
+
+ result.append(buffer, strutf16_utf8(buffer, *str));
+ }
+
+ return result;
+ }
+
+ std::wstring as_utf16(const char* str)
+ {
+ std::wstring result;
+ result.reserve(strutf8_utf16_size(str));
+
+ for (; *str;)
+ {
+ unsigned int ch;
+ str = strutf8_utf16(str, ch);
+ result += (wchar_t)ch;
+ }
+
+ return result;
+ }
+#endif
+}
diff --git a/src/pugixml.hpp b/src/pugixml.hpp
index de7939e..323994d 100644
--- a/src/pugixml.hpp
+++ b/src/pugixml.hpp
@@ -1,664 +1,1735 @@
-///////////////////////////////////////////////////////////////////////////////
-//
-// Pug Improved XML Parser - Version 0.2
-// --------------------------------------------------------
-// Copyright (C) 2006-2007, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)
-// This work is based on the pugxml parser, which is:
-// Copyright (C) 2003, by Kristen Wegner (kristen@tima.net)
-// Released into the Public Domain. Use at your own risk.
-// See pugxml.xml for further information, history, etc.
-// Contributions by Neville Franks (readonly@getsoft.com).
-//
-///////////////////////////////////////////////////////////////////////////////
-
-#ifndef HEADER_PUGIXML_HPP
-#define HEADER_PUGIXML_HPP
-
-// Uncomment this to disable STL
-// #define PUGIXML_NO_STL
-
-#ifndef PUGIXML_NO_STL
-# include <string>
-# include <istream>
-#endif
-
-#include <cstddef>
-#include <cstring>
-
-/// The PugiXML Parser namespace.
-namespace pugi
-{
- /// Tree node classification.
- /// See 'xml_node_struct::type'
- enum xml_node_type
- {
- node_null, ///< An undifferentiated entity.
- node_document, ///< A document tree's absolute root.
- node_element, ///< E.g. '<...>'
- node_pcdata, ///< E.g. '>...<'
- node_cdata, ///< E.g. '<![CDATA[...]]>'
- node_comment, ///< E.g. '<!--...-->'
- node_pi ///< E.g. '<?...?>'
- };
-
- /// Parser Options
- const size_t memory_block_size = 32768; ///< Memory block size, 32 kb
-
- const unsigned int parse_minimal = 0x00000000; ///< Unset the following flags.
- const unsigned int parse_pi = 0x00000001; ///< Parse '<?...?>'
- const unsigned int parse_comments = 0x00000002; ///< Parse '<!--...-->'
- const unsigned int parse_cdata = 0x00000004; ///< Parse '<![CDATA[...]]>'
- const unsigned int parse_ws_pcdata = 0x00000008; ///< Do not skip PCDATA that consists only of whitespaces
- const unsigned int parse_ext_pcdata = 0x00000010; ///< Do not skip PCDATA that is outside all tags (i.e. root)
- const unsigned int parse_escapes = 0x00000020; ///< Parse &lt;, &gt;, &amp;, &quot;, &apos;, &#.. sequences
- const unsigned int parse_wnorm_attribute = 0x00000080; ///< Normalize spaces in attributes (convert space-like characters to spaces + merge adjacent spaces + trim leading/trailing spaces)
- const unsigned int parse_wconv_attribute = 0x00000100; ///< Convert space-like characters to spaces in attributes (only if wnorm is not set)
- const unsigned int parse_eol = 0x00000200; ///< Perform EOL handling
- const unsigned int parse_check_end_tags = 0x00000400; ///< Check start and end tag names and return error if names mismatch
- const unsigned int parse_match_end_tags = 0x00000800; ///< Try to find corresponding start tag for an end tag
- ///< Set all flags, except parse_ws_pcdata, parse_trim_attribute, parse_pi and parse_comments
- const unsigned int parse_default = parse_cdata | parse_ext_pcdata | parse_escapes | parse_wconv_attribute | parse_eol | parse_check_end_tags;
- const unsigned int parse_noset = 0x80000000; ///< Parse with flags in xml_parser
-
- const unsigned int parse_w3c = parse_pi | parse_comments | parse_cdata |
- parse_escapes | parse_wconv_attribute |
- parse_check_end_tags | parse_ws_pcdata | parse_eol;
-
- /// Forward declarations
- struct xml_attribute_struct;
- struct xml_node_struct;
-
- class xml_node_iterator;
- class xml_attribute_iterator;
-
- class xml_tree_walker;
-
- /// Provides a light-weight wrapper for manipulating xml_attribute_struct structures.
- /// Note: xml_attribute does not create any memory for the attribute it wraps;
- /// it only wraps a pointer to an existing xml_attribute_struct.
- class xml_attribute
- {
- friend class xml_attribute_iterator;
- friend class xml_node;
-
- private:
- const xml_attribute_struct* _attr; ///< The internal attribute pointer.
-
- /// Safe bool type
- typedef const xml_attribute_struct* xml_attribute::*unspecified_bool_type;
-
- /// Initializing ctor
- explicit xml_attribute(const xml_attribute_struct* attr);
-
- public:
- /// Default ctor
- xml_attribute();
-
- public:
- /// Comparison operators
- bool operator==(const xml_attribute& r) const;
- bool operator!=(const xml_attribute& r) const;
- bool operator<(const xml_attribute& r) const;
- bool operator>(const xml_attribute& r) const;
- bool operator<=(const xml_attribute& r) const;
- bool operator>=(const xml_attribute& r) const;
-
- /// Safe bool conversion
- operator unspecified_bool_type() const;
-
- /// Get next attribute if any, else xml_attribute()
- xml_attribute next_attribute() const;
-
- /// Get previous attribute if any, else xml_attribute()
- xml_attribute previous_attribute() const;
-
- /// Cast attribute value as int. If not found, return 0.
- /// \return Attribute value as int, or 0.
- int as_int() const;
-
- /// Cast attribute value as double. If not found, return 0.0.
- /// \return Attribute value as double, or 0.0.
- double as_double() const;
-
- /// Cast attribute value as float. If not found, return 0.0.
- /// \return Attribute value as float, or 0.0.
- float as_float() const;
-
- /// Cast attribute value as bool. If not found, return false.
- /// \return Attribute value as bool, or false.
- bool as_bool() const;
-
- public:
- /// True if internal pointer is valid
- bool empty() const;
-
- public:
- /// Access the attribute name.
- const char* name() const;
-
- /// Access the attribute value.
- const char* value() const;
- };
-
- /// Provides a light-weight wrapper for manipulating xml_node_struct structures.
- class xml_node
- {
- friend class xml_node_iterator;
- friend class xml_parser;
-
- private:
- const xml_node_struct* _root; ///< Pointer to node root.
-
- /// Safe bool type
- typedef const xml_node_struct* xml_node::*unspecified_bool_type;
-
- private:
- /// Node is tree root.
- bool type_document() const;
-
- public:
- /// Default constructor.
- /// Node root points to a dummy 'xml_node_struct' structure. Test for this
- /// with 'empty'.
- xml_node();
-
- /// Construct, wrapping the given 'xml_node_struct' pointer.
- explicit xml_node(const xml_node_struct* p);
-
- public:
- /// Base iterator type (for child nodes). Same as 'child_iterator'.
- typedef xml_node_iterator iterator;
-
- /// Attribute iterator type.
- typedef xml_attribute_iterator attribute_iterator;
-
- /// Access the begin iterator for this node's collection of child nodes.
- /// Same as 'children_begin'.
- iterator begin() const;
-
- /// Access the end iterator for this node's collection of child nodes.
- /// Same as 'children_end'.
- iterator end() const;
-
- /// Access the begin iterator for this node's collection of child nodes.
- /// Same as 'begin'.
- iterator children_begin() const;
-
- /// Access the end iterator for this node's collection of child nodes.
- /// Same as 'end'.
- iterator children_end() const;
-
- /// Access the begin iterator for this node's collection of attributes.
- attribute_iterator attributes_begin() const;
-
- /// Access the end iterator for this node's collection of attributes.
- attribute_iterator attributes_end() const;
-
- /// Access the begin iterator for this node's collection of siblings.
- iterator siblings_begin() const;
-
- /// Access the end iterator for this node's collection of siblings.
- iterator siblings_end() const;
-
- public:
- /// Safe bool conversion
- operator unspecified_bool_type() const;
-
- /// Comparison operators
- bool operator==(const xml_node& r) const;
- bool operator!=(const xml_node& r) const;
- bool operator<(const xml_node& r) const;
- bool operator>(const xml_node& r) const;
- bool operator<=(const xml_node& r) const;
- bool operator>=(const xml_node& r) const;
-
- public:
- /// Node pointer is null, or type is node_null. Same as type_null.
- bool empty() const;
-
- public:
- /// Access node entity type.
- xml_node_type type() const;
-
- /// Access pointer to node name if any, else empty string.
- const char* name() const;
-
- /// Access pointer to data if any, else empty string.
- const char* value() const;
-
- /// Access child node at name as xml_node or xml_node(NULL) if bad name.
- xml_node child(const char* name) const;
-
- /// Access child node at name as xml_node or xml_node(NULL) if bad name.
- /// Enable wildcard matching.
- xml_node child_w(const char* name) const;
-
- /// Access the attribute having 'name'.
- xml_attribute attribute(const char* name) const;
-
- /// Access the attribute having 'name'.
- /// Enable wildcard matching.
- xml_attribute attribute_w(const char* name) const;
-
- /// Access sibling node at name as xml_node or xml_node(NULL) if bad name.
- xml_node sibling(const char* name) const;
-
- /// Access sibling node at name as xml_node or xml_node(NULL) if bad name.
- /// Enable wildcard matching.
- xml_node sibling_w(const char* name) const;
-
- /// Access current node's next sibling by position and name.
- xml_node next_sibling(const char* name) const;
-
- /// Access current node's next sibling by position and name.
- /// Enable wildcard matching.
- xml_node next_sibling_w(const char* name) const;
-
- /// Access current node's next sibling by position.
- xml_node next_sibling() const;
-
- /// Access current node's previous sibling by position and name.
- xml_node previous_sibling(const char* name) const;
-
- /// Access current node's previous sibling by position and name.
- /// Enable wildcard matching.
- xml_node previous_sibling_w(const char* name) const;
-
- /// Access current node's previous sibling by position.
- xml_node previous_sibling() const;
-
- /// Access node's parent if any, else xml_node(NULL)
- xml_node parent() const;
-
- /// Return PCDATA/CDATA that is child of current node. If none, return empty string.
- const char* child_value() const;
-
- /// Return PCDATA/CDATA that is child of specified child node. If none, return empty string.
- const char* child_value(const char* name) const;
-
- /// Return PCDATA/CDATA that is child of specified child node. If none, return empty string.
- /// Enable wildcard matching.
- const char* child_value_w(const char* name) const;
-
- public:
- /// Access node's first attribute if any, else xml_attribute()
- xml_attribute first_attribute() const;
-
- /// Access node's last attribute if any, else xml_attribute()
- xml_attribute last_attribute() const;
-
- /// Find all elements having the given name.
- template <typename OutputIterator> void all_elements_by_name(const char* name, OutputIterator it) const;
-
- /// Find all elements having the given name.
- /// Enable wildcard matching.
- template <typename OutputIterator> void all_elements_by_name_w(const char* name, OutputIterator it) const;
-
- /// Access node's first child if any, else xml_node()
- xml_node first_child() const;
-
- /// Access node's last child if any, else xml_node()
- xml_node last_child() const;
-
- /// Find attribute using the predicate
- /// Predicate should take xml_attribute and return bool.
- template <typename Predicate> xml_attribute find_attribute(Predicate pred) const;
-
- /// Find child using the predicate
- /// Predicate should take xml_node and return bool.
- template <typename Predicate> xml_node find_child(Predicate pred) const;
-
- /// Recursively-implemented depth-first find element using the predicate
- /// Predicate should take xml_node and return bool.
- template <typename Predicate> xml_node find_element(Predicate pred) const;
-
- /// Recursively-implemented depth-first find the first matching element.
- /// Use for shallow drill-downs.
- xml_node first_element(const char* name) const;
-
- /// Recursively-implemented depth-first find the first matching element.
- /// Use for shallow drill-downs.
- /// Enable wildcard matching.
- xml_node first_element_w(const char* name) const;
-
- /// Recursively-implemented depth-first find the first matching element
- /// also having matching PCDATA.
- xml_node first_element_by_value(const char* name, const char* value) const;
-
- /// Recursively-implemented depth-first find the first matching element
- /// also having matching PCDATA.
- /// Enable wildcard matching.
- xml_node first_element_by_value_w(const char* name, const char* value) const;
-
- /// Recursively-implemented depth-first find the first matching element
- /// also having matching attribute.
- xml_node first_element_by_attribute(const char* name, const char* attr_name, const char* attr_value) const;
-
- /// Recursively-implemented depth-first find the first matching element
- /// also having matching attribute.
- /// Enable wildcard matching.
- xml_node first_element_by_attribute_w(const char* name, const char* attr_name, const char* attr_value) const;
-
- /// Recursively-implemented depth-first find the first element
- /// having matching attribute.
- xml_node first_element_by_attribute(const char* attr_name, const char* attr_value) const;
-
- /// Recursively-implemented depth-first find the first element
- /// having matching attribute.
- /// Enable wildcard matching.
- xml_node first_element_by_attribute_w(const char* attr_name, const char* attr_value) const;
-
- /// Recursively-implemented depth-first find the first matching entity.
- /// Use for shallow drill-downs.
- xml_node first_node(xml_node_type type) const;
-
-#ifndef PUGIXML_NO_STL
- /// Compile the absolute node path from root as a text string.
- /// \param delimiter - Delimiter character to insert between element names.
- /// \return path string (e.g. with '/' as delimiter, '/document/.../this'.
- std::string path(char delimiter = '/') const;
-#endif
-
- /// Search for a node by path.
- /// \param path - Path string; e.g. './foo/bar' (relative to node), '/foo/bar' (relative
- /// to root), '../foo/bar' (pop relative position).
- /// \param delimiter - Delimiter character to use in tokenizing path.
- /// \return Matching node, or xml_node() if not found.
- xml_node first_element_by_path(const char* path, char delimiter = '/') const;
-
- /// Recursively traverse the tree.
- bool traverse(xml_tree_walker& walker) const;
- };
-
- /// Child node iterator.
- class xml_node_iterator
-#ifndef PUGIXML_NO_STL
- : public std::iterator<std::bidirectional_iterator_tag, const xml_node>
-#endif
- {
- friend class xml_node;
-
- private:
- xml_node _prev;
- xml_node _wrap;
-
- /// Initializing ctor
- explicit xml_node_iterator(const xml_node_struct* ref);
- public:
- /// Default ctor
- xml_node_iterator();
-
- /// Initializing ctor
- xml_node_iterator(const xml_node& node);
-
- /// Initializing ctor (for past-the-end)
- xml_node_iterator(const xml_node_struct* ref, const xml_node_struct* prev);
-
- bool operator==(const xml_node_iterator& rhs) const;
- bool operator!=(const xml_node_iterator& rhs) const;
-
- const xml_node& operator*() const;
- const xml_node* operator->() const;
-
- const xml_node_iterator& operator++();
- xml_node_iterator operator++(int);
-
- const xml_node_iterator& operator--();
- xml_node_iterator operator--(int);
- };
-
- /// Attribute iterator.
- class xml_attribute_iterator
-#ifndef PUGIXML_NO_STL
- : public std::iterator<std::bidirectional_iterator_tag, const xml_attribute>
-#endif
- {
- friend class xml_node;
-
- private:
- xml_attribute _prev;
- xml_attribute _wrap;
-
- /// Initializing ctor
- explicit xml_attribute_iterator(const xml_attribute_struct* ref);
- public:
- /// Default ctor
- xml_attribute_iterator();
-
- /// Initializing ctor
- xml_attribute_iterator(const xml_attribute& attr);
-
- /// Initializing ctor (for past-the-end)
- xml_attribute_iterator(const xml_attribute_struct* ref, const xml_attribute_struct* prev);
-
- bool operator==(const xml_attribute_iterator& rhs) const;
- bool operator!=(const xml_attribute_iterator& rhs) const;
-
- const xml_attribute& operator*() const;
- const xml_attribute* operator->() const;
-
- const xml_attribute_iterator& operator++();
- xml_attribute_iterator operator++(int);
-
- const xml_attribute_iterator& operator--();
- xml_attribute_iterator operator--(int);
- };
-
- /// Abstract tree walker class for xml_node::traverse().
- class xml_tree_walker
- {
- private:
- int _deep; ///< Current node depth.
- public:
- /// Default ctor
- xml_tree_walker();
-
- /// Virtual dtor
- virtual ~xml_tree_walker();
-
- public:
- /// Increment node depth.
- virtual void push();
-
- /// Decrement node depth
- virtual void pop();
-
- /// Access node depth
- virtual int depth() const;
-
- public:
- /// Callback when traverse on a node begins.
- /// \return returning false will abort the traversal.
- virtual bool begin(const xml_node&);
-
- /// Callback when traverse on a node ends.
- /// \return Returning false will abort the traversal.
- virtual bool end(const xml_node&);
- };
-
- /// Memory block (internal)
- struct xml_memory_block
- {
- xml_memory_block();
-
- xml_memory_block* next;
- size_t size;
-
- char data[memory_block_size];
- };
-
- struct transfer_ownership_tag {};
-
- /// Provides a high-level interface to the XML parser.
- class xml_parser
- {
- private:
- char* _buffer; ///< character buffer
-
- xml_memory_block _memory; ///< Memory block
-
- xml_node_struct* _xmldoc; ///< Pointer to current XML document tree root.
- unsigned int _optmsk; ///< Parser options.
-
- xml_parser(const xml_parser&);
- const xml_parser& operator=(const xml_parser&);
-
- void free(); ///< free memory
-
- public:
- /// Constructor.
- /// \param optmsk - Options mask.
- xml_parser(unsigned int optmsk = parse_default);
-
- /// Parse constructor.
- /// \param xmlstr - readwrite string with xml data
- /// \param optmsk - Options mask.
- /// \see parse
- xml_parser(char* xmlstr, unsigned int optmsk = parse_default);
-
- /// Parse constructor that gains ownership.
- /// \param xmlstr - readwrite string with xml data
- /// \param optmsk - Options mask.
- /// \see parse
- xml_parser(const transfer_ownership_tag&, char* xmlstr, unsigned int optmsk = parse_default);
-
-#ifndef PUGIXML_NO_STL
- /// Parse constructor.
- /// \param stream - stream with xml data
- /// \param optmsk - Options mask.
- /// \see parse
- xml_parser(std::istream& stream, unsigned int optmsk = parse_default);
-#endif
-
- /// Dtor
- ~xml_parser();
-
- public:
- /// Cast as xml_node (same as document).
- operator xml_node() const;
-
- /// Returns the root wrapped by an xml_node.
- xml_node document() const;
-
- public:
- /// Get parser options mask.
- unsigned int options() const;
-
- /// Set parser options mask.
- unsigned int options(unsigned int optmsk);
-
- public:
-#ifndef PUGIXML_NO_STL
- /// Parse the given XML stream
- /// \param stream - stream with xml data
- /// \param optmsk - Options mask.
- void parse(std::istream& stream, unsigned int optmsk = parse_noset);
-#endif
-
- /// Parse the given XML string in-situ.
- /// \param xmlstr - readwrite string with xml data
- /// \param optmsk - Options mask.
- /// \return last position or NULL
- /// \rem input string is zero-segmented
- char* parse(char* xmlstr, unsigned int optmsk = parse_noset);
-
- /// Parse the given XML string in-situ (gains ownership).
- /// \param xmlstr - readwrite string with xml data
- /// \param optmsk - Options mask.
- /// \return last position or NULL
- /// \rem input string is zero-segmented
- char* parse(const transfer_ownership_tag&, char* xmlstr, unsigned int optmsk = parse_noset);
- };
-
- /// Utility functions for xml
-
-#ifndef PUGIXML_NO_STL
- /// Convert utf16 to utf8
- std::string utf8(const wchar_t* str);
-
- /// Convert utf8 to utf16
- std::wstring utf16(const char* str);
-#endif
-}
-
-/// Inline implementation
-
-namespace pugi
-{
- namespace impl
- {
- int strcmpwild(const char*, const char*);
- }
-
- template <typename OutputIterator> void xml_node::all_elements_by_name(const char* name, OutputIterator it) const
- {
- if (empty()) return;
-
- for (xml_node node = first_child(); node; node = node.next_sibling())
- {
- if (!strcmp(name, node.name()))
- {
- *it = node;
- ++it;
- }
-
- if (node.first_child()) node.all_elements_by_name(name, it);
- }
- }
-
- template <typename OutputIterator> void xml_node::all_elements_by_name_w(const char* name, OutputIterator it) const
- {
- if (empty()) return;
-
- for (xml_node node = first_child(); node; node = node.next_sibling())
- {
- if (!impl::strcmpwild(name, node.name()))
- {
- *it = node;
- ++it;
- }
-
- if (node.first_child()) node.all_elements_by_name_w(name, it);
- }
- }
-
- template <typename Predicate> inline xml_attribute xml_node::find_attribute(Predicate pred) const
- {
- if (!empty())
- for (xml_attribute attrib = first_attribute(); attrib; attrib = attrib.next_attribute())
- if (pred(attrib))
- return attrib;
-
- return xml_attribute();
- }
-
- template <typename Predicate> inline xml_node xml_node::find_child(Predicate pred) const
- {
- if (!empty())
- for (xml_node node = first_child(); node; node = node.next_sibling())
- if (pred(node))
- return node;
-
- return xml_node();
- }
-
- template <typename Predicate> inline xml_node xml_node::find_element(Predicate pred) const
- {
- if (!empty())
- for (xml_node node = first_child(); node; node = node.next_sibling())
- {
- if (pred(node))
- return node;
-
- if (node.first_child())
- {
- xml_node found = node.find_element(pred);
- if (found) return found;
- }
- }
-
- return xml_node();
- }
-}
-
-#endif
+///////////////////////////////////////////////////////////////////////////////
+//
+// Pug Improved XML Parser - Version 0.3
+// --------------------------------------------------------
+// Copyright (C) 2006-2007, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)
+// This work is based on the pugxml parser, which is:
+// Copyright (C) 2003, by Kristen Wegner (kristen@tima.net)
+// Released into the Public Domain. Use at your own risk.
+// See pugxml.xml for further information, history, etc.
+// Contributions by Neville Franks (readonly@getsoft.com).
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef HEADER_PUGIXML_HPP
+#define HEADER_PUGIXML_HPP
+
+#include "pugiconfig.hpp"
+
+#ifndef PUGIXML_NO_STL
+# include <string>
+# include <istream>
+# include <exception>
+#endif
+
+// No XPath without STL
+#ifdef PUGIXML_NO_STL
+# ifndef PUGIXML_NO_XPATH
+# define PUGIXML_NO_XPATH
+# endif
+#endif
+
+#include <cstddef>
+#include <cstring>
+
+/// The PugiXML Parser namespace.
+namespace pugi
+{
+ /// Tree node classification.
+ enum xml_node_type
+ {
+ node_null, ///< Undifferentiated entity
+ node_document, ///< A document tree's absolute root.
+ node_element, ///< E.g. '<...>'
+ node_pcdata, ///< E.g. '>...<'
+ node_cdata, ///< E.g. '<![CDATA[...]]>'
+ node_comment, ///< E.g. '<!--...-->'
+ node_pi ///< E.g. '<?...?>'
+ };
+
+ // Parsing options
+
+ /**
+ * Memory block size, used for fast allocator. Memory for DOM tree is allocated in blocks of
+ * memory_block_size + 4.
+ * This value affects size of xml_memory class.
+ */
+ const size_t memory_block_size = 32768;
+
+ /**
+ * Minimal parsing mode. Equivalent to turning all other flags off. This set of flags means
+ * that pugixml does not add pi/cdata sections or comments to DOM tree and does not perform
+ * any conversions for input data, meaning fastest parsing.
+ */
+ const unsigned int parse_minimal = 0x0000;
+
+ /**
+ * This flag determines if processing instructions (nodes with type node_pi; such nodes have the
+ * form of <? target content ?> or <? target ?> in XML) are to be put in DOM tree. If this flag is off,
+ * they are not put in the tree, but are still parsed and checked for correctness.
+ *
+ * The corresponding node in DOM tree will have type node_pi, name "target" and value "content",
+ * if any.
+ *
+ * Note that <?xml ...?> (document declaration) is not considered to be a PI.
+ *
+ * This flag is off by default.
+ */
+ const unsigned int parse_pi = 0x0001;
+
+ /**
+ * This flag determines if comments (nodes with type node_comment; such nodes have the form of
+ * <!-- content --> in XML) are to be put in DOM tree. If this flag is off, they are not put in
+ * the tree, but are still parsed and checked for correctness.
+ *
+ * The corresponding node in DOM tree will have type node_comment, empty name and value "content".
+ *
+ * This flag is off by default.
+ */
+ const unsigned int parse_comments = 0x0002;
+
+ /**
+ * This flag determines if CDATA sections (nodes with type node_cdata; such nodes have the form
+ * of <![CDATA[[content]]> in XML) are to be put in DOM tree. If this flag is off, they are not
+ * put in the tree, but are still parsed and checked for correctness.
+ *
+ * The corresponding node in DOM tree will have type node_cdata, empty name and value "content".
+ *
+ * This flag is on by default.
+ */
+ const unsigned int parse_cdata = 0x0004;
+
+ /**
+ * This flag determines if nodes with PCDATA (regular text) that consist only of whitespace
+ * characters are to be put in DOM tree. Often whitespace-only data is not significant for the
+ * application, and the cost of allocating and storing such nodes (both memory and speed-wise)
+ * can be significant. For example, after parsing XML string "<node> <a/> </node>", <node> element
+ * will have 3 children when parse_ws_pcdata is set (child with type node_pcdata and value=" ",
+ * child with type node_element and name "a", and another child with type node_pcdata and
+ * value=" "), and only 1 child when parse_ws_pcdata is not set.
+ *
+ * This flag is off by default.
+ */
+ const unsigned int parse_ws_pcdata = 0x0008;
+
+ /**
+ * This flag determines if character and entity references are to be expanded during the parsing
+ * process. Character references are &amp;#...; or &amp;#x...; (... is Unicode numeric representation of
+ * character in either decimal (&amp;#...;) or hexadecimal (&amp;#x...;) form), entity references are &amp;...;
+ * Note that as pugixml does not handle DTD, the only allowed entities are predefined ones -
+ * &amp;lt;, &amp;gt;, &amp;amp;, &amp;apos; and &amp;quot;. If character/entity reference can not be expanded, it is
+ * leaved as is, so you can do additional processing later.
+ * Reference expansion is performed in attribute values and PCDATA content.
+ *
+ * This flag is on by default.
+ */
+ const unsigned int parse_escapes = 0x0010;
+
+ /**
+ * This flag determines if EOL handling (that is, replacing sequences 0x0d 0x0a by a single 0x0a
+ * character, and replacing all standalone 0x0d characters by 0x0a) is to be performed on input
+ * data (that is, comments contents, PCDATA/CDATA contents and attribute values).
+ *
+ * This flag is on by default.
+ */
+ const unsigned int parse_eol = 0x0020;
+
+ /**
+ * This flag determines if attribute value normalization should be performed for all attributes,
+ * assuming that their type is not CDATA. This means, that:
+ * 1. Whitespace characters (new line, tab and space) are replaced with space (' ')
+ * 2. Afterwards sequences of spaces are replaced with a single space
+ * 3. Leading/trailing whitespace characters are trimmed
+ *
+ * This flag is off by default.
+ */
+ const unsigned int parse_wnorm_attribute = 0x0040;
+
+ /**
+ * This flag determines if attribute value normalization should be performed for all attributes,
+ * assuming that their type is CDATA. This means, that whitespace characters (new line, tab and
+ * space) are replaced with space (' '). Note, that the actions performed while this flag is on
+ * are also performed if parse_wnorm_attribute is on, so this flag has no effect if
+ * parse_wnorm_attribute flag is set.
+ *
+ * This flag is on by default.
+ */
+ const unsigned int parse_wconv_attribute = 0x0080;
+
+ /**
+ * This is the default set of flags. It includes parsing CDATA sections (comments/PIs are not
+ * parsed), performing character and entity reference expansion, replacing whitespace characters
+ * with spaces in attribute values and performing EOL handling. Note, that PCDATA sections
+ * consisting only of whitespace characters are not parsed (by default) for performance reasons.
+ */
+ const unsigned int parse_default = parse_cdata | parse_escapes | parse_wconv_attribute | parse_eol;
+
+ // Formatting flags
+
+ /**
+ * Indent the nodes that are written to output stream with as many indentation strings as deep
+ * the node is in DOM tree.
+ *
+ * This flag is on by default.
+ */
+ const unsigned int format_indent = 0x01;
+
+ /**
+ * This flag determines how the non-printable symbols are written to output stream - they are
+ * either considered UTF-8 and are written as UTF-8 character, escaped with &#...;, or they are
+ * considered to be ASCII and each ASCII character is escaped separately.
+ *
+ * This flag is on by default.
+ */
+ const unsigned int format_utf8 = 0x02;
+
+ /**
+ * This flag determines if UTF-8 BOM is to be written to output stream.
+ *
+ * This flag is off by default.
+ */
+ const unsigned int format_write_bom = 0x04;
+
+ /**
+ * If this flag is on, no indentation is performed and no line breaks are written to output file.
+ * This means that the data is written to output stream as is.
+ *
+ * This flag is off by default.
+ */
+ const unsigned int format_raw = 0x08;
+
+ /**
+ * This is the default set of formatting flags. It includes indenting nodes depending on their
+ * depth in DOM tree and considering input data to be UTF-8.
+ */
+ const unsigned int format_default = format_indent | format_utf8;
+
+ // Forward declarations
+ struct xml_attribute_struct;
+ struct xml_node_struct;
+
+ class xml_allocator;
+
+ class xml_node_iterator;
+ class xml_attribute_iterator;
+
+ class xml_tree_walker;
+
+ class xml_node;
+
+ #ifndef PUGIXML_NO_XPATH
+ class xpath_node;
+ class xpath_node_set;
+ class xpath_ast_node;
+ class xpath_allocator;
+
+ /**
+ * A class that holds compiled XPath query and allows to evaluate query result
+ */
+ class xpath_query
+ {
+ private:
+ // Noncopyable semantics
+ xpath_query(const xpath_query&);
+ xpath_query& operator=(const xpath_query&);
+
+ xpath_allocator* m_alloc;
+ xpath_ast_node* m_root;
+
+ void compile(const char* query);
+
+ public:
+ /**
+ * Ctor from string with XPath expression.
+ * Throws xpath_exception on compilation error, std::bad_alloc on out of memory error.
+ *
+ * \param query - string with XPath expression
+ */
+ explicit xpath_query(const char* query);
+
+ /**
+ * Dtor
+ */
+ ~xpath_query();
+
+ /**
+ * Evaluate expression as boolean value for the context node \a n.
+ * If expression does not directly evaluate to boolean, the expression result is converted
+ * as through boolean() XPath function call.
+ * Throws std::bad_alloc on out of memory error.
+ *
+ * \param n - context node
+ * \return evaluation result
+ */
+ bool evaluate_boolean(const xml_node& n);
+
+ /**
+ * Evaluate expression as double value for the context node \a n.
+ * If expression does not directly evaluate to double, the expression result is converted
+ * as through number() XPath function call.
+ * Throws std::bad_alloc on out of memory error.
+ *
+ * \param n - context node
+ * \return evaluation result
+ */
+ double evaluate_number(const xml_node& n);
+
+ /**
+ * Evaluate expression as string value for the context node \a n.
+ * If expression does not directly evaluate to string, the expression result is converted
+ * as through string() XPath function call.
+ * Throws std::bad_alloc on out of memory error.
+ *
+ * \param n - context node
+ * \return evaluation result
+ */
+ std::string evaluate_string(const xml_node& n);
+
+ /**
+ * Evaluate expression as node set for the context node \a n.
+ * If expression does not directly evaluate to node set, function returns empty node set.
+ * Throws std::bad_alloc on out of memory error.
+ *
+ * \param n - context node
+ * \return evaluation result
+ */
+ xpath_node_set evaluate_node_set(const xml_node& n);
+ };
+ #endif
+
+ /**
+ * A light-weight wrapper for manipulating attributes in DOM tree.
+ * Note: xml_attribute does not allocate any memory for the attribute it wraps; it only wraps a
+ * pointer to existing attribute.
+ */
+ class xml_attribute
+ {
+ friend class xml_attribute_iterator;
+ friend class xml_node;
+
+ private:
+ xml_attribute_struct* _attr;
+
+ /// \internal Safe bool type
+ typedef xml_attribute_struct* xml_attribute::*unspecified_bool_type;
+
+ /// \internal Initializing ctor
+ explicit xml_attribute(xml_attribute_struct* attr);
+
+ public:
+ /**
+ * Default ctor. Constructs an empty attribute.
+ */
+ xml_attribute();
+
+ public:
+ /**
+ * Safe bool conversion.
+ * Allows xml_node to be used in a context where boolean variable is expected, such as 'if (node)'.
+ */
+ operator unspecified_bool_type() const;
+
+ // Borland C++ workaround
+ bool operator!() const;
+
+ /**
+ * Compare wrapped pointer to the attribute to the pointer that is wrapped by \a r.
+ *
+ * \param r - value to compare to
+ * \return comparison result
+ */
+ bool operator==(const xml_attribute& r) const;
+
+ /**
+ * Compare wrapped pointer to the attribute to the pointer that is wrapped by \a r.
+ *
+ * \param r - value to compare to
+ * \return comparison result
+ */
+ bool operator!=(const xml_attribute& r) const;
+
+ /**
+ * Compare wrapped pointer to the attribute to the pointer that is wrapped by \a r.
+ *
+ * \param r - value to compare to
+ * \return comparison result
+ */
+ bool operator<(const xml_attribute& r) const;
+
+ /**
+ * Compare wrapped pointer to the attribute to the pointer that is wrapped by \a r.
+ *
+ * \param r - value to compare to
+ * \return comparison result
+ */
+ bool operator>(const xml_attribute& r) const;
+
+ /**
+ * Compare wrapped pointer to the attribute to the pointer that is wrapped by \a r.
+ *
+ * \param r - value to compare to
+ * \return comparison result
+ */
+ bool operator<=(const xml_attribute& r) const;
+
+ /**
+ * Compare wrapped pointer to the attribute to the pointer that is wrapped by \a r.
+ *
+ * \param r - value to compare to
+ * \return comparison result
+ */
+ bool operator>=(const xml_attribute& r) const;
+
+ public:
+ /**
+ * Get next attribute in attribute list of node that contains the attribute.
+ *
+ * \return next attribute, if any; empty attribute otherwise
+ */
+ xml_attribute next_attribute() const;
+
+ /**
+ * Get previous attribute in attribute list of node that contains the attribute.
+ *
+ * \return previous attribute, if any; empty attribute otherwise
+ */
+ xml_attribute previous_attribute() const;
+
+ /**
+ * Cast attribute value as int.
+ *
+ * \return attribute value as int, or 0 if conversion did not succeed or attribute is empty
+ */
+ int as_int() const;
+
+ /**
+ * Cast attribute value as double.
+ *
+ * \return attribute value as double, or 0.0 if conversion did not succeed or attribute is empty
+ */
+ double as_double() const;
+
+ /**
+ * Cast attribute value as float.
+ *
+ * \return attribute value as float, or 0.0f if conversion did not succeed or attribute is empty
+ */
+ float as_float() const;
+
+ /**
+ * Cast attribute value as bool. Returns true for attributes with values that start with '1',
+ * 't', 'T', 'y', 'Y', returns false for other attributes.
+ *
+ * \return attribute value as bool, or false if conversion did not succeed or attribute is empty
+ */
+ bool as_bool() const;
+
+ /// \internal Document order or 0 if not set
+ unsigned int document_order() const;
+
+ public:
+ /**
+ * Set attribute value to \a rhs.
+ *
+ * \param rhs - new attribute value
+ * \return self
+ */
+ xml_attribute& operator=(const char* rhs);
+
+ /**
+ * Set attribute value to \a rhs.
+ *
+ * \param rhs - new attribute value
+ * \return self
+ */
+ xml_attribute& operator=(int rhs);
+
+ /**
+ * Set attribute value to \a rhs.
+ *
+ * \param rhs - new attribute value
+ * \return self
+ */
+ xml_attribute& operator=(double rhs);
+
+ /**
+ * Set attribute value to either 'true' or 'false' (depends on whether \a rhs is true or false).
+ *
+ * \param rhs - new attribute value
+ * \return self
+ */
+ xml_attribute& operator=(bool rhs);
+
+ /**
+ * Set attribute name to \a rhs.
+ *
+ * \param rhs - new attribute name
+ * \return success flag (call fails if attribute is empty or there is not enough memory)
+ */
+ bool set_name(const char* rhs);
+
+ /**
+ * Set attribute value to \a rhs.
+ *
+ * \param rhs - new attribute value
+ * \return success flag (call fails if attribute is empty or there is not enough memory)
+ */
+ bool set_value(const char* rhs);
+
+ public:
+ /**
+ * Check if attribute is empty.
+ *
+ * \return true if attribute is empty, false otherwise
+ */
+ bool empty() const;
+
+ public:
+ /**
+ * Get attribute name.
+ *
+ * \return attribute name, or "" if attribute is empty
+ */
+ const char* name() const;
+
+ /**
+ * Get attribute value.
+ *
+ * \return attribute value, or "" if attribute is empty
+ */
+ const char* value() const;
+ };
+
+#ifdef __BORLANDC__
+ // Borland C++ workaround
+ bool operator&&(const xml_attribute& lhs, bool rhs);
+ bool operator||(const xml_attribute& lhs, bool rhs);
+#endif
+
+ /**
+ * A light-weight wrapper for manipulating nodes in DOM tree.
+ * Note: xml_node does not allocate any memory for the node it wraps; it only wraps a pointer to
+ * existing node.
+ */
+ class xml_node
+ {
+ friend class xml_node_iterator;
+
+ protected:
+ xml_node_struct* _root;
+
+ /// \internal Safe bool type
+ typedef xml_node_struct* xml_node::*unspecified_bool_type;
+
+ /// \internal Initializing ctor
+ explicit xml_node(xml_node_struct* p);
+
+ /// \internal Precompute document order (valid only for document node)
+ void precompute_document_order_impl();
+
+ /// \internal Get allocator
+ xml_allocator& get_allocator() const;
+
+ public:
+ /**
+ * Default ctor. Constructs an empty node.
+ */
+ xml_node();
+
+ public:
+ /**
+ * Safe bool conversion.
+ * Allows xml_node to be used in a context where boolean variable is expected, such as 'if (node)'.
+ */
+ operator unspecified_bool_type() const;
+
+ // Borland C++ workaround
+ bool operator!() const;
+
+ /**
+ * Compare wrapped pointer to the attribute to the pointer that is wrapped by \a r.
+ *
+ * \param r - value to compare to
+ * \return comparison result
+ */
+ bool operator==(const xml_node& r) const;
+
+ /**
+ * Compare wrapped pointer to the attribute to the pointer that is wrapped by \a r.
+ *
+ * \param r - value to compare to
+ * \return comparison result
+ */
+ bool operator!=(const xml_node& r) const;
+
+ /**
+ * Compare wrapped pointer to the attribute to the pointer that is wrapped by \a r.
+ *
+ * \param r - value to compare to
+ * \return comparison result
+ */
+ bool operator<(const xml_node& r) const;
+
+ /**
+ * Compare wrapped pointer to the attribute to the pointer that is wrapped by \a r.
+ *
+ * \param r - value to compare to
+ * \return comparison result
+ */
+ bool operator>(const xml_node& r) const;
+
+ /**
+ * Compare wrapped pointer to the attribute to the pointer that is wrapped by \a r.
+ *
+ * \param r - value to compare to
+ * \return comparison result
+ */
+ bool operator<=(const xml_node& r) const;
+
+ /**
+ * Compare wrapped pointer to the attribute to the pointer that is wrapped by \a r.
+ *
+ * \param r - value to compare to
+ * \return comparison result
+ */
+ bool operator>=(const xml_node& r) const;
+
+ public:
+ /**
+ * Node iterator type (for child nodes).
+ * \see xml_node_iterator
+ */
+ typedef xml_node_iterator iterator;
+
+ /**
+ * Node iterator type (for child nodes).
+ * \see xml_attribute_iterator
+ */
+ typedef xml_attribute_iterator attribute_iterator;
+
+ /**
+ * Access the begin iterator for this node's collection of child nodes.
+ *
+ * \return iterator that points to the first child node, or past-the-end iterator if node is empty or has no children
+ */
+ iterator begin() const;
+
+ /**
+ * Access the end iterator for this node's collection of child nodes.
+ *
+ * \return past-the-end iterator for child list
+ */
+ iterator end() const;
+
+ /**
+ * Access the begin iterator for this node's collection of attributes.
+ *
+ * \return iterator that points to the first attribute, or past-the-end iterator if node is empty or has no attributes
+ */
+ attribute_iterator attributes_begin() const;
+
+ /**
+ * Access the end iterator for this node's collection of attributes.
+ *
+ * \return past-the-end iterator for attribute list
+ */
+ attribute_iterator attributes_end() const;
+
+ public:
+ /**
+ * Check if node is empty.
+ *
+ * \return true if node is empty, false otherwise
+ */
+ bool empty() const;
+
+ public:
+ /**
+ * Get node type
+ *
+ * \return node type; node_null for empty nodes
+ */
+ xml_node_type type() const;
+
+ /**
+ * Get node name (element name for element nodes, PI target for PI)
+ *
+ * \return node name, if any; "" otherwise
+ */
+ const char* name() const;
+
+ /**
+ * Get node value (comment/PI/PCDATA/CDATA contents, depending on node type)
+ *
+ * \return node value, if any; "" otherwise
+ */
+ const char* value() const;
+
+ /**
+ * Get child with the specified name
+ *
+ * \param name - child name
+ * \return child with the specified name, if any; empty node otherwise
+ */
+ xml_node child(const char* name) const;
+
+ /**
+ * Get child with the name that matches specified pattern
+ *
+ * \param name - child name pattern
+ * \return child with the name that matches pattern, if any; empty node otherwise
+ */
+ xml_node child_w(const char* name) const;
+
+ /**
+ * Get attribute with the specified name
+ *
+ * \param name - attribute name
+ * \return attribute with the specified name, if any; empty attribute otherwise
+ */
+ xml_attribute attribute(const char* name) const;
+
+ /**
+ * Get attribute with the name that matches specified pattern
+ *
+ * \param name - attribute name pattern
+ * \return attribute with the name that matches pattern, if any; empty attribute otherwise
+ */
+ xml_attribute attribute_w(const char* name) const;
+
+ /**
+ * Get first of following sibling nodes with the specified name
+ *
+ * \param name - sibling name
+ * \return node with the specified name, if any; empty node otherwise
+ */
+ xml_node next_sibling(const char* name) const;
+
+ /**
+ * Get first of the following sibling nodes with the name that matches specified pattern
+ *
+ * \param name - sibling name pattern
+ * \return node with the name that matches pattern, if any; empty node otherwise
+ */
+ xml_node next_sibling_w(const char* name) const;
+
+ /**
+ * Get following sibling
+ *
+ * \return following sibling node, if any; empty node otherwise
+ */
+ xml_node next_sibling() const;
+
+ /**
+ * Get first of preceding sibling nodes with the specified name
+ *
+ * \param name - sibling name
+ * \return node with the specified name, if any; empty node otherwise
+ */
+ xml_node previous_sibling(const char* name) const;
+
+ /**
+ * Get first of the preceding sibling nodes with the name that matches specified pattern
+ *
+ * \param name - sibling name pattern
+ * \return node with the name that matches pattern, if any; empty node otherwise
+ */
+ xml_node previous_sibling_w(const char* name) const;
+
+ /**
+ * Get preceding sibling
+ *
+ * \return preceding sibling node, if any; empty node otherwise
+ */
+ xml_node previous_sibling() const;
+
+ /**
+ * Get parent node
+ *
+ * \return parent node if any; empty node otherwise
+ */
+ xml_node parent() const;
+
+ /**
+ * Get root of DOM tree this node belongs to.
+ *
+ * \return tree root
+ */
+ xml_node root() const;
+
+ /**
+ * Get child value of current node; that is, value of the first child node of type PCDATA/CDATA
+ *
+ * \return child value of current node, if any; "" otherwise
+ */
+ const char* child_value() const;
+
+ /**
+ * Get child value of child with specified name. \see child_value
+ * node.child_value(name) is equivalent to node.child(name).child_value()
+ *
+ * \param name - child name
+ * \return child value of specified child node, if any; "" otherwise
+ */
+ const char* child_value(const char* name) const;
+
+ /**
+ * Get child value of child with name that matches the specified pattern. \see child_value
+ * node.child_value_w(name) is equivalent to node.child_w(name).child_value()
+ *
+ * \param name - child name pattern
+ * \return child value of specified child node, if any; "" otherwise
+ */
+ const char* child_value_w(const char* name) const;
+
+ public:
+ /**
+ * Set node name to \a rhs (for PI/element nodes). \see name
+ *
+ * \param rhs - new node name
+ * \return success flag (call fails if node is of the wrong type or there is not enough memory)
+ */
+ bool set_name(const char* rhs);
+
+ /**
+ * Set node value to \a rhs (for PI/PCDATA/CDATA/comment nodes). \see value
+ *
+ * \param rhs - new node value
+ * \return success flag (call fails if node is of the wrong type or there is not enough memory)
+ */
+ bool set_value(const char* rhs);
+
+ /**
+ * Add attribute with specified name (for element nodes)
+ *
+ * \param name - attribute name
+ * \return added attribute, or empty attribute if there was an error (wrong node type)
+ */
+ xml_attribute append_attribute(const char* name);
+
+ /**
+ * Insert attribute with specified name after \a attr (for element nodes)
+ *
+ * \param name - attribute name
+ * \param attr - attribute to insert a new one after
+ * \return inserted attribute, or empty attribute if there was an error (wrong node type, or attr does not belong to node)
+ */
+ xml_attribute insert_attribute_after(const char* name, const xml_attribute& attr);
+
+ /**
+ * Insert attribute with specified name before \a attr (for element nodes)
+ *
+ * \param name - attribute name
+ * \param attr - attribute to insert a new one before
+ * \return inserted attribute, or empty attribute if there was an error (wrong node type, or attr does not belong to node)
+ */
+ xml_attribute insert_attribute_before(const char* name, const xml_attribute& attr);
+
+ /**
+ * Add child node with specified type (for element nodes)
+ *
+ * \param type - node type
+ * \return added node, or empty node if there was an error (wrong node type)
+ */
+ xml_node append_child(xml_node_type type = node_element);
+
+ /**
+ * Insert child node with specified type after \a node (for element nodes)
+ *
+ * \param type - node type
+ * \param node - node to insert a new one after
+ * \return inserted node, or empty node if there was an error (wrong node type, or \a node is not a child of this node)
+ */
+ xml_node insert_child_after(xml_node_type type, const xml_node& node);
+
+ /**
+ * Insert child node with specified type before \a node (for element nodes)
+ *
+ * \param type - node type
+ * \param node - node to insert a new one before
+ * \return inserted node, or empty node if there was an error (wrong node type, or \a node is not a child of this node)
+ */
+ xml_node insert_child_before(xml_node_type type, const xml_node& node);
+
+ /**
+ * Remove specified attribute
+ *
+ * \param a - attribute to be removed
+ */
+ void remove_attribute(const xml_attribute& a);
+
+ /**
+ * Remove attribute with the specified name, if any
+ *
+ * \param name - attribute name
+ */
+ void remove_attribute(const char* name);
+
+ /**
+ * Remove specified child
+ *
+ * \param n - child node to be removed
+ */
+ void remove_child(const xml_node& n);
+
+ /**
+ * Remove child with the specified name, if any
+ *
+ * \param name - child name
+ */
+ void remove_child(const char* name);
+
+ public:
+ /**
+ * Get first attribute
+ *
+ * \return first attribute, if any; empty attribute otherwise
+ */
+ xml_attribute first_attribute() const;
+
+ /**
+ * Get last attribute
+ *
+ * \return last attribute, if any; empty attribute otherwise
+ */
+ xml_attribute last_attribute() const;
+
+ /**
+ * Get all elements from subtree with given name
+ *
+ * \param name - node name
+ * \param it - output iterator (for example, std::back_insert_iterator (result of std::back_inserter))
+ */
+ template <typename OutputIterator> void all_elements_by_name(const char* name, OutputIterator it) const;
+
+ /**
+ * Get all elements from subtree with name that matches given pattern
+ *
+ * \param name - node name pattern
+ * \param it - output iterator (for example, std::back_insert_iterator (result of std::back_inserter))
+ */
+ template <typename OutputIterator> void all_elements_by_name_w(const char* name, OutputIterator it) const;
+
+ /**
+ * Get first child
+ *
+ * \return first child, if any; empty node otherwise
+ */
+ xml_node first_child() const;
+
+ /**
+ * Get last child
+ *
+ * \return last child, if any; empty node otherwise
+ */
+ xml_node last_child() const;
+
+ /**
+ * Find attribute using predicate
+ *
+ * \param pred - predicate, that takes xml_attribute and returns bool
+ * \return first attribute for which predicate returned true, or empty attribute
+ */
+ template <typename Predicate> xml_attribute find_attribute(Predicate pred) const;
+
+ /**
+ * Find child node using predicate
+ *
+ * \param pred - predicate, that takes xml_node and returns bool
+ * \return first child node for which predicate returned true, or empty node
+ */
+ template <typename Predicate> xml_node find_child(Predicate pred) const;
+
+ /**
+ * Find node from subtree using predicate
+ *
+ * \param pred - predicate, that takes xml_node and returns bool
+ * \return first node from subtree for which predicate returned true, or empty node
+ */
+ template <typename Predicate> xml_node find_node(Predicate pred) const;
+
+#ifndef PUGIXML_NO_STL
+ /**
+ * Get the absolute node path from root as a text string.
+ *
+ * \param delimiter - delimiter character to insert between element names
+ * \return path string (e.g. '/bookstore/book/author').
+ */
+ std::string path(char delimiter = '/') const;
+#endif
+
+ /**
+ * Search for a node by path.
+ * \param path - path string; e.g. './foo/bar' (relative to node), '/foo/bar' (relative
+ * to root), '../foo/bar'.
+ * \param delimiter - delimiter character to use while tokenizing path
+ * \return matching node, if any; empty node otherwise
+ */
+ xml_node first_element_by_path(const char* path, char delimiter = '/') const;
+
+ /**
+ * Recursively traverse subtree with xml_tree_walker
+ * \see xml_tree_walker::begin
+ * \see xml_tree_walker::for_each
+ * \see xml_tree_walker::end
+ *
+ * \param walker - tree walker to traverse subtree with
+ * \return traversal result
+ */
+ bool traverse(xml_tree_walker& walker);
+
+ #ifndef PUGIXML_NO_XPATH
+ /**
+ * Select single node by evaluating XPath query
+ *
+ * \param query - query string
+ * \return first node from the resulting node set by document order, or empty node if none found
+ */
+ xpath_node select_single_node(const char* query) const;
+
+ /**
+ * Select single node by evaluating XPath query
+ *
+ * \param query - compiled query
+ * \return first node from the resulting node set by document order, or empty node if none found
+ */
+ xpath_node select_single_node(xpath_query& query) const;
+
+ /**
+ * Select node set by evaluating XPath query
+ *
+ * \param query - query string
+ * \return resulting node set
+ */
+ xpath_node_set select_nodes(const char* query) const;
+
+ /**
+ * Select node set by evaluating XPath query
+ *
+ * \param query - compiled query
+ * \return resulting node set
+ */
+ xpath_node_set select_nodes(xpath_query& query) const;
+ #endif
+
+ /// \internal Document order or 0 if not set
+ unsigned int document_order() const;
+
+ #ifndef PUGIXML_NO_STL
+ /**
+ * Print subtree to stream
+ *
+ * \param os - output stream
+ * \param indent - indentation string
+ * \param flags - formatting flags
+ * \param depth - starting depth (used for indentation)
+ */
+ void print(std::ostream& os, const char* indent = "\t", unsigned int flags = format_default, unsigned int depth = 0);
+ #endif
+ };
+
+#ifdef __BORLANDC__
+ // Borland C++ workaround
+ bool operator&&(const xml_node& lhs, bool rhs);
+ bool operator||(const xml_node& lhs, bool rhs);
+#endif
+
+ /**
+ * Child node iterator.
+ * It's a bidirectional iterator with value type 'xml_node'.
+ */
+ class xml_node_iterator
+#ifndef PUGIXML_NO_STL
+ : public std::iterator<std::bidirectional_iterator_tag, xml_node>
+#endif
+ {
+ friend class xml_node;
+
+ private:
+ xml_node _prev;
+ xml_node _wrap;
+
+ /// \internal Initializing ctor
+ explicit xml_node_iterator(xml_node_struct* ref);
+
+ public:
+ /**
+ * Default ctor
+ */
+ xml_node_iterator();
+
+ /**
+ * Initializing ctor
+ *
+ * \param node - node that iterator will point at
+ */
+ xml_node_iterator(const xml_node& node);
+
+ /**
+ * Initializing ctor (for past-the-end)
+ *
+ * \param ref - should be 0
+ * \param prev - previous node
+ */
+ xml_node_iterator(xml_node_struct* ref, xml_node_struct* prev);
+
+ /**
+ * Check if this iterator is equal to \a rhs
+ *
+ * \param rhs - other iterator
+ * \return comparison result
+ */
+ bool operator==(const xml_node_iterator& rhs) const;
+
+ /**
+ * Check if this iterator is not equal to \a rhs
+ *
+ * \param rhs - other iterator
+ * \return comparison result
+ */
+ bool operator!=(const xml_node_iterator& rhs) const;
+
+ /**
+ * Dereferencing operator
+ *
+ * \return reference to the node iterator points at
+ */
+ xml_node& operator*();
+
+ /**
+ * Member access operator
+ *
+ * \return poitner to the node iterator points at
+ */
+ xml_node* operator->();
+
+ /**
+ * Pre-increment operator
+ *
+ * \return self
+ */
+ const xml_node_iterator& operator++();
+
+ /**
+ * Post-increment operator
+ *
+ * \return old value
+ */
+ xml_node_iterator operator++(int);
+
+ /**
+ * Pre-decrement operator
+ *
+ * \return self
+ */
+ const xml_node_iterator& operator--();
+
+ /**
+ * Post-decrement operator
+ *
+ * \return old value
+ */
+ xml_node_iterator operator--(int);
+ };
+
+ /**
+ * Attribute iterator.
+ * It's a bidirectional iterator with value type 'xml_attribute'.
+ */
+ class xml_attribute_iterator
+#ifndef PUGIXML_NO_STL
+ : public std::iterator<std::bidirectional_iterator_tag, xml_attribute>
+#endif
+ {
+ friend class xml_node;
+
+ private:
+ xml_attribute _prev;
+ xml_attribute _wrap;
+
+ /// \internal Initializing ctor
+ explicit xml_attribute_iterator(xml_attribute_struct* ref);
+
+ public:
+ /**
+ * Default ctor
+ */
+ xml_attribute_iterator();
+
+ /**
+ * Initializing ctor
+ *
+ * \param node - node that iterator will point at
+ */
+ xml_attribute_iterator(const xml_attribute& node);
+
+ /**
+ * Initializing ctor (for past-the-end)
+ *
+ * \param ref - should be 0
+ * \param prev - previous node
+ */
+ xml_attribute_iterator(xml_attribute_struct* ref, xml_attribute_struct* prev);
+
+ /**
+ * Check if this iterator is equal to \a rhs
+ *
+ * \param rhs - other iterator
+ * \return comparison result
+ */
+ bool operator==(const xml_attribute_iterator& rhs) const;
+
+ /**
+ * Check if this iterator is not equal to \a rhs
+ *
+ * \param rhs - other iterator
+ * \return comparison result
+ */
+ bool operator!=(const xml_attribute_iterator& rhs) const;
+
+ /**
+ * Dereferencing operator
+ *
+ * \return reference to the node iterator points at
+ */
+ xml_attribute& operator*();
+
+ /**
+ * Member access operator
+ *
+ * \return poitner to the node iterator points at
+ */
+ xml_attribute* operator->();
+
+ /**
+ * Pre-increment operator
+ *
+ * \return self
+ */
+ const xml_attribute_iterator& operator++();
+
+ /**
+ * Post-increment operator
+ *
+ * \return old value
+ */
+ xml_attribute_iterator operator++(int);
+
+ /**
+ * Pre-decrement operator
+ *
+ * \return self
+ */
+ const xml_attribute_iterator& operator--();
+
+ /**
+ * Post-decrement operator
+ *
+ * \return old value
+ */
+ xml_attribute_iterator operator--(int);
+ };
+
+ /**
+ * Abstract tree walker class
+ * \see xml_node::traverse
+ */
+ class xml_tree_walker
+ {
+ friend class xml_node;
+
+ private:
+ int _depth;
+
+ protected:
+ /**
+ * Get node depth
+ *
+ * \return node depth
+ */
+ int depth() const;
+
+ public:
+ /**
+ * Default ctor
+ */
+ xml_tree_walker();
+
+ /**
+ * Virtual dtor
+ */
+ virtual ~xml_tree_walker();
+
+ public:
+ /**
+ * Callback that is called when traversal of node begins.
+ *
+ * \return returning false will abort the traversal
+ */
+ virtual bool begin(xml_node&);
+
+ /**
+ * Callback that is called for each node traversed
+ *
+ * \return returning false will abort the traversal
+ */
+ virtual bool for_each(xml_node&) = 0;
+
+ /**
+ * Callback that is called when traversal of node ends.
+ *
+ * \return returning false will abort the traversal
+ */
+ virtual bool end(xml_node&);
+ };
+
+ /// \internal Memory block
+ struct xml_memory_block
+ {
+ xml_memory_block();
+
+ xml_memory_block* next;
+ size_t size;
+
+ char data[memory_block_size];
+ };
+
+ /**
+ * Struct used to distinguish parsing with ownership transfer from parsing without it.
+ * \see xml_document::parse
+ */
+ struct transfer_ownership_tag {};
+
+ /**
+ * Document class (DOM tree root).
+ * This class has noncopyable semantics (private copy ctor/assignment operator).
+ */
+ class xml_document: public xml_node
+ {
+ private:
+ char* _buffer;
+
+ xml_memory_block _memory;
+
+ xml_document(const xml_document&);
+ const xml_document& operator=(const xml_document&);
+
+ void create();
+ void free();
+
+ public:
+ /**
+ * Default ctor, makes empty document
+ */
+ xml_document();
+
+ /**
+ * Dtor
+ */
+ ~xml_document();
+
+ public:
+#ifndef PUGIXML_NO_STL
+ /**
+ * Load document from stream.
+ *
+ * \param stream - stream with xml data
+ * \param options - parsing options
+ * \return success flag
+ */
+ bool load(std::istream& stream, unsigned int options = parse_default);
+#endif
+
+ /**
+ * Load document from string.
+ *
+ * \param contents - input string
+ * \param options - parsing options
+ * \return success flag
+ */
+ bool load(const char* contents, unsigned int options = parse_default);
+
+ /**
+ * Load document from file
+ *
+ * \param name - file name
+ * \param options - parsing options
+ * \return success flag
+ */
+ bool load_file(const char* name, unsigned int options = parse_default);
+
+ /**
+ * Parse the given XML string in-situ.
+ * The string is modified; you should ensure that string data will persist throughout the
+ * document's lifetime. Although, document does not gain ownership over the string, so you
+ * should free the memory occupied by it manually.
+ *
+ * \param xmlstr - readwrite string with xml data
+ * \param options - parsing options
+ * \return success flag
+ */
+ bool parse(char* xmlstr, unsigned int options = parse_default);
+
+ /**
+ * Parse the given XML string in-situ (gains ownership).
+ * The string is modified; document gains ownership over the string, so you don't have to worry
+ * about it's lifetime.
+ * Call example: doc.parse(transfer_ownership_tag(), string, options);
+ *
+ * \param xmlstr - readwrite string with xml data
+ * \param options - parsing options
+ * \return success flag
+ */
+ bool parse(const transfer_ownership_tag&, char* xmlstr, unsigned int options = parse_default);
+
+#ifndef PUGIXML_NO_STL
+ /**
+ * Save XML to file
+ *
+ * \param name - file name
+ * \param indent - indentation string
+ * \param flags - formatting flags
+ * \return success flag
+ */
+ bool save_file(const char* name, const char* indent = "\t", unsigned int flags = format_default);
+#endif
+
+ /**
+ * Compute document order for the whole tree
+ * Sometimes this makes evaluation of XPath queries faster.
+ */
+ void precompute_document_order();
+ };
+
+#ifndef PUGIXML_NO_XPATH
+ /**
+ * XPath exception class.
+ */
+ class xpath_exception: public std::exception
+ {
+ private:
+ const char* m_message;
+
+ public:
+ /**
+ * Construct exception from static error string
+ *
+ * \param message - error string
+ */
+ explicit xpath_exception(const char* message);
+
+ /**
+ * Return error message
+ *
+ * \return error message
+ */
+ virtual const char* what() const throw();
+ };
+
+ /**
+ * XPath node class.
+ *
+ * XPath defines node to be either xml_node or xml_attribute in pugixml terminology, so xpath_node
+ * is either xml_node or xml_attribute.
+ */
+ class xpath_node
+ {
+ private:
+ xml_node m_node;
+ xml_attribute m_attribute;
+
+ /// \internal Safe bool type
+ typedef xml_node xpath_node::*unspecified_bool_type;
+
+ public:
+ /**
+ * Construct empty XPath node
+ */
+ xpath_node();
+
+ /**
+ * Construct XPath node from XML node
+ *
+ * \param node - XML node
+ */
+ xpath_node(const xml_node& node);
+
+ /**
+ * Construct XPath node from XML attribute
+ *
+ * \param attribute - XML attribute
+ * \param parent - attribute's parent node
+ */
+ xpath_node(const xml_attribute& attribute, const xml_node& parent);
+
+ /**
+ * Get XML node, if any
+ *
+ * \return contained XML node, empty node otherwise
+ */
+ xml_node node() const;
+
+ /**
+ * Get XML attribute, if any
+ *
+ * \return contained XML attribute, if any, empty attribute otherwise
+ */
+ xml_attribute attribute() const;
+
+ /**
+ * Get parent of contained XML attribute, if any
+ *
+ * \return parent of contained XML attribute, if any, empty node otherwise
+ */
+ xml_node parent() const;
+
+ /**
+ * Safe bool conversion.
+ * Allows xpath_node to be used in a context where boolean variable is expected, such as 'if (node)'.
+ */
+ operator unspecified_bool_type() const;
+
+ /**
+ * Compares two XPath nodes
+ *
+ * \param n - XPath node to compare to
+ * \return comparison result
+ */
+ bool operator==(const xpath_node& n) const;
+
+ /**
+ * Compares two XPath nodes
+ *
+ * \param n - XPath node to compare to
+ * \return comparison result
+ */
+ bool operator!=(const xpath_node& n) const;
+ };
+
+ /**
+ * Not necessarily ordered constant collection of XPath nodes
+ */
+ class xpath_node_set
+ {
+ friend class xpath_ast_node;
+
+ public:
+ /// Collection type
+ enum type_t
+ {
+ type_unsorted, ///< Not ordered
+ type_sorted, ///< Sorted by document order (ascending)
+ type_sorted_reverse ///< Sorted by document order (descending)
+ };
+
+ /// Constant iterator type
+ typedef const xpath_node* const_iterator;
+
+ private:
+ type_t m_type;
+
+ xpath_node m_storage;
+
+ xpath_node* m_begin;
+ xpath_node* m_end;
+ xpath_node* m_eos;
+
+ bool m_using_storage;
+
+ typedef xpath_node* iterator;
+
+ iterator mut_begin();
+ iterator mut_end();
+
+ void push_back(const xpath_node& n);
+
+ template <typename Iterator> void append(Iterator begin, Iterator end);
+
+ void truncate(iterator it);
+
+ void remove_duplicates();
+
+ public:
+ /**
+ * Default ctor
+ * Constructs empty set
+ */
+ xpath_node_set();
+
+ /**
+ * Dtor
+ */
+ ~xpath_node_set();
+
+ /**
+ * Copy ctor
+ *
+ * \param ns - set to copy
+ */
+ xpath_node_set(const xpath_node_set& ns);
+
+ /**
+ * Assignment operator
+ *
+ * \param ns - set to assign
+ * \return self
+ */
+ xpath_node_set& operator=(const xpath_node_set& ns);
+
+ /**
+ * Get collection type
+ *
+ * \return collection type
+ */
+ type_t type() const;
+
+ /**
+ * Get collection size
+ *
+ * \return collection size
+ */
+ size_t size() const;
+
+ /**
+ * Get begin constant iterator for collection
+ *
+ * \return begin constant iterator
+ */
+ const_iterator begin() const;
+
+ /**
+ * Get end iterator for collection
+ *
+ * \return end iterator
+ */
+ const_iterator end() const;
+
+ /**
+ * Sort the collection in ascending/descending order by document order
+ *
+ * \param reverse - whether to sort in ascending (false) or descending (true) order
+ */
+ void sort(bool reverse = false);
+
+ /**
+ * Get first node in the collection by document order
+ *
+ * \return first node by document order
+ */
+ xpath_node first() const;
+
+ /**
+ * Return true if collection is empty
+ *
+ * \return true if collection is empty, false otherwise
+ */
+ bool empty() const;
+ };
+#endif
+
+#ifndef PUGIXML_NO_STL
+ /**
+ * Convert utf16 to utf8
+ *
+ * \param str - input UTF16 string
+ * \return output UTF8 string
+ */
+ std::string as_utf8(const wchar_t* str);
+
+ /**
+ * Convert utf8 to utf16
+ *
+ * \param str - input UTF8 string
+ * \return output UTF16 string
+ */
+ std::wstring as_utf16(const char* str);
+#endif
+}
+
+// Inline implementation
+
+namespace pugi
+{
+ namespace impl
+ {
+ int strcmpwild(const char*, const char*);
+ }
+
+ template <typename OutputIterator> void xml_node::all_elements_by_name(const char* name, OutputIterator it) const
+ {
+ if (empty()) return;
+
+ for (xml_node node = first_child(); node; node = node.next_sibling())
+ {
+ if (node.type() == node_element)
+ {
+ if (!strcmp(name, node.name()))
+ {
+ *it = node;
+ ++it;
+ }
+
+ if (node.first_child()) node.all_elements_by_name(name, it);
+ }
+ }
+ }
+
+ template <typename OutputIterator> void xml_node::all_elements_by_name_w(const char* name, OutputIterator it) const
+ {
+ if (empty()) return;
+
+ for (xml_node node = first_child(); node; node = node.next_sibling())
+ {
+ if (node.type() == node_element)
+ {
+ if (!impl::strcmpwild(name, node.name()))
+ {
+ *it = node;
+ ++it;
+ }
+
+ if (node.first_child()) node.all_elements_by_name_w(name, it);
+ }
+ }
+ }
+
+ template <typename Predicate> inline xml_attribute xml_node::find_attribute(Predicate pred) const
+ {
+ if (!empty())
+ for (xml_attribute attrib = first_attribute(); attrib; attrib = attrib.next_attribute())
+ if (pred(attrib))
+ return attrib;
+
+ return xml_attribute();
+ }
+
+ template <typename Predicate> inline xml_node xml_node::find_child(Predicate pred) const
+ {
+ if (!empty())
+ for (xml_node node = first_child(); node; node = node.next_sibling())
+ if (pred(node))
+ return node;
+
+ return xml_node();
+ }
+
+ template <typename Predicate> inline xml_node xml_node::find_node(Predicate pred) const
+ {
+ if (!empty())
+ for (xml_node node = first_child(); node; node = node.next_sibling())
+ {
+ if (pred(node))
+ return node;
+
+ if (node.first_child())
+ {
+ xml_node found = node.find_element(pred);
+ if (found) return found;
+ }
+ }
+
+ return xml_node();
+ }
+}
+
+#endif
diff --git a/src/pugixpath.cpp b/src/pugixpath.cpp
new file mode 100644
index 0000000..75b5844
--- /dev/null
+++ b/src/pugixpath.cpp
@@ -0,0 +1,3537 @@
+///////////////////////////////////////////////////////////////////////////////
+//
+// Pug Improved XML Parser - Version 0.3
+// --------------------------------------------------------
+// Copyright (C) 2006-2007, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)
+// This work is based on the pugxml parser, which is:
+// Copyright (C) 2003, by Kristen Wegner (kristen@tima.net)
+// Released into the Public Domain. Use at your own risk.
+// See pugxml.xml for further information, history, etc.
+// Contributions by Neville Franks (readonly@getsoft.com).
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "pugixml.hpp"
+
+#ifndef PUGIXML_NO_XPATH
+
+#include <algorithm>
+
+#include <cassert>
+
+#include <stdio.h>
+#include <math.h>
+#include <float.h>
+#include <ctype.h>
+
+#if defined(_MSC_VER)
+# pragma warning(disable: 4127) // conditional expression is constant
+# pragma warning(disable: 4702) // unreachable code
+# pragma warning(disable: 4996) // this function or variable may be unsafe
+#endif
+
+namespace
+{
+ using namespace pugi;
+
+ enum chartype
+ {
+ ct_space = 1, // \r, \n, space, tab
+ ct_start_symbol = 2, // Any symbol > 127, a-z, A-Z, _, :
+ ct_digit = 4, // 0-9
+ ct_symbol = 8 // Any symbol > 127, a-z, A-Z, 0-9, _, :, -, .
+ };
+
+ const unsigned char chartype_table[256] =
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, // 0-15
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16-31
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, // 32-47
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 10, 0, 0, 0, 0, 0, // 48-63
+ 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, // 64-79
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 10, // 80-95
+ 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, // 96-111
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, // 112-127
+
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, // 128+
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10
+ };
+
+ bool is_chartype(char c, chartype ct)
+ {
+ return !!(chartype_table[static_cast<unsigned char>(c)] & ct);
+ }
+
+ bool starts_with(const std::string& s, const char* pattern)
+ {
+ return s.compare(0, strlen(pattern), pattern) == 0;
+ }
+
+ std::string string_value(const xpath_node& na)
+ {
+ if (na.attribute())
+ return na.attribute().value();
+ else
+ {
+ const xml_node& n = na.node();
+
+ switch (n.type())
+ {
+ case node_pcdata:
+ case node_cdata:
+ case node_comment:
+ case node_pi:
+ return n.value();
+
+ case node_document:
+ case node_element:
+ {
+ std::string result;
+
+ xml_node c = n.first_child();
+
+ while (c)
+ {
+ if (c.type() == node_pcdata || c.type() == node_cdata)
+ result += c.value();
+
+ if (c.first_child())
+ c = c.first_child();
+ else if (c.next_sibling())
+ c = c.next_sibling();
+ else
+ {
+ while (c && c != n) c = c.parent();
+
+ if (c == n) break;
+
+ c = c.next_sibling();
+ }
+ }
+
+ return result;
+ }
+
+ default:
+ return "";
+ }
+ }
+ }
+
+ struct document_order_comparator
+ {
+ bool operator()(const xpath_node& lhs, const xpath_node& rhs) const
+ {
+ unsigned int lo = lhs.attribute() ? lhs.attribute().document_order() : lhs.node().document_order();
+ unsigned int ro = rhs.attribute() ? rhs.attribute().document_order() : rhs.node().document_order();
+
+ if (lo != 0 && ro != 0)
+ return lo < ro;
+
+ xml_node ln = lhs.node(), rn = rhs.node();
+
+ if (lhs.attribute() && rhs.attribute())
+ {
+ if (lhs.parent() == rhs.parent()) return lhs.attribute() < rhs.attribute();
+
+ ln = lhs.parent();
+ rn = rhs.parent();
+ }
+ else if (lhs.attribute())
+ {
+ if (lhs.parent() == rhs.node()) return false;
+
+ ln = lhs.parent();
+ }
+ else if (rhs.attribute())
+ {
+ if (rhs.parent() == lhs.node()) return true;
+
+ rn = rhs.parent();
+ }
+
+ if (ln == rn) return false;
+
+ xml_node lp = ln, rp = rn;
+
+ while (lp != rp)
+ {
+ ln = lp;
+ lp = lp.parent();
+
+ if (lp != rp)
+ {
+ rn = rp;
+ rp = rp.parent();
+ }
+ }
+
+ if (!lp) // no common parent - ???
+ return false;
+ else // lp is parent, ln & rn are distinct siblings
+ {
+ for (; ln; ln = ln.next_sibling());
+ if (ln == rn)
+ return true;
+
+ return false;
+ }
+ }
+ };
+
+ struct duplicate_comparator
+ {
+ bool operator()(const xpath_node& lhs, const xpath_node& rhs) const
+ {
+ if (lhs.attribute()) return rhs.attribute() ? lhs.attribute() < rhs.attribute() : true;
+ else return rhs.attribute() ? false : lhs.node() < rhs.node();
+ }
+ };
+
+ /* From trio
+ *
+ * Endian-agnostic indexing macro.
+ *
+ * The value of internalEndianMagic, when converted into a 64-bit
+ * integer, becomes 0x0706050403020100 (we could have used a 64-bit
+ * integer value instead of a double, but not all platforms supports
+ * that type). The value is automatically encoded with the correct
+ * endianess by the compiler, which means that we can support any
+ * kind of endianess. The individual bytes are then used as an index
+ * for the IEEE 754 bit-patterns and masks.
+ */
+ #define DOUBLE_INDEX(x) (((unsigned char *)&internal_endian_magic)[7-(x)])
+
+ static const double internal_endian_magic = 7.949928895127363e-275;
+
+ static const unsigned char ieee_754_exponent_mask[] = { 0x7F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+
+ static const unsigned char ieee_754_mantissa_mask[] = { 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
+
+ static const unsigned char ieee_754_qnan_array[] = { 0x7F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+
+ bool is_special(double value, bool& has_mantissa)
+ {
+ bool is_special_quantity = true;
+
+ has_mantissa = false;
+
+ for (unsigned int i = 0; i < sizeof(double); ++i)
+ {
+ unsigned char current = ((unsigned char *)&value)[DOUBLE_INDEX(i)];
+
+ is_special_quantity = is_special_quantity && (current & ieee_754_exponent_mask[i]) == ieee_754_exponent_mask[i];
+ has_mantissa = has_mantissa || (current & ieee_754_mantissa_mask[i]) != 0;
+ }
+
+ return is_special_quantity;
+ }
+
+ double gen_nan()
+ {
+#if FLT_RADIX == 2 && DBL_MAX_EXP == 1024 && DBL_MANT_DIG == 53
+ // IEEE 754
+
+ double result = 0;
+
+ for (unsigned int i = 0; i < sizeof(double); ++i)
+ {
+ ((unsigned char *)&result)[DOUBLE_INDEX(i)] = ieee_754_qnan_array[i];
+ }
+
+ return result;
+#else
+ const volatile double zero = 0.0;
+ return zero / zero;
+#endif
+ }
+
+ bool is_nan(double value)
+ {
+#if defined(__USE_ISOC99)
+ return isnan(value);
+#elif defined(_MSC_VER) || defined(__BORLANDC__)
+ return !!_isnan(value);
+#elif FLT_RADIX == 2 && DBL_MAX_EXP == 1024 && DBL_MANT_DIG == 53
+ // IEEE 754
+
+ bool has_mantissa;
+
+ bool is_special_quantity = is_special(value, has_mantissa);
+
+ return (is_special_quantity && has_mantissa);
+#else
+ return value != value;
+#endif
+ }
+
+ bool is_inf(double value)
+ {
+#if defined(__USE_ISOC99)
+ return !isfinite(value);
+#elif defined(_MSC_VER) || defined(__BORLANDC__)
+ return !_finite(value);
+#elif FLT_RADIX == 2 && DBL_MAX_EXP == 1024 && DBL_MANT_DIG == 53
+ // IEEE 754
+
+ bool has_mantissa;
+
+ bool is_special_quantity = is_special(value, has_mantissa);
+
+ return (is_special_quantity && !has_mantissa);
+#else
+ return value + 1 == value && value - 1 == value;
+#endif
+ }
+
+ bool convert_number_to_boolean(double value)
+ {
+ return (value != 0 && !is_nan(value));
+ }
+
+ const char* convert_number_to_string(double value)
+ {
+ if (is_nan(value)) return "NaN";
+ else if (is_inf(value)) return value < 0 ? "-Infinity" : "Infinity";
+
+ static char buf[100];
+
+ if (value == (int)value) sprintf(buf, "%d", (int)value);
+ else
+ {
+ sprintf(buf, "%f", value);
+
+ // trim trailing zeros after decimal point
+ if (strchr(buf, '.'))
+ {
+ char* ptr = buf + strlen(buf) - 1;
+ for (; *ptr == '0'; --ptr) ;
+ *(ptr+1) = 0;
+ }
+ }
+
+ return buf;
+ }
+
+ double convert_string_to_number(const char* string)
+ {
+ while (is_chartype(*string, ct_space)) ++string;
+
+ double sign = 1;
+
+ if (*string == '-')
+ {
+ sign = -1;
+ ++string;
+ }
+
+ double r = 0;
+
+ if (!*string) return gen_nan();
+
+ while (is_chartype(*string, ct_digit))
+ {
+ r = r * 10 + (*string - '0');
+ ++string;
+ }
+
+ if (*string)
+ {
+ if (is_chartype(*string, ct_space))
+ {
+ while (is_chartype(*string, ct_space)) ++string;
+ if (*string) return gen_nan();
+ }
+
+ if (*string != '.') return gen_nan();
+
+ ++string;
+
+ double power = 0.1;
+
+ while (is_chartype(*string, ct_digit))
+ {
+ r += power * (*string - '0');
+ power /= 10;
+ ++string;
+ }
+
+ while (is_chartype(*string, ct_space)) ++string;
+ if (*string) return gen_nan();
+ }
+
+ return r * sign;
+ }
+
+ double ieee754_round(double value)
+ {
+ return value == value ? floor(value + 0.5) : value;
+ }
+
+ const char* local_name(const char* name)
+ {
+ const char* p = strchr(name, ':');
+
+ return p ? p + 1 : name;
+ }
+
+ const char* namespace_uri(const xml_node& node)
+ {
+ const char* pos = strchr(node.name(), ':');
+
+ std::string ns = "xmlns";
+
+ if (pos)
+ {
+ ns += ':';
+ ns.append(node.name(), pos);
+ }
+
+ xml_node p = node.parent();
+
+ while (p)
+ {
+ xml_attribute a = p.attribute(ns.c_str());
+
+ if (a) return a.value();
+
+ p = p.parent();
+ }
+
+ return "";
+ }
+
+ const char* namespace_uri(const xml_attribute& attr, const xml_node& parent)
+ {
+ const char* pos = strchr(attr.name(), ':');
+
+ // Default namespace does not apply to attributes
+ if (!pos) return "";
+
+ std::string ns = "xmlns:";
+ ns.append(attr.name(), pos);
+
+ xml_node p = parent;
+
+ while (p)
+ {
+ xml_attribute a = p.attribute(ns.c_str());
+
+ if (a) return a.value();
+
+ p = p.parent();
+ }
+
+ return "";
+ }
+
+ template <class T> struct equal_to
+ {
+ bool operator()(const T& lhs, const T& rhs) const
+ {
+ return lhs == rhs;
+ }
+ };
+
+ template <class T> struct not_equal_to
+ {
+ bool operator()(const T& lhs, const T& rhs) const
+ {
+ return lhs != rhs;
+ }
+ };
+
+ template <class T> struct greater
+ {
+ bool operator()(const T& lhs, const T& rhs) const
+ {
+ return lhs > rhs;
+ }
+ };
+
+ template <class T> struct less
+ {
+ bool operator()(const T& lhs, const T& rhs) const
+ {
+ return lhs < rhs;
+ }
+ };
+
+ template <class T> struct greater_equal
+ {
+ bool operator()(const T& lhs, const T& rhs) const
+ {
+ return lhs >= rhs;
+ }
+ };
+
+ template <class T> struct less_equal
+ {
+ bool operator()(const T& lhs, const T& rhs) const
+ {
+ return lhs <= rhs;
+ }
+ };
+}
+
+namespace pugi
+{
+ xpath_exception::xpath_exception(const char* message): m_message(message)
+ {
+ }
+
+ const char* xpath_exception::what() const throw()
+ {
+ return m_message;
+ }
+
+ const size_t xpath_memory_block_size = 4096; ///< Memory block size, 4 kb
+
+ class xpath_allocator
+ {
+ struct memory_block
+ {
+ memory_block(): next(0), size(0)
+ {
+ }
+
+ memory_block* next;
+ size_t size;
+
+ char data[xpath_memory_block_size];
+ };
+
+ memory_block* m_root;
+
+ public:
+ xpath_allocator(): m_root(0)
+ {
+ m_root = new memory_block;
+ }
+
+ ~xpath_allocator()
+ {
+ while (m_root)
+ {
+ memory_block* cur = m_root->next;
+ delete m_root;
+ m_root = cur;
+ }
+ }
+
+ void* alloc(size_t size)
+ {
+ if (m_root->size + size <= xpath_memory_block_size)
+ {
+ void* buf = m_root->data + m_root->size;
+ m_root->size += size;
+ return buf;
+ }
+ else
+ {
+ memory_block* block;
+
+ if (size > xpath_memory_block_size)
+ block = static_cast<memory_block*>(operator new(size + sizeof(memory_block) - xpath_memory_block_size));
+ else
+ block = new memory_block;
+
+ block->next = m_root;
+ block->size = size;
+
+ m_root = block;
+
+ return block->data;
+ }
+ }
+ };
+
+ xpath_node::xpath_node()
+ {
+ }
+
+ xpath_node::xpath_node(const xml_node& node): m_node(node)
+ {
+ }
+
+ xpath_node::xpath_node(const xml_attribute& attribute, const xml_node& parent): m_node(parent), m_attribute(attribute)
+ {
+ }
+
+ xml_node xpath_node::node() const
+ {
+ return m_attribute ? xml_node() : m_node;
+ }
+
+ xml_attribute xpath_node::attribute() const
+ {
+ return m_attribute;
+ }
+
+ xml_node xpath_node::parent() const
+ {
+ return m_attribute ? m_node : m_node.parent();
+ }
+
+ xpath_node::operator xpath_node::unspecified_bool_type() const
+ {
+ return (m_node || m_attribute) ? &xpath_node::m_node : 0;
+ }
+
+ bool xpath_node::operator==(const xpath_node& n) const
+ {
+ return m_node == n.m_node && m_attribute == n.m_attribute;
+ }
+
+ bool xpath_node::operator!=(const xpath_node& n) const
+ {
+ return m_node != n.m_node || m_attribute != n.m_attribute;
+ }
+
+ xpath_node_set::xpath_node_set(): m_type(type_unsorted), m_begin(&m_storage), m_end(&m_storage), m_eos(&m_storage + 1), m_using_storage(true)
+ {
+ }
+
+ xpath_node_set::~xpath_node_set()
+ {
+ if (!m_using_storage) delete[] m_begin;
+ }
+
+ xpath_node_set::xpath_node_set(const xpath_node_set& ns): m_type(type_unsorted), m_begin(&m_storage), m_end(&m_storage), m_eos(&m_storage + 1), m_using_storage(true)
+ {
+ *this = ns;
+ }
+
+ xpath_node_set& xpath_node_set::operator=(const xpath_node_set& ns)
+ {
+ if (!m_using_storage) delete[] m_begin;
+
+ m_begin = m_end = m_eos = 0;
+
+ if (ns.size() == 1)
+ {
+ m_storage = *ns.m_begin;
+ m_begin = &m_storage;
+ m_end = m_eos = &m_storage + 1;
+ m_using_storage = true;
+ }
+ else
+ {
+ m_using_storage = false;
+ append(ns.begin(), ns.end());
+ }
+
+ return *this;
+ }
+
+ xpath_node_set::type_t xpath_node_set::type() const
+ {
+ return m_type;
+ }
+
+ size_t xpath_node_set::size() const
+ {
+ return m_end - m_begin;
+ }
+
+ bool xpath_node_set::empty() const
+ {
+ return size() == 0;
+ }
+
+ xpath_node_set::iterator xpath_node_set::mut_begin()
+ {
+ return m_begin;
+ }
+
+ xpath_node_set::const_iterator xpath_node_set::begin() const
+ {
+ return m_begin;
+ }
+
+ xpath_node_set::iterator xpath_node_set::mut_end()
+ {
+ return m_end;
+ }
+
+ xpath_node_set::const_iterator xpath_node_set::end() const
+ {
+ return m_end;
+ }
+
+ void xpath_node_set::sort(bool reverse)
+ {
+ std::sort(m_begin, m_end, document_order_comparator());
+
+ if (reverse)
+ std::reverse(m_begin, m_end);
+
+ m_type = reverse ? type_sorted_reverse : type_sorted;
+ }
+
+ void xpath_node_set::push_back(const xpath_node& n)
+ {
+ if (m_end == m_eos)
+ append(&n, &n + 1);
+ else
+ {
+ *m_end = n;
+ ++m_end;
+ }
+ }
+
+ template <typename Iterator> void xpath_node_set::append(Iterator begin, Iterator end)
+ {
+ size_t count = std::distance(begin, end);
+ size_t size = m_end - m_begin;
+ size_t capacity = m_eos - m_begin;
+
+ if (capacity < size + count)
+ {
+ if (capacity < 2) capacity = 2;
+
+ while (capacity < size + count) capacity += capacity / 2;
+
+ xpath_node* storage = new xpath_node[capacity];
+ std::copy(m_begin, m_end, storage);
+
+ if (!m_using_storage) delete[] m_begin;
+
+ m_using_storage = false;
+
+ m_begin = storage;
+ m_end = storage + size;
+ m_eos = storage + capacity;
+ }
+
+ std::copy(begin, end, m_end);
+ m_end += count;
+ }
+
+ void xpath_node_set::truncate(iterator it)
+ {
+ m_end = it;
+ }
+
+ xpath_node xpath_node_set::first() const
+ {
+ switch (m_type)
+ {
+ case type_sorted: return *m_begin;
+ case type_sorted_reverse: return *(m_end - 1);
+ case type_unsorted: return *std::min_element(begin(), end(), document_order_comparator());
+ default: return xpath_node();
+ }
+ }
+
+ void xpath_node_set::remove_duplicates()
+ {
+ if (m_type == type_unsorted)
+ {
+ std::sort(m_begin, m_end, duplicate_comparator());
+ }
+
+ truncate(std::unique(m_begin, m_end));
+ }
+
+ struct xpath_context
+ {
+ xml_node root;
+ xpath_node n;
+ size_t position, size;
+ };
+
+ enum lexeme_t
+ {
+ lex_none = 0,
+ lex_equal,
+ lex_not_equal,
+ lex_less,
+ lex_greater,
+ lex_less_or_equal,
+ lex_greater_or_equal,
+ lex_plus,
+ lex_minus,
+ lex_multiply,
+ lex_union,
+ lex_var_ref,
+ lex_open_brace,
+ lex_close_brace,
+ lex_quoted_string,
+ lex_number,
+ lex_slash,
+ lex_double_slash,
+ lex_open_square_brace,
+ lex_close_square_brace,
+ lex_string,
+ lex_comma,
+ lex_axis_attribute,
+ lex_dot,
+ lex_double_dot
+ };
+
+ class xpath_lexer
+ {
+ private:
+ const char* m_cur;
+
+ char* m_cur_lexeme_contents;
+ size_t m_clc_size;
+ size_t m_clc_capacity;
+
+ lexeme_t m_cur_lexeme;
+
+ void contents_clear()
+ {
+ m_clc_size = 0;
+ }
+
+ void contents_push(char c)
+ {
+ if (m_clc_size == m_clc_capacity)
+ {
+ if (!m_clc_capacity) m_clc_capacity = 16;
+ else m_clc_capacity *= 2;
+
+ char* s = new char[m_clc_capacity + 1];
+ if (m_cur_lexeme_contents) strcpy(s, m_cur_lexeme_contents);
+
+ delete[] m_cur_lexeme_contents;
+ m_cur_lexeme_contents = s;
+ }
+
+ m_cur_lexeme_contents[m_clc_size++] = c;
+ m_cur_lexeme_contents[m_clc_size] = 0;
+ }
+
+ public:
+ explicit xpath_lexer(const char* query): m_cur(query)
+ {
+ m_clc_capacity = m_clc_size = 0;
+ m_cur_lexeme_contents = 0;
+
+ next();
+ }
+
+ ~xpath_lexer()
+ {
+ delete[] m_cur_lexeme_contents;
+ }
+
+ const char* state() const
+ {
+ return m_cur;
+ }
+
+ void reset(const char* state)
+ {
+ m_cur = state;
+ next();
+ }
+
+ void next()
+ {
+ contents_clear();
+
+ while (is_chartype(*m_cur, ct_space)) ++m_cur;
+
+ switch (*m_cur)
+ {
+ case 0:
+ m_cur_lexeme = lex_none;
+ break;
+
+ case '>':
+ if (*(m_cur+1) == '=')
+ {
+ m_cur += 2;
+ m_cur_lexeme = lex_greater_or_equal;
+ }
+ else
+ {
+ m_cur += 1;
+ m_cur_lexeme = lex_greater;
+ }
+ break;
+
+ case '<':
+ if (*(m_cur+1) == '=')
+ {
+ m_cur += 2;
+ m_cur_lexeme = lex_less_or_equal;
+ }
+ else
+ {
+ m_cur += 1;
+ m_cur_lexeme = lex_less;
+ }
+ break;
+
+ case '!':
+ if (*(m_cur+1) == '=')
+ {
+ m_cur += 2;
+ m_cur_lexeme = lex_not_equal;
+ }
+ else
+ {
+ m_cur_lexeme = lex_none;
+ }
+ break;
+
+ case '=':
+ m_cur += 1;
+ m_cur_lexeme = lex_equal;
+
+ break;
+
+ case '+':
+ m_cur += 1;
+ m_cur_lexeme = lex_plus;
+
+ break;
+
+ case '-':
+ m_cur += 1;
+ m_cur_lexeme = lex_minus;
+
+ break;
+
+ case '*':
+ m_cur += 1;
+ m_cur_lexeme = lex_multiply;
+
+ break;
+
+ case '|':
+ m_cur += 1;
+ m_cur_lexeme = lex_union;
+
+ break;
+
+ case '$':
+ m_cur += 1;
+ m_cur_lexeme = lex_var_ref;
+
+ break;
+
+ case '(':
+ m_cur += 1;
+ m_cur_lexeme = lex_open_brace;
+
+ break;
+
+ case ')':
+ m_cur += 1;
+ m_cur_lexeme = lex_close_brace;
+
+ break;
+
+ case '[':
+ m_cur += 1;
+ m_cur_lexeme = lex_open_square_brace;
+
+ break;
+
+ case ']':
+ m_cur += 1;
+ m_cur_lexeme = lex_close_square_brace;
+
+ break;
+
+ case ',':
+ m_cur += 1;
+ m_cur_lexeme = lex_comma;
+
+ break;
+
+ case '/':
+ if (*(m_cur+1) == '/')
+ {
+ m_cur += 2;
+ m_cur_lexeme = lex_double_slash;
+ }
+ else
+ {
+ m_cur += 1;
+ m_cur_lexeme = lex_slash;
+ }
+ break;
+
+ case '.':
+ if (*(m_cur+1) == '.')
+ {
+ m_cur += 2;
+ m_cur_lexeme = lex_double_dot;
+ }
+ else if (is_chartype(*(m_cur+1), ct_digit))
+ {
+ contents_push('0');
+ contents_push('.');
+
+ ++m_cur;
+
+ while (is_chartype(*m_cur, ct_digit))
+ contents_push(*m_cur++);
+
+ m_cur_lexeme = lex_number;
+ }
+ else
+ {
+ m_cur += 1;
+ m_cur_lexeme = lex_dot;
+ }
+ break;
+
+ case '@':
+ m_cur += 1;
+ m_cur_lexeme = lex_axis_attribute;
+
+ break;
+
+ case '"':
+ case '\'':
+ {
+ char terminator = *m_cur;
+
+ ++m_cur;
+
+ while (*m_cur && *m_cur != terminator)
+ contents_push(*m_cur++);
+
+ if (!*m_cur)
+ m_cur_lexeme = lex_none;
+ else
+ {
+ m_cur += 1;
+ m_cur_lexeme = lex_quoted_string;
+ }
+
+ break;
+ }
+
+ default:
+ if (is_chartype(*m_cur, ct_digit))
+ {
+ while (is_chartype(*m_cur, ct_digit))
+ contents_push(*m_cur++);
+
+ if (*m_cur == '.' && is_chartype(*(m_cur+1), ct_digit))
+ {
+ contents_push(*m_cur++);
+
+ while (is_chartype(*m_cur, ct_digit))
+ contents_push(*m_cur++);
+ }
+
+ m_cur_lexeme = lex_number;
+ }
+ else if (is_chartype(*m_cur, ct_start_symbol))
+ {
+ while (is_chartype(*m_cur, ct_symbol))
+ contents_push(*m_cur++);
+
+ while (is_chartype(*m_cur, ct_space)) ++m_cur;
+
+ m_cur_lexeme = lex_string;
+ }
+ }
+ }
+
+ lexeme_t current() const
+ {
+ return m_cur_lexeme;
+ }
+
+ const char* contents() const
+ {
+ return m_cur_lexeme_contents;
+ }
+ };
+
+ enum ast_type_t
+ {
+ ast_none,
+ ast_op_or, // left or right
+ ast_op_and, // left and right
+ ast_op_equal, // left = right
+ ast_op_not_equal, // left != right
+ ast_op_less, // left < right
+ ast_op_greater, // left > right
+ ast_op_less_or_equal, // left <= right
+ ast_op_greater_or_equal, // left >= right
+ ast_op_add, // left + right
+ ast_op_subtract, // left - right
+ ast_op_multiply, // left * right
+ ast_op_divide, // left / right
+ ast_op_mod, // left % right
+ ast_op_negate, // left - right
+ ast_op_union, // left | right
+ ast_predicate, // apply predicate to set; next points to next predicate
+ ast_filter, // select * from left where right
+ ast_filter_posinv, // select * from left where right; proximity position invariant
+ ast_variable, // variable value
+ ast_string_constant, // string constant
+ ast_number_constant, // number constant
+ ast_func_last, // last()
+ ast_func_position, // position()
+ ast_func_count, // count(left)
+ ast_func_id, // id(left)
+ ast_func_local_name_0, // local-name()
+ ast_func_local_name_1, // local-name(left)
+ ast_func_namespace_uri_0, // namespace-uri()
+ ast_func_namespace_uri_1, // namespace-uri(left)
+ ast_func_name_0, // name()
+ ast_func_name_1, // name(left)
+ ast_func_string_0, // string()
+ ast_func_string_1, // string(left)
+ ast_func_concat, // concat(left, right, siblings)
+ ast_func_starts_with, // starts_with(left, right)
+ ast_func_contains, // contains(left, right)
+ ast_func_substring_before, // substring-before(left, right)
+ ast_func_substring_after, // substring-after(left, right)
+ ast_func_substring_2, // substring(left, right)
+ ast_func_substring_3, // substring(left, right, third)
+ ast_func_string_length_0, // string-length()
+ ast_func_string_length_1, // string-length(left)
+ ast_func_normalize_space_0, // normalize-space()
+ ast_func_normalize_space_1, // normalize-space(left)
+ ast_func_translate, // translate(left, right, third)
+ ast_func_boolean, // boolean(left)
+ ast_func_not, // not(left)
+ ast_func_true, // true()
+ ast_func_false, // false()
+ ast_func_lang, // lang(left)
+ ast_func_number_0, // number()
+ ast_func_number_1, // number(left)
+ ast_func_sum, // sum(left)
+ ast_func_floor, // floor(left)
+ ast_func_ceiling, // ceiling(left)
+ ast_func_round, // round(left)
+ ast_step, // process set left with step
+ ast_step_root // select root node
+ };
+
+ enum ast_rettype_t
+ {
+ ast_type_none,
+ ast_type_node_set,
+ ast_type_number,
+ ast_type_string,
+ ast_type_boolean
+ };
+
+ enum axis_t
+ {
+ axis_ancestor,
+ axis_ancestor_or_self,
+ axis_attribute,
+ axis_child,
+ axis_descendant,
+ axis_descendant_or_self,
+ axis_following,
+ axis_following_sibling,
+ axis_namespace,
+ axis_parent,
+ axis_preceding,
+ axis_preceding_sibling,
+ axis_self
+ };
+
+ enum nodetest_t
+ {
+ nodetest_name,
+ nodetest_type_node,
+ nodetest_type_comment,
+ nodetest_type_pi,
+ nodetest_type_text,
+ nodetest_pi,
+ nodetest_all,
+ nodetest_all_in_namespace
+ };
+
+ class xpath_ast_node
+ {
+ private:
+ ast_type_t m_type;
+
+ ast_rettype_t m_rettype;
+
+ // tree node structure
+ xpath_ast_node* m_left;
+ xpath_ast_node* m_right;
+ xpath_ast_node* m_third;
+ xpath_ast_node* m_next;
+
+ // variable name for ast_variable
+ // string value for ast_constant
+ // node test for ast_step (node name/namespace/node type/pi target)
+ const char* m_contents;
+
+ // for t_step / t_predicate
+ axis_t m_axis;
+ nodetest_t m_test;
+
+ xpath_ast_node(const xpath_ast_node&);
+ xpath_ast_node& operator=(const xpath_ast_node&);
+
+ template <class Cbool, class Cdouble, class Cstring> bool compare_eq(xpath_ast_node* lhs, xpath_ast_node* rhs, xpath_context& c)
+ {
+ if (lhs->rettype() != ast_type_node_set && rhs->rettype() != ast_type_node_set)
+ {
+ if (lhs->rettype() == ast_type_boolean || rhs->rettype() == ast_type_boolean)
+ return Cbool()(lhs->eval_boolean(c), rhs->eval_boolean(c));
+ else if (lhs->rettype() == ast_type_number || rhs->rettype() == ast_type_number)
+ return Cdouble()(lhs->eval_number(c), rhs->eval_number(c));
+ else if (lhs->rettype() == ast_type_string || rhs->rettype() == ast_type_string)
+ return Cstring()(lhs->eval_string(c), rhs->eval_string(c));
+ else
+ {
+ assert(!"Wrong types");
+ return false;
+ }
+ }
+ else if (lhs->rettype() == ast_type_node_set && rhs->rettype() == ast_type_node_set)
+ {
+ xpath_node_set ls = lhs->eval_node_set(c);
+ xpath_node_set rs = rhs->eval_node_set(c);
+
+ for (xpath_node_set::const_iterator li = ls.begin(); li != ls.end(); ++li)
+ for (xpath_node_set::const_iterator ri = rs.begin(); ri != rs.end(); ++ri)
+ {
+ if (Cstring()(string_value(*li), string_value(*ri)))
+ return true;
+ }
+
+ return false;
+ }
+ else if (lhs->rettype() != ast_type_node_set && rhs->rettype() == ast_type_node_set)
+ {
+ if (lhs->rettype() == ast_type_boolean)
+ return Cbool()(lhs->eval_boolean(c), rhs->eval_boolean(c));
+ else if (lhs->rettype() == ast_type_number)
+ {
+ double l = lhs->eval_number(c);
+ xpath_node_set rs = rhs->eval_node_set(c);
+
+ for (xpath_node_set::const_iterator ri = rs.begin(); ri != rs.end(); ++ri)
+ {
+ if (Cdouble()(l, convert_string_to_number(string_value(*ri).c_str())) == true)
+ return true;
+ }
+
+ return false;
+ }
+ else if (lhs->rettype() == ast_type_string)
+ {
+ std::string l = lhs->eval_string(c);
+ xpath_node_set rs = rhs->eval_node_set(c);
+
+ for (xpath_node_set::const_iterator ri = rs.begin(); ri != rs.end(); ++ri)
+ {
+ if (Cstring()(l, string_value(*ri)) == true)
+ return true;
+ }
+
+ return false;
+ }
+ else
+ {
+ assert(!"Wrong types");
+ return false;
+ }
+ }
+ else if (lhs->rettype() == ast_type_node_set && rhs->rettype() != ast_type_node_set)
+ {
+ if (rhs->rettype() == ast_type_boolean)
+ return Cbool()(lhs->eval_boolean(c), rhs->eval_boolean(c));
+ else if (rhs->rettype() == ast_type_number)
+ {
+ xpath_node_set ls = lhs->eval_node_set(c);
+ double r = rhs->eval_number(c);
+
+ for (xpath_node_set::const_iterator li = ls.begin(); li != ls.end(); ++li)
+ {
+ if (Cdouble()(convert_string_to_number(string_value(*li).c_str()), r) == true)
+ return true;
+ }
+
+ return false;
+ }
+ else if (rhs->rettype() == ast_type_string)
+ {
+ xpath_node_set ls = lhs->eval_node_set(c);
+ std::string r = rhs->eval_string(c);
+
+ for (xpath_node_set::const_iterator li = ls.begin(); li != ls.end(); ++li)
+ {
+ if (Cstring()(string_value(*li), r) == true)
+ return true;
+ }
+
+ return false;
+ }
+ else
+ {
+ assert(!"Wrong types");
+ return false;
+ }
+ }
+ else
+ {
+ assert(!"Wrong types");
+ return false;
+ }
+ }
+
+ template <class Cdouble> bool compare_rel(xpath_ast_node* lhs, xpath_ast_node* rhs, xpath_context& c)
+ {
+ if (lhs->rettype() != ast_type_node_set && rhs->rettype() != ast_type_node_set)
+ return Cdouble()(lhs->eval_number(c), rhs->eval_number(c));
+ else if (lhs->rettype() == ast_type_node_set && rhs->rettype() == ast_type_node_set)
+ {
+ xpath_node_set ls = lhs->eval_node_set(c);
+ xpath_node_set rs = rhs->eval_node_set(c);
+
+ for (xpath_node_set::const_iterator li = ls.begin(); li != ls.end(); ++li)
+ {
+ double l = convert_string_to_number(string_value(*li).c_str());
+
+ for (xpath_node_set::const_iterator ri = rs.begin(); ri != rs.end(); ++ri)
+ {
+ if (Cdouble()(l, convert_string_to_number(string_value(*ri).c_str())) == true)
+ return true;
+ }
+ }
+
+ return false;
+ }
+ else if (lhs->rettype() != ast_type_node_set && rhs->rettype() == ast_type_node_set)
+ {
+ double l = lhs->eval_number(c);
+ xpath_node_set rs = rhs->eval_node_set(c);
+
+ for (xpath_node_set::const_iterator ri = rs.begin(); ri != rs.end(); ++ri)
+ {
+ if (Cdouble()(l, convert_string_to_number(string_value(*ri).c_str())) == true)
+ return true;
+ }
+
+ return false;
+ }
+ else if (lhs->rettype() == ast_type_node_set && rhs->rettype() != ast_type_node_set)
+ {
+ xpath_node_set ls = lhs->eval_node_set(c);
+ double r = rhs->eval_number(c);
+
+ for (xpath_node_set::const_iterator li = ls.begin(); li != ls.end(); ++li)
+ {
+ if (Cdouble()(convert_string_to_number(string_value(*li).c_str()), r) == true)
+ return true;
+ }
+
+ return false;
+ }
+ else
+ {
+ assert(!"Wrong types");
+ return false;
+ }
+ }
+
+ void apply_predicate(xpath_node_set& ns, size_t first, xpath_ast_node* expr, const xpath_context& context)
+ {
+ xpath_context c;
+ c.root = context.root;
+
+ size_t i = 0;
+ size_t size = ns.size() - first;
+
+ xpath_node_set::iterator last = ns.mut_begin() + first;
+
+ // remove_if... or well, sort of
+ for (xpath_node_set::iterator it = last; it != ns.end(); ++it, ++i)
+ {
+ c.n = *it;
+ c.position = i + 1;
+ c.size = size;
+
+ if (expr->rettype() == ast_type_number)
+ {
+ if (expr->eval_number(c) == i + 1)
+ *last++ = *it;
+ }
+ else if (expr->eval_boolean(c))
+ *last++ = *it;
+ }
+
+ ns.truncate(last);
+ }
+
+ void apply_predicates(xpath_node_set& ns, size_t first, const xpath_context& context)
+ {
+ if (ns.size() <= first) return;
+
+ for (xpath_ast_node* pred = m_right; pred; pred = pred->m_next)
+ {
+ apply_predicate(ns, first, pred->m_left, context);
+ }
+ }
+
+ void step_push(xpath_node_set& ns, const xml_attribute& a, const xml_node& parent)
+ {
+ // There are no attribute nodes corresponding to attributes that declare namespaces
+ // That is, "xmlns:..." or "xmlns"
+ if (!strncmp(a.name(), "xmlns", 5) && (a.name()[5] == 0 || a.name()[5] == ':')) return;
+
+ switch (m_test)
+ {
+ case nodetest_name:
+ if (!strcmp(a.name(), m_contents)) ns.push_back(xpath_node(a, parent));
+ break;
+
+ case nodetest_type_node:
+ case nodetest_all:
+ ns.push_back(xpath_node(a, parent));
+ break;
+
+ case nodetest_all_in_namespace:
+ if (!strncmp(a.name(), m_contents, strlen(m_contents)) && a.name()[strlen(m_contents)] == ':')
+ ns.push_back(xpath_node(a, parent));
+ break;
+
+ default:
+ ;
+ }
+ }
+
+ void step_push(xpath_node_set& ns, const xml_node& n)
+ {
+ switch (m_test)
+ {
+ case nodetest_name:
+ if (n.type() == node_element && !strcmp(n.name(), m_contents)) ns.push_back(n);
+ break;
+
+ case nodetest_type_node:
+ ns.push_back(n);
+ break;
+
+ case nodetest_type_comment:
+ if (n.type() == node_comment)
+ ns.push_back(n);
+ break;
+
+ case nodetest_type_text:
+ if (n.type() == node_pcdata || n.type() == node_cdata)
+ ns.push_back(n);
+ break;
+
+ case nodetest_type_pi:
+ if (n.type() == node_pi)
+ ns.push_back(n);
+ break;
+
+ case nodetest_pi:
+ if (n.type() == node_pi && !strcmp(n.name(), m_contents))
+ ns.push_back(n);
+ break;
+
+ case nodetest_all:
+ if (n.type() == node_element)
+ ns.push_back(n);
+ break;
+
+ case nodetest_all_in_namespace:
+ if (n.type() == node_element && !strncmp(n.name(), m_contents, strlen(m_contents)) &&
+ n.name()[strlen(m_contents)] == ':')
+ ns.push_back(n);
+ break;
+ }
+ }
+
+ template <axis_t axis> void step_fill(xpath_node_set& ns, const xml_node& n)
+ {
+ switch (axis)
+ {
+ case axis_attribute:
+ ns.m_type = ns.empty() ? xpath_node_set::type_sorted : xpath_node_set::type_unsorted;
+
+ for (xml_attribute a = n.first_attribute(); a; a = a.next_attribute())
+ step_push(ns, a, n);
+
+ break;
+
+ case axis_child:
+ ns.m_type = ns.empty() ? xpath_node_set::type_sorted : xpath_node_set::type_unsorted;
+
+ for (xml_node c = n.first_child(); c; c = c.next_sibling())
+ step_push(ns, c);
+
+ break;
+
+ case axis_descendant:
+ case axis_descendant_or_self:
+ {
+ ns.m_type = ns.empty() ? xpath_node_set::type_sorted : xpath_node_set::type_unsorted;
+
+ if (axis == axis_descendant_or_self)
+ step_push(ns, n);
+
+ xml_node cur = n.first_child();
+
+ if (cur)
+ {
+ do
+ {
+ step_push(ns, cur);
+
+ if (cur.first_child())
+ cur = cur.first_child();
+ else if (cur.next_sibling())
+ cur = cur.next_sibling();
+ else
+ {
+ // Borland C++ workaround
+ while (!cur.next_sibling() && cur != n && (bool)cur.parent())
+ cur = cur.parent();
+
+ if (cur != n)
+ cur = cur.next_sibling();
+ }
+ }
+ while (cur && cur != n);
+ }
+
+ break;
+ }
+
+ case axis_following_sibling:
+ ns.m_type = ns.empty() ? xpath_node_set::type_sorted : xpath_node_set::type_unsorted;
+
+ for (xml_node c = n.next_sibling(); c; c = c.next_sibling())
+ step_push(ns, c);
+
+ break;
+
+ case axis_preceding_sibling:
+ ns.m_type = ns.empty() ? xpath_node_set::type_sorted_reverse : xpath_node_set::type_unsorted;
+
+ for (xml_node c = n.previous_sibling(); c; c = c.previous_sibling())
+ step_push(ns, c);
+
+ break;
+
+ case axis_following:
+ {
+ ns.m_type = ns.empty() ? xpath_node_set::type_sorted : xpath_node_set::type_unsorted;
+
+ xml_node cur = n;
+
+ for (;;)
+ {
+ if (cur.first_child())
+ cur = cur.first_child();
+ else if (cur.next_sibling())
+ cur = cur.next_sibling();
+ else
+ {
+ while (cur && !cur.next_sibling()) cur = cur.parent();
+ cur = cur.next_sibling();
+
+ if (!cur) break;
+ }
+
+ step_push(ns, cur);
+ }
+
+ break;
+ }
+
+ case axis_preceding:
+ {
+ ns.m_type = ns.empty() ? xpath_node_set::type_sorted_reverse : xpath_node_set::type_unsorted;
+
+ xml_node cur = n;
+
+ while (cur && !cur.previous_sibling()) cur = cur.parent();
+ cur = cur.previous_sibling();
+
+ if (cur)
+ {
+ for (;;)
+ {
+ if (cur.last_child())
+ cur = cur.last_child();
+ else
+ {
+ // leaf node
+ step_push(ns, cur);
+
+ if (cur.previous_sibling())
+ cur = cur.previous_sibling();
+ else
+ {
+ do
+ {
+ cur = cur.parent();
+ if (!cur) break;
+
+ step_push(ns, cur);
+ }
+ while (!cur.previous_sibling());
+
+ cur = cur.previous_sibling();
+
+ if (!cur) break;
+ }
+ }
+ }
+ }
+
+ break;
+ }
+
+ case axis_ancestor:
+ case axis_ancestor_or_self:
+ {
+ ns.m_type = ns.empty() ? xpath_node_set::type_sorted_reverse : xpath_node_set::type_unsorted;
+
+ if (axis == axis_ancestor_or_self)
+ step_push(ns, n);
+
+ xml_node cur = n.parent();
+
+ while (cur)
+ {
+ step_push(ns, cur);
+
+ cur = cur.parent();
+ }
+
+ break;
+ }
+
+ default:
+ assert(!"Unimplemented axis");
+ }
+ }
+
+ template <axis_t axis> void step_fill(xpath_node_set& ns, const xml_attribute& a, const xml_node& p)
+ {
+ switch (axis)
+ {
+ case axis_ancestor:
+ case axis_ancestor_or_self:
+ {
+ ns.m_type = ns.empty() ? xpath_node_set::type_sorted_reverse : xpath_node_set::type_unsorted;
+
+ if (axis == axis_ancestor_or_self)
+ step_push(ns, a, p);
+
+ xml_node cur = p;
+
+ while (cur)
+ {
+ step_push(ns, cur);
+
+ cur = cur.parent();
+ }
+
+ break;
+ }
+
+ default:
+ assert(!"Unimplemented axis");
+ }
+ }
+
+ template <axis_t axis> void step_do(xpath_node_set& ns, xpath_context& c)
+ {
+ switch (axis)
+ {
+ case axis_parent:
+ if (m_left)
+ {
+ xpath_node_set s = m_left->eval_node_set(c);
+
+ for (xpath_node_set::const_iterator it = s.begin(); it != s.end(); ++it)
+ {
+ xml_node p = it->parent();
+ if (p)
+ {
+ size_t s = ns.size();
+
+ step_push(ns, p);
+
+ apply_predicates(ns, s, c);
+ }
+ }
+ }
+ else
+ {
+ xml_node p = c.n.parent();
+ if (p)
+ {
+ step_push(ns, p);
+
+ apply_predicates(ns, 0, c);
+ }
+ }
+
+ break;
+
+ case axis_self:
+ if (m_left)
+ {
+ xpath_node_set s = m_left->eval_node_set(c);
+
+ for (xpath_node_set::const_iterator it = s.begin(); it != s.end(); ++it)
+ {
+ size_t s = ns.size();
+
+ if (it->attribute()) step_push(ns, it->attribute(), it->parent());
+ else step_push(ns, it->node());
+
+ apply_predicates(ns, s, c);
+ }
+ }
+ else
+ {
+ if (c.n.node()) step_push(ns, c.n.node());
+ else step_push(ns, c.n.attribute(), c.n.parent());
+
+ apply_predicates(ns, 0, c);
+ }
+
+ break;
+
+ case axis_namespace:
+ break;
+
+ case axis_ancestor:
+ case axis_ancestor_or_self:
+ if (m_left)
+ {
+ xpath_node_set s = m_left->eval_node_set(c);
+
+ for (xpath_node_set::const_iterator it = s.begin(); it != s.end(); ++it)
+ {
+ size_t s = ns.size();
+
+ if (it->node())
+ step_fill<axis>(ns, it->node());
+ else
+ step_fill<axis>(ns, it->attribute(), it->parent());
+
+ apply_predicates(ns, s, c);
+ }
+ }
+ else
+ {
+ if (c.n.node()) step_fill<axis>(ns, c.n.node());
+ else step_fill<axis>(ns, c.n.attribute(), c.n.parent());
+
+ apply_predicates(ns, 0, c);
+ }
+
+ break;
+
+ case axis_following:
+ case axis_following_sibling:
+ case axis_preceding:
+ case axis_preceding_sibling:
+ case axis_attribute:
+ case axis_child:
+ case axis_descendant:
+ case axis_descendant_or_self:
+ if (m_left)
+ {
+ xpath_node_set s = m_left->eval_node_set(c);
+
+ for (xpath_node_set::const_iterator it = s.begin(); it != s.end(); ++it)
+ {
+ size_t s = ns.size();
+
+ if (it->node())
+ step_fill<axis>(ns, it->node());
+
+ apply_predicates(ns, s, c);
+ }
+ }
+ else if (c.n.node())
+ {
+ step_fill<axis>(ns, c.n.node());
+
+ apply_predicates(ns, 0, c);
+ }
+
+ break;
+
+ default:
+ assert(!"Unimplemented axis");
+ }
+ }
+
+ void set_contents(const char* value, xpath_allocator& a)
+ {
+ if (value)
+ {
+ char* c = static_cast<char*>(a.alloc(strlen(value) + 1));
+ strcpy(c, value);
+ m_contents = c;
+ }
+ else m_contents = 0;
+ }
+ public:
+ xpath_ast_node(ast_type_t type, const char* contents, xpath_allocator& a): m_type(type), m_rettype(ast_type_none), m_contents(0)
+ {
+ set_contents(contents, a);
+ }
+
+ xpath_ast_node(ast_type_t type, xpath_ast_node* left, xpath_ast_node* right, axis_t axis): m_type(type),
+ m_rettype(ast_type_none), m_left(left), m_right(right), m_third(0), m_next(0), m_contents(0),
+ m_axis(axis)
+ {
+ }
+
+ xpath_ast_node(ast_type_t type, xpath_ast_node* left = 0, xpath_ast_node* right = 0, xpath_ast_node* third = 0): m_type(type),
+ m_rettype(ast_type_none), m_left(left), m_right(right), m_third(third), m_next(0), m_contents(0)
+ {
+ }
+
+ xpath_ast_node(ast_type_t type, xpath_ast_node* left, axis_t axis, nodetest_t test, const char* contents, xpath_allocator& a):
+ m_type(type), m_rettype(ast_type_none), m_left(left), m_right(0), m_third(0), m_next(0),
+ m_contents(0), m_axis(axis), m_test(test)
+ {
+ set_contents(contents, a);
+ }
+
+ void set_next(xpath_ast_node* value)
+ {
+ m_next = value;
+ }
+
+ void set_right(xpath_ast_node* value)
+ {
+ m_right = value;
+ }
+
+ bool eval_boolean(xpath_context& c)
+ {
+ switch (m_type)
+ {
+ case ast_op_or:
+ if (m_left->eval_boolean(c)) return true;
+ else return m_right->eval_boolean(c);
+
+ case ast_op_and:
+ if (!m_left->eval_boolean(c)) return false;
+ else return m_right->eval_boolean(c);
+
+ case ast_op_equal:
+ return compare_eq<equal_to<bool>, equal_to<double>, equal_to<std::string> >(m_left, m_right, c);
+
+ case ast_op_not_equal:
+ return compare_eq<not_equal_to<bool>, not_equal_to<double>, not_equal_to<std::string> >(m_left, m_right, c);
+
+ case ast_op_less:
+ return compare_rel<less<double> >(m_left, m_right, c);
+
+ case ast_op_greater:
+ return compare_rel<greater<double> >(m_left, m_right, c);
+
+ case ast_op_less_or_equal:
+ return compare_rel<less_equal<double> >(m_left, m_right, c);
+
+ case ast_op_greater_or_equal:
+ return compare_rel<greater_equal<double> >(m_left, m_right, c);
+
+ case ast_func_starts_with:
+ return starts_with(m_left->eval_string(c), m_right->eval_string(c).c_str());
+
+ case ast_func_contains:
+ return m_left->eval_string(c).find(m_right->eval_string(c)) != std::string::npos;
+
+ case ast_func_boolean:
+ return m_left->eval_boolean(c);
+
+ case ast_func_not:
+ return !m_left->eval_boolean(c);
+
+ case ast_func_true:
+ return true;
+
+ case ast_func_false:
+ return false;
+
+ case ast_func_lang:
+ {
+ if (c.n.attribute()) return false;
+
+ std::string lang = m_left->eval_string(c);
+
+ xml_node n = c.n.node();
+
+ while (n.type() != node_document)
+ {
+ xml_attribute a = n.attribute("xml:lang");
+
+ if (a)
+ {
+ const char* value = a.value();
+
+ // strnicmp / strncasecmp is not portable
+ for (std::string::iterator it = lang.begin(); it != lang.end(); ++it)
+ {
+ if (tolower(*it) != tolower(*value)) return false;
+ ++value;
+ }
+
+ return *value == 0 || *value == '-';
+ }
+ }
+
+ return false;
+ }
+
+ default:
+ {
+ switch (m_rettype)
+ {
+ case ast_type_number:
+ return convert_number_to_boolean(eval_number(c));
+
+ case ast_type_string:
+ return !eval_string(c).empty();
+
+ case ast_type_node_set:
+ return !eval_node_set(c).empty();
+
+ default:
+ assert(!"Wrong expression for ret type boolean");
+ return false;
+ }
+ }
+ }
+ }
+
+ double eval_number(xpath_context& c)
+ {
+ switch (m_type)
+ {
+ case ast_op_add:
+ return m_left->eval_number(c) + m_right->eval_number(c);
+
+ case ast_op_subtract:
+ return m_left->eval_number(c) - m_right->eval_number(c);
+
+ case ast_op_multiply:
+ return m_left->eval_number(c) * m_right->eval_number(c);
+
+ case ast_op_divide:
+ return m_left->eval_number(c) / m_right->eval_number(c);
+
+ case ast_op_mod:
+ return fmod(m_left->eval_number(c), m_right->eval_number(c));
+
+ case ast_op_negate:
+ return -m_left->eval_number(c);
+
+ case ast_number_constant:
+ return convert_string_to_number(m_contents);
+
+ case ast_func_last:
+ return (double)c.size;
+
+ case ast_func_position:
+ return (double)c.position;
+
+ case ast_func_count:
+ return (double)m_left->eval_node_set(c).size();
+
+ case ast_func_string_length_0:
+ return (double)string_value(c.n).size();
+
+ case ast_func_string_length_1:
+ return (double)m_left->eval_string(c).size();
+
+ case ast_func_number_0:
+ return convert_string_to_number(string_value(c.n).c_str());
+
+ case ast_func_number_1:
+ return m_left->eval_number(c);
+
+ case ast_func_sum:
+ {
+ double r = 0;
+
+ xpath_node_set ns = m_left->eval_node_set(c);
+
+ for (xpath_node_set::const_iterator it = ns.begin(); it != ns.end(); ++it)
+ r += convert_string_to_number(string_value(*it).c_str());
+
+ return r;
+ }
+
+ case ast_func_floor:
+ {
+ double r = m_left->eval_number(c);
+
+ return r == r ? floor(r) : r;
+ }
+
+ case ast_func_ceiling:
+ {
+ double r = m_left->eval_number(c);
+
+ return r == r ? ceil(r) : r;
+ }
+
+ case ast_func_round:
+ // correct except for negative zero (it returns positive zero instead of negative)
+ return ieee754_round(m_left->eval_number(c));
+
+ default:
+ {
+ switch (m_rettype)
+ {
+ case ast_type_boolean:
+ return eval_boolean(c) ? 1 : 0;
+
+ case ast_type_string:
+ return convert_string_to_number(eval_string(c).c_str());
+
+ case ast_type_node_set:
+ return convert_string_to_number(eval_string(c).c_str());
+
+ default:
+ assert(!"Wrong expression for ret type number");
+ return 0;
+ }
+
+ }
+ }
+ }
+
+ std::string eval_string(xpath_context& c)
+ {
+ switch (m_type)
+ {
+ case ast_string_constant:
+ return m_contents;
+
+ case ast_func_local_name_0:
+ {
+ xpath_node na = c.n;
+
+ if (na.attribute()) return local_name(na.attribute().name());
+ else return local_name(na.node().name());
+ }
+
+ case ast_func_local_name_1:
+ {
+ xpath_node_set ns = m_left->eval_node_set(c);
+ if (ns.empty()) return "";
+
+ xpath_node na = ns.first();
+
+ if (na.attribute()) return local_name(na.attribute().name());
+ else return local_name(na.node().name());
+ }
+
+ case ast_func_name_0:
+ {
+ xpath_node na = c.n;
+
+ if (na.attribute()) return na.attribute().name();
+ else return na.node().name();
+ }
+
+ case ast_func_name_1:
+ {
+ xpath_node_set ns = m_left->eval_node_set(c);
+ if (ns.empty()) return "";
+
+ xpath_node na = ns.first();
+
+ if (na.attribute()) return na.attribute().name();
+ else return na.node().name();
+ }
+
+ case ast_func_namespace_uri_0:
+ {
+ xpath_node na = c.n;
+
+ if (na.attribute()) return namespace_uri(na.attribute(), na.parent());
+ else return namespace_uri(na.node());
+ }
+
+ case ast_func_namespace_uri_1:
+ {
+ xpath_node_set ns = m_left->eval_node_set(c);
+ if (ns.empty()) return "";
+
+ xpath_node na = ns.first();
+
+ if (na.attribute()) return namespace_uri(na.attribute(), na.parent());
+ else return namespace_uri(na.node());
+ }
+
+ case ast_func_string_0:
+ return string_value(c.n);
+
+ case ast_func_string_1:
+ return m_left->eval_string(c);
+
+ case ast_func_concat:
+ {
+ std::string r = m_left->eval_string(c);
+
+ for (xpath_ast_node* n = m_right; n; n = n->m_next)
+ r += n->eval_string(c);
+
+ return r;
+ }
+
+ case ast_func_substring_before:
+ {
+ std::string s = m_left->eval_string(c);
+ std::string::size_type pos = s.find(m_right->eval_string(c));
+
+ if (pos == std::string::npos) return "";
+ else return std::string(s.begin(), s.begin() + pos);
+ }
+
+ case ast_func_substring_after:
+ {
+ std::string s = m_left->eval_string(c);
+ std::string p = m_right->eval_string(c);
+
+ std::string::size_type pos = s.find(p);
+
+ if (pos == std::string::npos) return "";
+ else return std::string(s.begin() + pos + p.length(), s.end());
+ }
+
+ case ast_func_substring_2:
+ {
+ std::string s = m_left->eval_string(c);
+ double first = ieee754_round(m_right->eval_number(c));
+
+ if (first != first) return ""; // NaN
+ else if (first >= s.length() + 1) return "";
+
+ size_t pos = first < 1 ? 1 : (size_t)first;
+
+ return s.substr(pos - 1);
+ }
+
+ case ast_func_substring_3:
+ {
+ std::string s = m_left->eval_string(c);
+ double first = ieee754_round(m_right->eval_number(c));
+ double last = first + ieee754_round(m_third->eval_number(c));
+
+ if (first != first || last != last) return "";
+ else if (first >= s.length() + 1) return "";
+ else if (first >= last) return "";
+
+ size_t pos = first < 1 ? 1 : (size_t)first;
+ size_t end = last >= s.length() + 1 ? s.length() + 1 : (size_t)last;
+
+ return s.substr(pos - 1, std::min(end - pos, s.length() - pos + 1));
+ }
+
+ case ast_func_normalize_space_0:
+ case ast_func_normalize_space_1:
+ {
+ std::string s = m_type == ast_func_normalize_space_0 ? string_value(c.n) : m_left->eval_string(c);
+
+ std::string r;
+ r.reserve(s.size());
+
+ for (std::string::const_iterator it = s.begin(); it != s.end(); ++it)
+ {
+ if (is_chartype(*it, ct_space))
+ {
+ if (!r.empty() && r[r.size() - 1] != ' ')
+ r += ' ';
+ }
+ else r += *it;
+ }
+
+ std::string::size_type pos = r.find_last_not_of(' ');
+ if (pos == std::string::npos) r = "";
+ else r.erase(r.begin() + pos + 1, r.end());
+
+ return r;
+ }
+
+ case ast_func_translate:
+ {
+ std::string s = m_left->eval_string(c);
+ std::string from = m_right->eval_string(c);
+ std::string to = m_third->eval_string(c);
+
+ for (std::string::iterator it = s.begin(); it != s.end(); )
+ {
+ std::string::size_type pos = from.find(*it);
+
+ if (pos != std::string::npos && pos >= to.length())
+ it = s.erase(it);
+ else if (pos != std::string::npos)
+ *it = to[pos];
+ }
+
+ return s;
+ }
+
+ default:
+ {
+ switch (m_rettype)
+ {
+ case ast_type_boolean:
+ return eval_boolean(c) ? "true" : "false";
+
+ case ast_type_number:
+ return convert_number_to_string(eval_number(c));
+
+ case ast_type_node_set:
+ {
+ xpath_node_set ns = eval_node_set(c);
+ return ns.empty() ? std::string("") : string_value(ns.first());
+ }
+
+ default:
+ assert(!"Wrong expression for ret type string");
+ return "";
+ }
+ }
+ }
+ }
+
+ xpath_node_set eval_node_set(xpath_context& c)
+ {
+ switch (m_type)
+ {
+ case ast_op_union:
+ {
+ xpath_node_set ls = m_left->eval_node_set(c);
+ xpath_node_set rs = m_right->eval_node_set(c);
+
+ ls.append(rs.begin(), rs.end());
+
+ ls.remove_duplicates();
+
+ return ls;
+ }
+
+ case ast_filter:
+ {
+ xpath_node_set set = m_left->eval_node_set(c);
+ set.sort();
+
+ xpath_context oc = c;
+
+ size_t i = 0;
+
+ xpath_node_set::iterator last = set.mut_begin();
+
+ // remove_if... or well, sort of
+ for (xpath_node_set::const_iterator it = set.begin(); it != set.end(); ++it, ++i)
+ {
+ c.n = *it;
+ c.position = i + 1;
+ c.size = set.size();
+
+ if (m_right->rettype() == ast_type_number)
+ {
+ if (m_right->eval_number(c) == i + 1)
+ *last++ = *it;
+ }
+ else if (m_right->eval_boolean(c))
+ *last++ = *it;
+ }
+
+ c = oc;
+
+ set.truncate(last);
+
+ return set;
+ }
+
+ case ast_filter_posinv:
+ {
+ xpath_node_set set = m_left->eval_node_set(c);
+
+ xpath_context oc = c;
+
+ size_t i = 0;
+
+ xpath_node_set::iterator last = set.mut_begin();
+
+ // remove_if... or well, sort of
+ for (xpath_node_set::const_iterator it = set.begin(); it != set.end(); ++it, ++i)
+ {
+ c.n = *it;
+ c.position = i + 1;
+ c.size = set.size();
+
+ if (m_right->eval_boolean(c))
+ *last++ = *it;
+ }
+
+ c = oc;
+
+ set.truncate(last);
+
+ return set;
+ }
+
+ case ast_func_id:
+ return xpath_node_set();
+
+ case ast_step:
+ {
+ xpath_node_set ns;
+
+ switch (m_axis)
+ {
+ case axis_ancestor:
+ step_do<axis_ancestor>(ns, c);
+ break;
+
+ case axis_ancestor_or_self:
+ step_do<axis_ancestor_or_self>(ns, c);
+ break;
+
+ case axis_attribute:
+ step_do<axis_attribute>(ns, c);
+ break;
+
+ case axis_child:
+ step_do<axis_child>(ns, c);
+ break;
+
+ case axis_descendant:
+ step_do<axis_descendant>(ns, c);
+ break;
+
+ case axis_descendant_or_self:
+ step_do<axis_descendant_or_self>(ns, c);
+ break;
+
+ case axis_following:
+ step_do<axis_following>(ns, c);
+ break;
+
+ case axis_following_sibling:
+ step_do<axis_following_sibling>(ns, c);
+ break;
+
+ case axis_namespace:
+ step_do<axis_namespace>(ns, c);
+ break;
+
+ case axis_parent:
+ step_do<axis_parent>(ns, c);
+ break;
+
+ case axis_preceding:
+ step_do<axis_preceding>(ns, c);
+ break;
+
+ case axis_preceding_sibling:
+ step_do<axis_preceding_sibling>(ns, c);
+ break;
+
+ case axis_self:
+ step_do<axis_self>(ns, c);
+ break;
+
+ default:
+ assert(!"Axis not implemented");
+ return xpath_node_set();
+ }
+
+ ns.remove_duplicates();
+
+ return ns;
+ }
+
+ case ast_step_root:
+ {
+ xpath_node_set ns;
+
+ ns.push_back(c.root);
+
+ apply_predicates(ns, 0, c);
+
+ return ns;
+ }
+
+ default:
+ assert(!"Wrong expression for ret type node set");
+ return xpath_node_set();
+ }
+ }
+
+ bool contains(ast_type_t type)
+ {
+ if (m_type == type) return true;
+
+ switch (m_type)
+ {
+ case ast_op_or:
+ case ast_op_and:
+ case ast_op_equal:
+ case ast_op_not_equal:
+ case ast_op_less:
+ case ast_op_greater:
+ case ast_op_less_or_equal:
+ case ast_op_greater_or_equal:
+ case ast_op_add:
+ case ast_op_subtract:
+ case ast_op_multiply:
+ case ast_op_divide:
+ case ast_op_mod:
+ case ast_op_negate:
+ return m_left->contains(type) || m_right->contains(type);
+
+ case ast_op_union:
+ case ast_predicate:
+ case ast_filter:
+ case ast_filter_posinv:
+ return false;
+
+ case ast_variable:
+ throw xpath_exception("Semantics error: variables are not supported");
+
+ case ast_string_constant:
+ case ast_number_constant:
+ case ast_func_last:
+ case ast_func_position:
+ return false;
+
+ case ast_func_count:
+ case ast_func_id:
+ case ast_func_local_name_0:
+ case ast_func_local_name_1:
+ case ast_func_namespace_uri_0:
+ case ast_func_namespace_uri_1:
+ case ast_func_name_0:
+ case ast_func_name_1:
+ case ast_func_string_0:
+ case ast_func_string_1:
+ if (m_left) return m_left->contains(type);
+ return false;
+
+ case ast_func_concat:
+ if (m_left->contains(type)) return true;
+
+ for (xpath_ast_node* n = m_right; n; n = n->m_next)
+ if (n->contains(type)) return true;
+
+ return false;
+
+ case ast_func_starts_with:
+ case ast_func_contains:
+ case ast_func_substring_before:
+ case ast_func_substring_after:
+ case ast_func_substring_2:
+ case ast_func_substring_3:
+ case ast_func_string_length_0:
+ case ast_func_string_length_1:
+ case ast_func_normalize_space_0:
+ case ast_func_normalize_space_1:
+ case ast_func_translate:
+ case ast_func_boolean:
+ case ast_func_not:
+ case ast_func_true:
+ case ast_func_false:
+ case ast_func_lang:
+ case ast_func_number_0:
+ case ast_func_number_1:
+ case ast_func_sum:
+ case ast_func_floor:
+ case ast_func_ceiling:
+ case ast_func_round:
+ if (m_left && m_left->contains(type)) return true;
+ if (m_right && m_right->contains(type)) return true;
+ if (m_third && m_third->contains(type)) return true;
+
+ return false;
+
+ case ast_step:
+ case ast_step_root:
+ return false;
+
+ default:
+ throw xpath_exception("Unknown semantics error");
+ }
+ }
+
+ void check_semantics()
+ {
+ switch (m_type)
+ {
+ case ast_op_or:
+ case ast_op_and:
+ case ast_op_equal:
+ case ast_op_not_equal:
+ case ast_op_less:
+ case ast_op_greater:
+ case ast_op_less_or_equal:
+ case ast_op_greater_or_equal:
+ m_left->check_semantics();
+ m_right->check_semantics();
+ m_rettype = ast_type_boolean;
+ break;
+
+ case ast_op_add:
+ case ast_op_subtract:
+ case ast_op_multiply:
+ case ast_op_divide:
+ case ast_op_mod:
+ m_left->check_semantics();
+ m_right->check_semantics();
+ m_rettype = ast_type_number;
+ break;
+
+ case ast_op_negate:
+ m_left->check_semantics();
+ m_rettype = ast_type_number;
+ break;
+
+ case ast_op_union:
+ m_left->check_semantics();
+ m_right->check_semantics();
+ if (m_left->rettype() != ast_type_node_set || m_right->rettype() != ast_type_node_set)
+ throw xpath_exception("Semantics error: union operator has to be applied to node sets");
+ m_rettype = ast_type_node_set;
+ break;
+
+ case ast_filter:
+ case ast_filter_posinv:
+ m_left->check_semantics();
+ m_right->check_semantics();
+ if (m_left->rettype() != ast_type_node_set)
+ throw xpath_exception("Semantics error: predicate has to be applied to node set");
+ m_rettype = ast_type_node_set;
+
+ if (!m_right->contains(ast_func_position) && m_right->rettype() != ast_type_number)
+ m_type = ast_filter_posinv;
+ break;
+
+ case ast_predicate:
+ m_left->check_semantics();
+ m_rettype = ast_type_node_set;
+ break;
+
+ case ast_variable:
+ throw xpath_exception("Semantics error: variable are not supported");
+
+ case ast_string_constant:
+ m_rettype = ast_type_string;
+ break;
+
+ case ast_number_constant:
+ m_rettype = ast_type_number;
+ break;
+
+ case ast_func_last:
+ case ast_func_position:
+ m_rettype = ast_type_number;
+ break;
+
+ case ast_func_count:
+ m_left->check_semantics();
+ if (m_left->rettype() != ast_type_node_set)
+ throw xpath_exception("Semantics error: count() has to be applied to node set");
+ m_rettype = ast_type_number;
+ break;
+
+ case ast_func_id:
+ m_left->check_semantics();
+ m_rettype = ast_type_node_set;
+ break;
+
+ case ast_func_local_name_0:
+ case ast_func_local_name_1:
+ case ast_func_namespace_uri_0:
+ case ast_func_namespace_uri_1:
+ case ast_func_name_0:
+ case ast_func_name_1:
+ if (m_left)
+ {
+ m_left->check_semantics();
+ if (m_left->rettype() != ast_type_node_set)
+ throw xpath_exception("Semantics error: function has to be applied to node set");
+ }
+ m_rettype = ast_type_string;
+ break;
+
+ case ast_func_string_0:
+ case ast_func_string_1:
+ if (m_left) m_left->check_semantics();
+ m_rettype = ast_type_string;
+ break;
+
+ case ast_func_concat:
+ m_left->check_semantics();
+
+ for (xpath_ast_node* n = m_right; n; n = n->m_next)
+ n->check_semantics();
+
+ m_rettype = ast_type_string;
+ break;
+
+ case ast_func_starts_with:
+ case ast_func_contains:
+ m_left->check_semantics();
+ m_right->check_semantics();
+ m_rettype = ast_type_boolean;
+ break;
+
+ case ast_func_substring_before:
+ case ast_func_substring_after:
+ case ast_func_substring_2:
+ case ast_func_substring_3:
+ m_left->check_semantics();
+ m_right->check_semantics();
+ if (m_third) m_third->check_semantics();
+ m_rettype = ast_type_string;
+ break;
+
+ case ast_func_string_length_0:
+ case ast_func_string_length_1:
+ if (m_left) m_left->check_semantics();
+ m_rettype = ast_type_number;
+ break;
+
+ case ast_func_normalize_space_0:
+ case ast_func_normalize_space_1:
+ case ast_func_translate:
+ if (m_left) m_left->check_semantics();
+ if (m_right) m_right->check_semantics();
+ if (m_third) m_third->check_semantics();
+ m_rettype = ast_type_string;
+ break;
+
+ case ast_func_boolean:
+ case ast_func_not:
+ case ast_func_true:
+ case ast_func_false:
+ case ast_func_lang:
+ if (m_left) m_left->check_semantics();
+ m_rettype = ast_type_boolean;
+ break;
+
+ case ast_func_number_0:
+ case ast_func_number_1:
+ if (m_left) m_left->check_semantics();
+ m_rettype = ast_type_number;
+ break;
+
+ case ast_func_sum:
+ m_left->check_semantics();
+ if (m_left->rettype() != ast_type_node_set)
+ throw xpath_exception("Semantics error: sum() has to be applied to node set");
+ m_rettype = ast_type_number;
+ break;
+
+ case ast_func_floor:
+ case ast_func_ceiling:
+ case ast_func_round:
+ if (m_left) m_left->check_semantics();
+ m_rettype = ast_type_number;
+ break;
+
+ case ast_step:
+ if (m_left)
+ {
+ m_left->check_semantics();
+ if (m_left->rettype() != ast_type_node_set)
+ throw xpath_exception("Semantics error: step has to be applied to node set");
+ }
+
+ for (xpath_ast_node* n = m_right; n; n = n->m_next)
+ n->check_semantics();
+
+ m_rettype = ast_type_node_set;
+ break;
+
+ case ast_step_root:
+ m_rettype = ast_type_node_set;
+ break;
+
+ default:
+ throw xpath_exception("Unknown semantics error");
+ }
+ }
+
+ ast_rettype_t rettype() const
+ {
+ return m_rettype;
+ }
+
+ void* operator new(size_t size, xpath_allocator& a)
+ {
+ return a.alloc(size);
+ }
+
+ void operator delete(void*, xpath_allocator&)
+ {
+ }
+ };
+
+ class xpath_parser
+ {
+ private:
+ xpath_allocator& m_alloc;
+ xpath_lexer m_lexer;
+
+ xpath_parser(const xpath_parser&);
+ xpath_parser& operator=(const xpath_parser&);
+
+ // PrimaryExpr ::= VariableReference | '(' Expr ')' | Literal | Number | FunctionCall
+ xpath_ast_node* parse_primary_expression()
+ {
+ switch (m_lexer.current())
+ {
+ case lex_var_ref:
+ {
+ m_lexer.next();
+
+ if (m_lexer.current() != lex_string)
+ throw xpath_exception("incorrect variable reference");
+
+ xpath_ast_node* n = new (m_alloc) xpath_ast_node(ast_variable, m_lexer.contents(), m_alloc);
+ m_lexer.next();
+
+ return n;
+ }
+
+ case lex_open_brace:
+ {
+ m_lexer.next();
+
+ xpath_ast_node* n = parse_expression();
+
+ if (m_lexer.current() != lex_close_brace)
+ throw xpath_exception("unmatched braces");
+
+ m_lexer.next();
+
+ return n;
+ }
+
+ case lex_quoted_string:
+ {
+ xpath_ast_node* n = new (m_alloc) xpath_ast_node(ast_string_constant, m_lexer.contents(), m_alloc);
+ m_lexer.next();
+
+ return n;
+ }
+
+ case lex_number:
+ {
+ xpath_ast_node* n = new (m_alloc) xpath_ast_node(ast_number_constant, m_lexer.contents(), m_alloc);
+ m_lexer.next();
+
+ return n;
+ }
+
+ case lex_string:
+ {
+ xpath_ast_node* args[4];
+ size_t argc = 0;
+
+ std::string function = m_lexer.contents();
+ m_lexer.next();
+
+ bool func_concat = (function == "concat");
+ xpath_ast_node* last_concat = 0;
+
+ if (m_lexer.current() != lex_open_brace)
+ throw xpath_exception("Unrecognized function call");
+ m_lexer.next();
+
+ if (m_lexer.current() != lex_close_brace)
+ args[argc++] = parse_expression();
+
+ while (m_lexer.current() != lex_close_brace)
+ {
+ if (m_lexer.current() != lex_comma)
+ throw xpath_exception("no comma between function arguments");
+ m_lexer.next();
+
+ xpath_ast_node* n = parse_expression();
+
+ if (func_concat)
+ {
+ if (argc < 2) args[argc++] = last_concat = n;
+ else
+ {
+ last_concat->set_next(n);
+ last_concat = n;
+ }
+ }
+ else if (argc >= 4)
+ throw xpath_exception("Too many function arguments");
+ else
+ args[argc++] = n;
+ }
+
+ m_lexer.next();
+
+ ast_type_t type = ast_none;
+
+ switch (function[0])
+ {
+ case 'b':
+ {
+ if (function == "boolean" && argc == 1)
+ type = ast_func_boolean;
+
+ break;
+ }
+
+ case 'c':
+ {
+ if (function == "count" && argc == 1)
+ type = ast_func_count;
+ else if (function == "contains" && argc == 2)
+ type = ast_func_contains;
+ else if (function == "concat" && argc == 2)
+ {
+ // set_next was done earlier
+ return new (m_alloc) xpath_ast_node(ast_func_concat, args[0], args[1]);
+ }
+ else if (function == "ceiling" && argc == 1)
+ type = ast_func_ceiling;
+
+ break;
+ }
+
+ case 'f':
+ {
+ if (function == "false" && argc == 0)
+ type = ast_func_false;
+ else if (function == "floor" && argc == 1)
+ type = ast_func_floor;
+
+ break;
+ }
+
+ case 'i':
+ {
+ if (function == "id" && argc == 1)
+ type = ast_func_id;
+
+ break;
+ }
+
+ case 'l':
+ {
+ if (function == "last" && argc == 0)
+ type = ast_func_last;
+ else if (function == "lang" && argc == 1)
+ type = ast_func_lang;
+ else if (function == "local-name" && argc <= 1)
+ type = argc == 0 ? ast_func_local_name_0 : ast_func_local_name_1;
+
+ break;
+ }
+
+ case 'n':
+ {
+ if (function == "name" && argc <= 1)
+ type = argc == 0 ? ast_func_name_0 : ast_func_name_1;
+ else if (function == "namespace-uri" && argc <= 1)
+ type = argc == 0 ? ast_func_namespace_uri_0 : ast_func_namespace_uri_1;
+ else if (function == "normalize-space" && argc <= 1)
+ type = argc == 0 ? ast_func_normalize_space_0 : ast_func_normalize_space_1;
+ else if (function == "not" && argc == 1)
+ type = ast_func_not;
+ else if (function == "number" && argc <= 1)
+ type = argc == 0 ? ast_func_number_0 : ast_func_number_1;
+
+ break;
+ }
+
+ case 'p':
+ {
+ if (function == "position" && argc == 0)
+ type = ast_func_position;
+
+ break;
+ }
+
+ case 'r':
+ {
+ if (function == "round" && argc == 1)
+ type = ast_func_round;
+
+ break;
+ }
+
+ case 's':
+ {
+ if (function == "string" && argc <= 1)
+ type = argc == 0 ? ast_func_string_0 : ast_func_string_1;
+ else if (function == "string-length" && argc <= 1)
+ type = argc == 0 ? ast_func_string_length_0 : ast_func_string_length_1;
+ else if (function == "starts-with" && argc == 2)
+ type = ast_func_starts_with;
+ else if (function == "substring-before" && argc == 2)
+ type = ast_func_substring_before;
+ else if (function == "substring-after" && argc == 2)
+ type = ast_func_substring_after;
+ else if (function == "substring" && (argc == 2 || argc == 3))
+ type = argc == 2 ? ast_func_substring_2 : ast_func_substring_3;
+ else if (function == "sum" && argc == 1)
+ type = ast_func_sum;
+
+ break;
+ }
+
+ case 't':
+ {
+ if (function == "translate" && argc == 3)
+ type = ast_func_translate;
+ else if (function == "true" && argc == 0)
+ type = ast_func_true;
+
+ break;
+ }
+
+ }
+
+ if (type != ast_none)
+ {
+ switch (argc)
+ {
+ case 0: return new (m_alloc) xpath_ast_node(type);
+ case 1: return new (m_alloc) xpath_ast_node(type, args[0]);
+ case 2: return new (m_alloc) xpath_ast_node(type, args[0], args[1]);
+ case 3: return new (m_alloc) xpath_ast_node(type, args[0], args[1], args[2]);
+ }
+ }
+
+ throw xpath_exception("Unrecognized function or wrong parameter count");
+ }
+
+ default:
+ throw xpath_exception("unrecognizable primary expression");
+ }
+ }
+
+ // FilterExpr ::= PrimaryExpr | FilterExpr Predicate
+ // Predicate ::= '[' PredicateExpr ']'
+ // PredicateExpr ::= Expr
+ xpath_ast_node* parse_filter_expression()
+ {
+ xpath_ast_node* n = parse_primary_expression();
+
+ while (m_lexer.current() == lex_open_square_brace)
+ {
+ m_lexer.next();
+
+ n = new (m_alloc) xpath_ast_node(ast_filter, n, parse_expression(), axis_child);
+
+ if (m_lexer.current() != lex_close_square_brace)
+ throw xpath_exception("Unmatched square brace");
+
+ m_lexer.next();
+ }
+
+ return n;
+ }
+
+ // Step ::= AxisSpecifier NodeTest Predicate* | AbbreviatedStep
+ // AxisSpecifier ::= AxisName '::' | '@'?
+ // NodeTest ::= NameTest | NodeType '(' ')' | 'processing-instruction' '(' Literal ')'
+ // NameTest ::= '*' | NCName ':' '*' | QName
+ // AbbreviatedStep ::= '.' | '..'
+ xpath_ast_node* parse_step(xpath_ast_node* set)
+ {
+ axis_t axis;
+
+ if (m_lexer.current() == lex_axis_attribute)
+ {
+ axis = axis_attribute;
+
+ m_lexer.next();
+ }
+ else if (m_lexer.current() == lex_dot)
+ {
+ m_lexer.next();
+
+ return new (m_alloc) xpath_ast_node(ast_step, set, axis_self, nodetest_type_node, 0, m_alloc);
+ }
+ else if (m_lexer.current() == lex_double_dot)
+ {
+ m_lexer.next();
+
+ return new (m_alloc) xpath_ast_node(ast_step, set, axis_parent, nodetest_type_node, 0, m_alloc);
+ }
+ else // implied child axis
+ axis = axis_child;
+
+ nodetest_t nt_type;
+ std::string nt_name;
+
+ if (m_lexer.current() == lex_string)
+ {
+ // node name test
+ nt_name = m_lexer.contents();
+ m_lexer.next();
+
+ // possible axis name here - check.
+ if (nt_name.find("::") == std::string::npos && m_lexer.current() == lex_string && m_lexer.contents()[0] == ':' && m_lexer.contents()[1] == ':')
+ {
+ nt_name += m_lexer.contents();
+ m_lexer.next();
+ }
+
+ // possible namespace test
+ if (m_lexer.current() == lex_string && m_lexer.contents()[0] == ':')
+ {
+ std::string::size_type colon_pos = nt_name.find(':');
+
+ // either there is no : in current string or there is, but it's :: and there's nothing more
+ if (colon_pos == std::string::npos ||
+ (colon_pos + 1 < nt_name.size() && nt_name[colon_pos + 1] == ':' &&
+ nt_name.find(':', colon_pos + 2) == std::string::npos))
+ {
+ nt_name += m_lexer.contents();
+ m_lexer.next();
+ }
+ }
+
+ bool axis_specified = true;
+
+ switch (nt_name[0])
+ {
+ case 'a':
+ if (starts_with(nt_name, "ancestor::")) axis = axis_ancestor;
+ else if (starts_with(nt_name, "ancestor-or-self::")) axis = axis_ancestor_or_self;
+ else if (starts_with(nt_name, "attribute::")) axis = axis_attribute;
+ else axis_specified = false;
+
+ break;
+
+ case 'c':
+ if (starts_with(nt_name, "child::")) axis = axis_child;
+ else axis_specified = false;
+
+ break;
+
+ case 'd':
+ if (starts_with(nt_name, "descendant::")) axis = axis_descendant;
+ else if (starts_with(nt_name, "descendant-or-self::")) axis = axis_descendant_or_self;
+ else axis_specified = false;
+
+ break;
+
+ case 'f':
+ if (starts_with(nt_name, "following::")) axis = axis_following;
+ else if (starts_with(nt_name, "following-sibling::")) axis = axis_following_sibling;
+ else axis_specified = false;
+
+ break;
+
+ case 'n':
+ if (starts_with(nt_name, "namespace::")) axis = axis_namespace;
+ else axis_specified = false;
+
+ break;
+
+ case 'p':
+ if (starts_with(nt_name, "parent::")) axis = axis_parent;
+ else if (starts_with(nt_name, "preceding::")) axis = axis_preceding;
+ else if (starts_with(nt_name, "preceding-sibling::")) axis = axis_preceding_sibling;
+ else axis_specified = false;
+
+ break;
+
+ case 's':
+ if (starts_with(nt_name, "self::")) axis = axis_ancestor_or_self;
+ else axis_specified = false;
+
+ break;
+
+ default:
+ axis_specified = false;
+ }
+
+ if (axis_specified)
+ {
+ nt_name.erase(0, nt_name.find("::") + 2);
+ }
+
+ if (nt_name.empty() && m_lexer.current() == lex_string)
+ {
+ nt_name += m_lexer.contents();
+ m_lexer.next();
+ }
+
+ // node type test or processing-instruction
+ if (m_lexer.current() == lex_open_brace)
+ {
+ m_lexer.next();
+
+ if (m_lexer.current() == lex_close_brace)
+ {
+ m_lexer.next();
+
+ if (nt_name == "node")
+ nt_type = nodetest_type_node;
+ else if (nt_name == "text")
+ nt_type = nodetest_type_text;
+ else if (nt_name == "comment")
+ nt_type = nodetest_type_comment;
+ else if (nt_name == "processing-instruction")
+ nt_type = nodetest_type_pi;
+ else
+ throw xpath_exception("Unrecognized node type");
+
+ nt_name.clear();
+ }
+ else if (nt_name == "processing-instruction")
+ {
+ if (m_lexer.current() != lex_quoted_string)
+ throw xpath_exception("Only literals are allowed as arguments to processing-instruction()");
+
+ nt_type = nodetest_pi;
+ nt_name = m_lexer.contents();
+ m_lexer.next();
+
+ if (m_lexer.current() != lex_close_brace)
+ throw xpath_exception("Unmatched brace near processing-instruction()");
+ m_lexer.next();
+ }
+ else
+ throw xpath_exception("Unmatched brace near node type test");
+
+ }
+ // namespace *
+ else if (m_lexer.current() == lex_multiply)
+ {
+ // Only strings of form 'namespace:*' are permitted
+ if (nt_name.empty())
+ nt_type = nodetest_all;
+ else
+ {
+ if (nt_name.find(':') != nt_name.size() - 1)
+ throw xpath_exception("Wrong namespace-like node test");
+
+ nt_name.erase(nt_name.size() - 1);
+
+ nt_type = nodetest_all_in_namespace;
+ }
+
+ m_lexer.next();
+ }
+ else nt_type = nodetest_name;
+ }
+ else if (m_lexer.current() == lex_multiply)
+ {
+ nt_type = nodetest_all;
+ m_lexer.next();
+ }
+ else throw xpath_exception("Unrecognized node test");
+
+ xpath_ast_node* n = new (m_alloc) xpath_ast_node(ast_step, set, axis, nt_type, nt_name.c_str(), m_alloc);
+
+ xpath_ast_node* last = 0;
+
+ while (m_lexer.current() == lex_open_square_brace)
+ {
+ m_lexer.next();
+
+ xpath_ast_node* pred = new (m_alloc) xpath_ast_node(ast_predicate, parse_expression(), 0, axis);
+
+ if (m_lexer.current() != lex_close_square_brace)
+ throw xpath_exception("unmatched square brace");
+ m_lexer.next();
+
+ if (last) last->set_next(pred);
+ else n->set_right(pred);
+
+ last = pred;
+ }
+
+ return n;
+ }
+
+ // RelativeLocationPath ::= Step | RelativeLocationPath '/' Step | RelativeLocationPath '//' Step
+ xpath_ast_node* parse_relative_location_path(xpath_ast_node* set)
+ {
+ xpath_ast_node* n = parse_step(set);
+
+ while (m_lexer.current() == lex_slash || m_lexer.current() == lex_double_slash)
+ {
+ lexeme_t l = m_lexer.current();
+ m_lexer.next();
+
+ if (l == lex_double_slash)
+ n = new (m_alloc) xpath_ast_node(ast_step, n, axis_descendant_or_self, nodetest_type_node, 0, m_alloc);
+
+ n = parse_step(n);
+ }
+
+ return n;
+ }
+
+ // LocationPath ::= RelativeLocationPath | AbsoluteLocationPath
+ // AbsoluteLocationPath ::= '/' RelativeLocationPath? | '//' RelativeLocationPath
+ xpath_ast_node* parse_location_path()
+ {
+ if (m_lexer.current() == lex_slash)
+ {
+ // Save state for next lexeme - that is, whatever follows '/'
+ const char* state = m_lexer.state();
+
+ m_lexer.next();
+
+ xpath_ast_node* n = new (m_alloc) xpath_ast_node(ast_step_root);
+
+ try
+ {
+ n = parse_relative_location_path(n);
+ }
+ catch (const xpath_exception&)
+ {
+ m_lexer.reset(state);
+ }
+
+ return n;
+ }
+ else if (m_lexer.current() == lex_double_slash)
+ {
+ m_lexer.next();
+
+ xpath_ast_node* n = new (m_alloc) xpath_ast_node(ast_step_root);
+ n = new (m_alloc) xpath_ast_node(ast_step, n, axis_descendant_or_self, nodetest_type_node, 0, m_alloc);
+
+ return parse_relative_location_path(n);
+ }
+ else
+ {
+ return parse_relative_location_path(0);
+ }
+ }
+
+ // PathExpr ::= LocationPath
+ // | FilterExpr
+ // | FilterExpr '/' RelativeLocationPath
+ // | FilterExpr '//' RelativeLocationPath
+ xpath_ast_node* parse_path_expression()
+ {
+ // Clarification.
+ // PathExpr begins with either LocationPath or FilterExpr.
+ // FilterExpr begins with PrimaryExpr
+ // PrimaryExpr begins with '$' in case of it being a variable reference,
+ // '(' in case of it being an expression, string literal, number constant or
+ // function call.
+
+ if (m_lexer.current() == lex_var_ref || m_lexer.current() == lex_open_brace ||
+ m_lexer.current() == lex_quoted_string || m_lexer.current() == lex_number ||
+ m_lexer.current() == lex_string)
+ {
+ if (m_lexer.current() == lex_string)
+ {
+ // This is either a function call, or not - if not, we shall proceed with location path
+ const char* state = m_lexer.state();
+
+ while (*state && *state <= 32) ++state;
+
+ if (*state != '(') return parse_location_path();
+ }
+
+ xpath_ast_node* n = parse_filter_expression();
+
+ if (m_lexer.current() == lex_slash || m_lexer.current() == lex_double_slash)
+ {
+ lexeme_t l = m_lexer.current();
+ m_lexer.next();
+
+ if (l == lex_double_slash)
+ n = new (m_alloc) xpath_ast_node(ast_step, n, axis_descendant_or_self, nodetest_type_node, 0, m_alloc);
+
+ // select from location path
+ return parse_relative_location_path(n);
+ }
+
+ return n;
+ }
+ else return parse_location_path();
+ }
+
+ // UnionExpr ::= PathExpr | UnionExpr '|' PathExpr
+ xpath_ast_node* parse_union_expression()
+ {
+ xpath_ast_node* n = parse_path_expression();
+
+ while (m_lexer.current() == lex_union)
+ {
+ m_lexer.next();
+
+ n = new (m_alloc) xpath_ast_node(ast_op_union, n, parse_union_expression());
+ }
+
+ return n;
+ }
+
+ // UnaryExpr ::= UnionExpr | '-' UnaryExpr
+ xpath_ast_node* parse_unary_expression()
+ {
+ if (m_lexer.current() == lex_minus)
+ {
+ m_lexer.next();
+
+ return new (m_alloc) xpath_ast_node(ast_op_negate, parse_unary_expression());
+ }
+ else return parse_union_expression();
+ }
+
+ // MultiplicativeExpr ::= UnaryExpr
+ // | MultiplicativeExpr '*' UnaryExpr
+ // | MultiplicativeExpr 'div' UnaryExpr
+ // | MultiplicativeExpr 'mod' UnaryExpr
+ xpath_ast_node* parse_multiplicative_expression()
+ {
+ xpath_ast_node* n = parse_unary_expression();
+
+ while (m_lexer.current() == lex_multiply || (m_lexer.current() == lex_string &&
+ (!strcmp(m_lexer.contents(), "mod") || !strcmp(m_lexer.contents(), "div"))))
+ {
+ ast_type_t op = m_lexer.current() == lex_multiply ? ast_op_multiply :
+ !strcmp(m_lexer.contents(), "div") ? ast_op_divide : ast_op_mod;
+ m_lexer.next();
+
+ n = new (m_alloc) xpath_ast_node(op, n, parse_unary_expression());
+ }
+
+ return n;
+ }
+
+ // AdditiveExpr ::= MultiplicativeExpr
+ // | AdditiveExpr '+' MultiplicativeExpr
+ // | AdditiveExpr '-' MultiplicativeExpr
+ xpath_ast_node* parse_additive_expression()
+ {
+ xpath_ast_node* n = parse_multiplicative_expression();
+
+ while (m_lexer.current() == lex_plus || m_lexer.current() == lex_minus)
+ {
+ lexeme_t l = m_lexer.current();
+
+ m_lexer.next();
+
+ n = new (m_alloc) xpath_ast_node(l == lex_plus ? ast_op_add : ast_op_subtract, n, parse_multiplicative_expression());
+ }
+
+ return n;
+ }
+
+ // RelationalExpr ::= AdditiveExpr
+ // | RelationalExpr '<' AdditiveExpr
+ // | RelationalExpr '>' AdditiveExpr
+ // | RelationalExpr '<=' AdditiveExpr
+ // | RelationalExpr '>=' AdditiveExpr
+ xpath_ast_node* parse_relational_expression()
+ {
+ xpath_ast_node* n = parse_additive_expression();
+
+ while (m_lexer.current() == lex_less || m_lexer.current() == lex_less_or_equal ||
+ m_lexer.current() == lex_greater || m_lexer.current() == lex_greater_or_equal)
+ {
+ lexeme_t l = m_lexer.current();
+ m_lexer.next();
+
+ n = new (m_alloc) xpath_ast_node(l == lex_less ? ast_op_less : l == lex_greater ? ast_op_greater :
+ l == lex_less_or_equal ? ast_op_less_or_equal : ast_op_greater_or_equal,
+ n, parse_additive_expression());
+ }
+
+ return n;
+ }
+
+ // EqualityExpr ::= RelationalExpr
+ // | EqualityExpr '=' RelationalExpr
+ // | EqualityExpr '!=' RelationalExpr
+ xpath_ast_node* parse_equality_expression()
+ {
+ xpath_ast_node* n = parse_relational_expression();
+
+ while (m_lexer.current() == lex_equal || m_lexer.current() == lex_not_equal)
+ {
+ lexeme_t l = m_lexer.current();
+
+ m_lexer.next();
+
+ n = new (m_alloc) xpath_ast_node(l == lex_equal ? ast_op_equal : ast_op_not_equal, n, parse_relational_expression());
+ }
+
+ return n;
+ }
+
+ // AndExpr ::= EqualityExpr | AndExpr 'and' EqualityExpr
+ xpath_ast_node* parse_and_expression()
+ {
+ xpath_ast_node* n = parse_equality_expression();
+
+ while (m_lexer.current() == lex_string && !strcmp(m_lexer.contents(), "and"))
+ {
+ m_lexer.next();
+
+ n = new (m_alloc) xpath_ast_node(ast_op_and, n, parse_equality_expression());
+ }
+
+ return n;
+ }
+
+ // OrExpr ::= AndExpr | OrExpr 'or' AndExpr
+ xpath_ast_node* parse_or_expression()
+ {
+ xpath_ast_node* n = parse_and_expression();
+
+ while (m_lexer.current() == lex_string && !strcmp(m_lexer.contents(), "or"))
+ {
+ m_lexer.next();
+
+ n = new (m_alloc) xpath_ast_node(ast_op_or, n, parse_and_expression());
+ }
+
+ return n;
+ }
+
+ // Expr ::= OrExpr
+ xpath_ast_node* parse_expression()
+ {
+ return parse_or_expression();
+ }
+
+ public:
+ explicit xpath_parser(const char* query, xpath_allocator& alloc): m_alloc(alloc), m_lexer(query)
+ {
+ }
+
+ xpath_ast_node* parse()
+ {
+ return parse_expression();
+ }
+ };
+
+ xpath_query::xpath_query(const char* query): m_alloc(0), m_root(0)
+ {
+ compile(query);
+ }
+
+ xpath_query::~xpath_query()
+ {
+ delete m_alloc;
+ }
+
+ void xpath_query::compile(const char* query)
+ {
+ delete m_alloc;
+ m_alloc = new xpath_allocator;
+
+ xpath_parser p(query, *m_alloc);
+
+ m_root = p.parse();
+ m_root->check_semantics();
+ }
+
+ bool xpath_query::evaluate_boolean(const xml_node& n)
+ {
+ if (!m_root) return false;
+
+ xpath_context c;
+
+ c.root = n.root();
+ c.n = n;
+ c.position = 1;
+ c.size = 1;
+
+ return m_root->eval_boolean(c);
+ }
+
+ double xpath_query::evaluate_number(const xml_node& n)
+ {
+ if (!m_root) return gen_nan();
+
+ xpath_context c;
+
+ c.root = n.root();
+ c.n = n;
+ c.position = 1;
+ c.size = 1;
+
+ return m_root->eval_number(c);
+ }
+
+ std::string xpath_query::evaluate_string(const xml_node& n)
+ {
+ if (!m_root) return std::string();
+
+ xpath_context c;
+
+ c.root = n.root();
+ c.n = n;
+ c.position = 1;
+ c.size = 1;
+
+ return m_root->eval_string(c);
+ }
+
+ xpath_node_set xpath_query::evaluate_node_set(const xml_node& n)
+ {
+ if (!m_root) return xpath_node_set();
+
+ xpath_context c;
+
+ c.root = n.root();
+ c.n = n;
+ c.position = 1;
+ c.size = 1;
+
+ return m_root->eval_node_set(c);
+ }
+
+ xpath_node xml_node::select_single_node(const char* query) const
+ {
+ xpath_query q(query);
+ return select_single_node(q);
+ }
+
+ xpath_node xml_node::select_single_node(xpath_query& query) const
+ {
+ xpath_node_set s = query.evaluate_node_set(*this);
+ return s.empty() ? xpath_node() : s.first();
+ }
+
+ xpath_node_set xml_node::select_nodes(const char* query) const
+ {
+ xpath_query q(query);
+ return select_nodes(q);
+ }
+
+ xpath_node_set xml_node::select_nodes(xpath_query& query) const
+ {
+ return query.evaluate_node_set(*this);
+ }
+}
+
+#endif