14#ifndef PUGIXML_VERSION
17#define PUGIXML_VERSION 180
22#include "pugiconfig.hpp"
24#ifndef HEADER_PUGIXML_HPP
25#define HEADER_PUGIXML_HPP
31#if !defined(PUGIXML_NO_XPATH) && !defined(PUGIXML_NO_EXCEPTIONS)
43#ifndef PUGIXML_DEPRECATED
45#define PUGIXML_DEPRECATED __attribute__((deprecated))
46#elif defined(_MSC_VER) && _MSC_VER >= 1300
47#define PUGIXML_DEPRECATED __declspec(deprecated)
49#define PUGIXML_DEPRECATED
60#define PUGIXML_CLASS PUGIXML_API
64#ifndef PUGIXML_FUNCTION
65#define PUGIXML_FUNCTION PUGIXML_API
70#ifndef PUGIXML_HAS_LONG_LONG
71#if __cplusplus >= 201103
72#define PUGIXML_HAS_LONG_LONG
73#elif defined(_MSC_VER) && _MSC_VER >= 1400
74#define PUGIXML_HAS_LONG_LONG
80#ifndef PUGIXML_HAS_MOVE
81#if __cplusplus >= 201103
82#define PUGIXML_HAS_MOVE
83#elif defined(_MSC_VER) && _MSC_VER >= 1600
84#define PUGIXML_HAS_MOVE
89#ifndef PUGIXML_OVERRIDE
90#if __cplusplus >= 201103
91#define PUGIXML_OVERRIDE override
93#define PUGIXML_OVERRIDE
98#ifdef PUGIXML_WCHAR_MODE
99#define PUGIXML_TEXT(t) L##t
100#define PUGIXML_CHAR wchar_t
102#define PUGIXML_TEXT(t) t
103#define PUGIXML_CHAR char
109typedef PUGIXML_CHAR char_t;
111#ifndef PUGIXML_NO_STL
114typedef std::basic_string<PUGIXML_CHAR, std::char_traits<PUGIXML_CHAR>,
115 std::allocator<PUGIXML_CHAR> >
140const unsigned int parse_minimal = 0x0000;
144const unsigned int parse_pi = 0x0001;
148const unsigned int parse_comments = 0x0002;
152const unsigned int parse_cdata = 0x0004;
157const unsigned int parse_ws_pcdata = 0x0008;
161const unsigned int parse_escapes = 0x0010;
165const unsigned int parse_eol = 0x0020;
169const unsigned int parse_wconv_attribute = 0x0040;
173const unsigned int parse_wnorm_attribute = 0x0080;
177const unsigned int parse_declaration = 0x0100;
181const unsigned int parse_doctype = 0x0200;
187const unsigned int parse_ws_pcdata_single = 0x0400;
191const unsigned int parse_trim_pcdata = 0x0800;
196const unsigned int parse_fragment = 0x1000;
202const unsigned int parse_embed_pcdata = 0x2000;
208const unsigned int parse_default =
209 parse_cdata | parse_escapes | parse_wconv_attribute | parse_eol;
215const unsigned int parse_full = parse_default | parse_pi | parse_comments |
216 parse_declaration | parse_doctype;
237const unsigned int format_indent = 0x01;
241const unsigned int format_write_bom = 0x02;
245const unsigned int format_raw = 0x04;
249const unsigned int format_no_declaration = 0x08;
253const unsigned int format_no_escapes = 0x10;
258const unsigned int format_save_file_text = 0x20;
262const unsigned int format_indent_attributes = 0x40;
266const unsigned int format_no_empty_element_tags = 0x80;
271const unsigned int format_default = format_indent;
274struct xml_attribute_struct;
275struct xml_node_struct;
277class xml_node_iterator;
278class xml_attribute_iterator;
279class xml_named_node_iterator;
281class xml_tree_walker;
283struct xml_parse_result;
289#ifndef PUGIXML_NO_XPATH
293class xpath_variable_set;
297template <
typename It>
300 typedef It const_iterator;
305 It begin()
const {
return _begin; }
306 It end()
const {
return _end; }
318 virtual void write(
const void* data,
size_t size) = 0;
328 virtual void write(
const void* data,
size_t size) PUGIXML_OVERRIDE;
334#ifndef PUGIXML_NO_STL
341 std::basic_ostream<
wchar_t, std::char_traits<wchar_t> >& stream);
343 virtual void write(
const void* data,
size_t size) PUGIXML_OVERRIDE;
346 std::basic_ostream<char, std::char_traits<char> >* narrow_stream;
347 std::basic_ostream<wchar_t, std::char_traits<wchar_t> >* wide_stream;
369 operator unspecified_bool_type()
const;
372 bool operator!()
const;
386 const char_t* name()
const;
387 const char_t* value()
const;
390 const char_t* as_string(
const char_t* def = PUGIXML_TEXT(
""))
const;
394 int as_int(
int def = 0)
const;
395 unsigned int as_uint(
unsigned int def = 0)
const;
396 double as_double(
double def = 0)
const;
397 float as_float(
float def = 0)
const;
399#ifdef PUGIXML_HAS_LONG_LONG
400 long long as_llong(
long long def = 0)
const;
401 unsigned long long as_ullong(
unsigned long long def = 0)
const;
406 bool as_bool(
bool def =
false)
const;
410 bool set_name(
const char_t* rhs);
411 bool set_value(
const char_t* rhs);
415 bool set_value(
int rhs);
416 bool set_value(
unsigned int rhs);
417 bool set_value(
long rhs);
418 bool set_value(
unsigned long rhs);
419 bool set_value(
double rhs);
420 bool set_value(
float rhs);
421 bool set_value(
bool rhs);
423#ifdef PUGIXML_HAS_LONG_LONG
424 bool set_value(
long long rhs);
425 bool set_value(
unsigned long long rhs);
438#ifdef PUGIXML_HAS_LONG_LONG
448 size_t hash_value()
const;
456bool PUGIXML_FUNCTION operator&&(
const xml_attribute& lhs,
bool rhs);
457bool PUGIXML_FUNCTION operator||(
const xml_attribute& lhs,
bool rhs);
469 typedef void (*unspecified_bool_type)(
xml_node***);
479 operator unspecified_bool_type()
const;
482 bool operator!()
const;
485 bool operator==(
const xml_node& r)
const;
486 bool operator!=(
const xml_node& r)
const;
487 bool operator<(
const xml_node& r)
const;
488 bool operator>(
const xml_node& r)
const;
489 bool operator<=(
const xml_node& r)
const;
490 bool operator>=(
const xml_node& r)
const;
496 xml_node_type type()
const;
499 const char_t* name()
const;
504 const char_t* value()
const;
528 xml_node child(
const char_t* name)
const;
530 xml_node next_sibling(
const char_t* name)
const;
531 xml_node previous_sibling(
const char_t* name)
const;
539 const char_t* child_value()
const;
543 const char_t* child_value(
const char_t* name)
const;
547 bool set_name(
const char_t* rhs);
548 bool set_value(
const char_t* rhs);
570 xml_node append_child(xml_node_type type = node_element);
571 xml_node prepend_child(xml_node_type type = node_element);
577 xml_node append_child(
const char_t* name);
578 xml_node prepend_child(
const char_t* name);
598 bool remove_attribute(
const char_t* name);
601 bool remove_child(
const xml_node& n);
602 bool remove_child(
const char_t* name);
610 unsigned int options = parse_default,
611 xml_encoding encoding = encoding_auto);
615 template <
typename Predicate>
620 attrib = attrib.next_attribute())
621 if (pred(attrib))
return attrib;
628 template <
typename Predicate>
629 xml_node find_child(Predicate pred)
const {
632 for (
xml_node node = first_child(); node; node = node.next_sibling())
633 if (pred(node))
return node;
640 template <
typename Predicate>
641 xml_node find_node(Predicate pred)
const {
646 while (cur._root && cur._root != _root) {
647 if (pred(cur))
return cur;
649 if (cur.first_child())
650 cur = cur.first_child();
651 else if (cur.next_sibling())
652 cur = cur.next_sibling();
654 while (!cur.next_sibling() && cur._root != _root) cur = cur.parent();
656 if (cur._root != _root) cur = cur.next_sibling();
664 xml_node find_child_by_attribute(
const char_t* name,
const char_t* attr_name,
665 const char_t* attr_value)
const;
666 xml_node find_child_by_attribute(
const char_t* attr_name,
667 const char_t* attr_value)
const;
669#ifndef PUGIXML_NO_STL
671 string_t path(char_t delimiter =
'/')
const;
675 xml_node first_element_by_path(
const char_t* path,
676 char_t delimiter =
'/')
const;
681#ifndef PUGIXML_NO_XPATH
695 xpath_node select_single_node(
const char_t* query,
702 void print(
xml_writer& writer,
const char_t* indent = PUGIXML_TEXT(
"\t"),
703 unsigned int flags = format_default,
704 xml_encoding encoding = encoding_auto,
705 unsigned int depth = 0)
const;
707#ifndef PUGIXML_NO_STL
709 void print(std::basic_ostream<
char, std::char_traits<char> >& os,
710 const char_t* indent = PUGIXML_TEXT(
"\t"),
711 unsigned int flags = format_default,
712 xml_encoding encoding = encoding_auto,
713 unsigned int depth = 0)
const;
714 void print(std::basic_ostream<
wchar_t, std::char_traits<wchar_t> >& os,
715 const char_t* indent = PUGIXML_TEXT(
"\t"),
716 unsigned int flags = format_default,
unsigned int depth = 0)
const;
738 ptrdiff_t offset_debug()
const;
741 size_t hash_value()
const;
749bool PUGIXML_FUNCTION operator&&(
const xml_node& lhs,
bool rhs);
750bool PUGIXML_FUNCTION operator||(
const xml_node& lhs,
bool rhs);
759 typedef void (*unspecified_bool_type)(
xml_text***);
771 operator unspecified_bool_type()
const;
774 bool operator!()
const;
780 const char_t* get()
const;
783 const char_t* as_string(
const char_t* def = PUGIXML_TEXT(
""))
const;
787 int as_int(
int def = 0)
const;
788 unsigned int as_uint(
unsigned int def = 0)
const;
789 double as_double(
double def = 0)
const;
790 float as_float(
float def = 0)
const;
792#ifdef PUGIXML_HAS_LONG_LONG
793 long long as_llong(
long long def = 0)
const;
794 unsigned long long as_ullong(
unsigned long long def = 0)
const;
799 bool as_bool(
bool def =
false)
const;
802 bool set(
const char_t* rhs);
807 bool set(
unsigned int rhs);
809 bool set(
unsigned long rhs);
810 bool set(
double rhs);
814#ifdef PUGIXML_HAS_LONG_LONG
815 bool set(
long long rhs);
816 bool set(
unsigned long long rhs);
820 xml_text& operator=(
const char_t* rhs);
822 xml_text& operator=(
unsigned int rhs);
824 xml_text& operator=(
unsigned long rhs);
829#ifdef PUGIXML_HAS_LONG_LONG
831 xml_text& operator=(
unsigned long long rhs);
840bool PUGIXML_FUNCTION operator&&(
const xml_text& lhs,
bool rhs);
841bool PUGIXML_FUNCTION operator||(
const xml_text& lhs,
bool rhs);
856 typedef ptrdiff_t difference_type;
861#ifndef PUGIXML_NO_STL
862 typedef std::bidirectional_iterator_tag iterator_category;
898 typedef ptrdiff_t difference_type;
903#ifndef PUGIXML_NO_STL
904 typedef std::bidirectional_iterator_tag iterator_category;
933 typedef ptrdiff_t difference_type;
938#ifndef PUGIXML_NO_STL
939 typedef std::bidirectional_iterator_tag iterator_category;
989 virtual bool for_each(
xml_node& node) = 0;
996enum xml_parse_status {
999 status_file_not_found,
1001 status_out_of_memory,
1002 status_internal_error,
1004 status_unrecognized_tag,
1013 status_bad_start_element,
1015 status_bad_attribute,
1017 status_bad_end_element,
1019 status_end_element_mismatch,
1024 status_append_invalid_root,
1028 status_no_document_element
1035 xml_parse_status status;
1041 xml_encoding encoding;
1047 operator bool()
const;
1050 const char* description()
const;
1081#ifndef PUGIXML_NO_STL
1084 std::basic_istream<
char, std::char_traits<char> >& stream,
1085 unsigned int options = parse_default,
1086 xml_encoding encoding = encoding_auto);
1088 std::basic_istream<
wchar_t, std::char_traits<wchar_t> >& stream,
1089 unsigned int options = parse_default);
1095 unsigned int options = parse_default);
1100 unsigned int options = parse_default);
1104 unsigned int options = parse_default,
1105 xml_encoding encoding = encoding_auto);
1107 unsigned int options = parse_default,
1108 xml_encoding encoding = encoding_auto);
1113 unsigned int options = parse_default,
1114 xml_encoding encoding = encoding_auto);
1121 unsigned int options = parse_default,
1122 xml_encoding encoding = encoding_auto);
1129 void* contents,
size_t size,
unsigned int options = parse_default,
1130 xml_encoding encoding = encoding_auto);
1134 void save(
xml_writer& writer,
const char_t* indent = PUGIXML_TEXT(
"\t"),
1135 unsigned int flags = format_default,
1136 xml_encoding encoding = encoding_auto)
const;
1138#ifndef PUGIXML_NO_STL
1141 void save(std::basic_ostream<
char, std::char_traits<char> >& stream,
1142 const char_t* indent = PUGIXML_TEXT(
"\t"),
1143 unsigned int flags = format_default,
1144 xml_encoding encoding = encoding_auto)
const;
1145 void save(std::basic_ostream<
wchar_t, std::char_traits<wchar_t> >& stream,
1146 const char_t* indent = PUGIXML_TEXT(
"\t"),
1147 unsigned int flags = format_default)
const;
1151 bool save_file(
const char* path,
const char_t* indent = PUGIXML_TEXT(
"\t"),
1152 unsigned int flags = format_default,
1153 xml_encoding encoding = encoding_auto)
const;
1154 bool save_file(
const wchar_t* path,
const char_t* indent = PUGIXML_TEXT(
"\t"),
1155 unsigned int flags = format_default,
1156 xml_encoding encoding = encoding_auto)
const;
1162#ifndef PUGIXML_NO_XPATH
1164enum xpath_value_type {
1166 xpath_type_node_set,
1184 operator bool()
const;
1187 const char* description()
const;
1195 xpath_value_type _type;
1206 const char_t* name()
const;
1209 xpath_value_type type()
const;
1213 bool get_boolean()
const;
1214 double get_number()
const;
1215 const char_t* get_string()
const;
1220 bool set(
bool value);
1221 bool set(
double value);
1222 bool set(
const char_t* value);
1248#ifdef PUGIXML_HAS_MOVE
1259 bool set(
const char_t* name,
bool value);
1260 bool set(
const char_t* name,
double value);
1261 bool set(
const char_t* name,
const char_t* value);
1275 typedef void (*unspecified_bool_type)(
xpath_query***);
1293#ifdef PUGIXML_HAS_MOVE
1300 xpath_value_type return_type()
const;
1305 bool evaluate_boolean(
const xpath_node& n)
const;
1310 double evaluate_number(
const xpath_node& n)
const;
1312#ifndef PUGIXML_NO_STL
1316 string_t evaluate_string(
const xpath_node& n)
const;
1325 size_t evaluate_string(char_t* buffer,
size_t capacity,
1346 operator unspecified_bool_type()
const;
1349 bool operator!()
const;
1352#ifndef PUGIXML_NO_EXCEPTIONS
1363 virtual const char* what()
const throw() PUGIXML_OVERRIDE;
1376 typedef void (*unspecified_bool_type)(
xpath_node***);
1394 operator unspecified_bool_type()
const;
1397 bool operator!()
const;
1406bool PUGIXML_FUNCTION operator&&(
const xpath_node& lhs,
bool rhs);
1407bool PUGIXML_FUNCTION operator||(
const xpath_node& lhs,
bool rhs);
1433 type_t type = type_unsorted);
1442#ifdef PUGIXML_HAS_MOVE
1449 type_t type()
const;
1452 size_t size()
const;
1455 const xpath_node& operator[](
size_t index)
const;
1462 void sort(
bool reverse =
false);
1483#ifndef PUGIXML_NO_STL
1485std::basic_string<char, std::char_traits<char>, std::allocator<char> >
1486 PUGIXML_FUNCTION as_utf8(
const wchar_t* str);
1487std::basic_string<char, std::char_traits<char>, std::allocator<char> >
1489 as_utf8(
const std::basic_string<
wchar_t, std::char_traits<wchar_t>,
1490 std::allocator<wchar_t> >& str);
1493std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >
1494 PUGIXML_FUNCTION as_wide(
const char* str);
1495std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >
1497 as_wide(
const std::basic_string<
char, std::char_traits<char>,
1498 std::allocator<char> >& str);
1503typedef void* (*allocation_function)(
size_t size);
1506typedef void (*deallocation_function)(
void* ptr);
1510void PUGIXML_FUNCTION set_memory_management_functions(
1511 allocation_function allocate, deallocation_function deallocate);
1514allocation_function PUGIXML_FUNCTION get_memory_allocation_function();
1515deallocation_function PUGIXML_FUNCTION get_memory_deallocation_function();
1518#if !defined(PUGIXML_NO_STL) && (defined(_MSC_VER) || defined(__ICC))
1522std::bidirectional_iterator_tag PUGIXML_FUNCTION
1524std::bidirectional_iterator_tag PUGIXML_FUNCTION
1526std::bidirectional_iterator_tag PUGIXML_FUNCTION
1531#if !defined(PUGIXML_NO_STL) && defined(__SUNPRO_CC)
1534std::bidirectional_iterator_tag PUGIXML_FUNCTION
1536std::bidirectional_iterator_tag PUGIXML_FUNCTION
1538std::bidirectional_iterator_tag PUGIXML_FUNCTION
1547#if defined(PUGIXML_HEADER_ONLY) && !defined(PUGIXML_SOURCE)
1548#define PUGIXML_SOURCE "pugixml.cpp"
1549#include PUGIXML_SOURCE