14 #ifndef PUGIXML_VERSION
16 # define PUGIXML_VERSION 120
20 #include "pugiconfig.hpp"
22 #ifndef HEADER_PUGIXML_HPP
23 #define HEADER_PUGIXML_HPP
29 #if !defined(PUGIXML_NO_XPATH) && !defined(PUGIXML_NO_EXCEPTIONS)
34 #ifndef PUGIXML_NO_STL
41 #ifndef PUGIXML_DEPRECATED
42 # if defined(__GNUC__)
43 # define PUGIXML_DEPRECATED __attribute__((deprecated))
44 # elif defined(_MSC_VER) && _MSC_VER >= 1300
45 # define PUGIXML_DEPRECATED __declspec(deprecated)
47 # define PUGIXML_DEPRECATED
58 # define PUGIXML_CLASS PUGIXML_API
62 #ifndef PUGIXML_FUNCTION
63 # define PUGIXML_FUNCTION PUGIXML_API
67 #ifdef PUGIXML_WCHAR_MODE
68 # define PUGIXML_TEXT(t) L ## t
69 # define PUGIXML_CHAR wchar_t
71 # define PUGIXML_TEXT(t) t
72 # define PUGIXML_CHAR char
78 typedef PUGIXML_CHAR char_t;
80 #ifndef PUGIXML_NO_STL
82 typedef std::basic_string<PUGIXML_CHAR, std::char_traits<PUGIXML_CHAR>, std::allocator<PUGIXML_CHAR> > string_t;
107 const unsigned int parse_minimal = 0x0000;
110 const unsigned int parse_pi = 0x0001;
113 const unsigned int parse_comments = 0x0002;
116 const unsigned int parse_cdata = 0x0004;
120 const unsigned int parse_ws_pcdata = 0x0008;
123 const unsigned int parse_escapes = 0x0010;
126 const unsigned int parse_eol = 0x0020;
129 const unsigned int parse_wconv_attribute = 0x0040;
132 const unsigned int parse_wnorm_attribute = 0x0080;
135 const unsigned int parse_declaration = 0x0100;
138 const unsigned int parse_doctype = 0x0200;
143 const unsigned int parse_ws_pcdata_single = 0x0400;
148 const unsigned int parse_default = parse_cdata | parse_escapes | parse_wconv_attribute | parse_eol;
153 const unsigned int parse_full = parse_default | parse_pi | parse_comments | parse_declaration | parse_doctype;
173 const unsigned int format_indent = 0x01;
176 const unsigned int format_write_bom = 0x02;
179 const unsigned int format_raw = 0x04;
182 const unsigned int format_no_declaration = 0x08;
185 const unsigned int format_no_escapes = 0x10;
188 const unsigned int format_save_file_text = 0x20;
192 const unsigned int format_default = format_indent;
195 struct xml_attribute_struct;
196 struct xml_node_struct;
198 class xml_node_iterator;
199 class xml_attribute_iterator;
200 class xml_named_node_iterator;
202 class xml_tree_walker;
208 #ifndef PUGIXML_NO_XPATH
210 class xpath_node_set;
212 class xpath_variable_set;
219 typedef It const_iterator;
225 It begin()
const {
return _begin; }
226 It end()
const {
return _end; }
239 virtual void write(
const void* data,
size_t size) = 0;
249 virtual void write(
const void* data,
size_t size);
255 #ifndef PUGIXML_NO_STL
262 xml_writer_stream(std::basic_ostream<
wchar_t, std::char_traits<wchar_t> >& stream);
264 virtual void write(
const void* data,
size_t size);
267 std::basic_ostream<char, std::char_traits<char> >* narrow_stream;
268 std::basic_ostream<wchar_t, std::char_traits<wchar_t> >* wide_stream;
291 operator unspecified_bool_type()
const;
294 bool operator!()
const;
308 const char_t* name()
const;
309 const char_t* value()
const;
312 const char_t* as_string(
const char_t* def = PUGIXML_TEXT(
""))
const;
315 int as_int(
int def = 0)
const;
316 unsigned int as_uint(
unsigned int def = 0)
const;
317 double as_double(
double def = 0)
const;
318 float as_float(
float def = 0)
const;
321 bool as_bool(
bool def =
false)
const;
324 bool set_name(
const char_t* rhs);
325 bool set_value(
const char_t* rhs);
328 bool set_value(
int rhs);
329 bool set_value(
unsigned int rhs);
330 bool set_value(
double rhs);
331 bool set_value(
bool rhs);
345 size_t hash_value()
const;
353 bool PUGIXML_FUNCTION operator&&(
const xml_attribute& lhs,
bool rhs);
354 bool PUGIXML_FUNCTION operator||(
const xml_attribute& lhs,
bool rhs);
367 typedef void (*unspecified_bool_type)(
xml_node***);
377 operator unspecified_bool_type()
const;
380 bool operator!()
const;
383 bool operator==(
const xml_node& r)
const;
384 bool operator!=(
const xml_node& r)
const;
385 bool operator<(
const xml_node& r)
const;
386 bool operator>(
const xml_node& r)
const;
387 bool operator<=(
const xml_node& r)
const;
388 bool operator>=(
const xml_node& r)
const;
394 xml_node_type type()
const;
397 const char_t* name()
const;
398 const char_t* value()
const;
422 xml_node child(
const char_t* name)
const;
424 xml_node next_sibling(
const char_t* name)
const;
425 xml_node previous_sibling(
const char_t* name)
const;
428 const char_t* child_value()
const;
431 const char_t* child_value(
const char_t* name)
const;
434 bool set_name(
const char_t* rhs);
435 bool set_value(
const char_t* rhs);
450 xml_node append_child(xml_node_type type = node_element);
451 xml_node prepend_child(xml_node_type type = node_element);
456 xml_node append_child(
const char_t* name);
457 xml_node prepend_child(
const char_t* name);
469 bool remove_attribute(
const char_t* name);
472 bool remove_child(
const xml_node& n);
473 bool remove_child(
const char_t* name);
476 template <
typename Predicate>
xml_attribute find_attribute(Predicate pred)
const
480 for (
xml_attribute attrib = first_attribute(); attrib; attrib = attrib.next_attribute())
488 template <
typename Predicate>
xml_node find_child(Predicate pred)
const
492 for (
xml_node node = first_child(); node; node = node.next_sibling())
500 template <
typename Predicate>
xml_node find_node(Predicate pred)
const
506 while (cur._root && cur._root != _root)
508 if (pred(cur))
return cur;
510 if (cur.first_child()) cur = cur.first_child();
511 else if (cur.next_sibling()) cur = cur.next_sibling();
514 while (!cur.next_sibling() && cur._root != _root) cur = cur.parent();
516 if (cur._root != _root) cur = cur.next_sibling();
524 xml_node find_child_by_attribute(
const char_t* name,
const char_t* attr_name,
const char_t* attr_value)
const;
525 xml_node find_child_by_attribute(
const char_t* attr_name,
const char_t* attr_value)
const;
527 #ifndef PUGIXML_NO_STL
529 string_t path(char_t delimiter =
'/')
const;
533 xml_node first_element_by_path(
const char_t* path, char_t delimiter =
'/')
const;
538 #ifndef PUGIXML_NO_XPATH
549 void print(
xml_writer& writer,
const char_t* indent = PUGIXML_TEXT(
"\t"),
unsigned int flags = format_default, xml_encoding encoding = encoding_auto,
unsigned int depth = 0)
const;
551 #ifndef PUGIXML_NO_STL
553 void print(std::basic_ostream<
char, std::char_traits<char> >& os,
const char_t* indent = PUGIXML_TEXT(
"\t"),
unsigned int flags = format_default, xml_encoding encoding = encoding_auto,
unsigned int depth = 0)
const;
554 void print(std::basic_ostream<
wchar_t, std::char_traits<wchar_t> >& os,
const char_t* indent = PUGIXML_TEXT(
"\t"),
unsigned int flags = format_default,
unsigned int depth = 0)
const;
575 ptrdiff_t offset_debug()
const;
578 size_t hash_value()
const;
586 bool PUGIXML_FUNCTION operator&&(
const xml_node& lhs,
bool rhs);
587 bool PUGIXML_FUNCTION operator||(
const xml_node& lhs,
bool rhs);
597 typedef void (*unspecified_bool_type)(
xml_text***);
609 operator unspecified_bool_type()
const;
612 bool operator!()
const;
618 const char_t*
get()
const;
621 const char_t* as_string(
const char_t* def = PUGIXML_TEXT(
""))
const;
624 int as_int(
int def = 0)
const;
625 unsigned int as_uint(
unsigned int def = 0)
const;
626 double as_double(
double def = 0)
const;
627 float as_float(
float def = 0)
const;
630 bool as_bool(
bool def =
false)
const;
633 bool set(
const char_t* rhs);
637 bool set(
unsigned int rhs);
638 bool set(
double rhs);
642 xml_text& operator=(
const char_t* rhs);
643 xml_text& operator=(
int rhs);
644 xml_text& operator=(
unsigned int rhs);
645 xml_text& operator=(
double rhs);
646 xml_text& operator=(
bool rhs);
654 bool PUGIXML_FUNCTION operator&&(
const xml_text& lhs,
bool rhs);
655 bool PUGIXML_FUNCTION operator||(
const xml_text& lhs,
bool rhs);
671 typedef ptrdiff_t difference_type;
676 #ifndef PUGIXML_NO_STL
677 typedef std::bidirectional_iterator_tag iterator_category;
713 typedef ptrdiff_t difference_type;
718 #ifndef PUGIXML_NO_STL
719 typedef std::bidirectional_iterator_tag iterator_category;
747 typedef ptrdiff_t difference_type;
752 #ifndef PUGIXML_NO_STL
753 typedef std::forward_iterator_tag iterator_category;
797 virtual bool for_each(
xml_node& node) = 0;
804 enum xml_parse_status
808 status_file_not_found,
810 status_out_of_memory,
811 status_internal_error,
813 status_unrecognized_tag,
820 status_bad_start_element,
821 status_bad_attribute,
822 status_bad_end_element,
823 status_end_element_mismatch
830 xml_parse_status status;
836 xml_encoding encoding;
842 operator bool()
const;
845 const char* description()
const;
863 xml_parse_result load_buffer_impl(
void* contents,
size_t size,
unsigned int options, xml_encoding encoding,
bool is_mutable,
bool own);
878 #ifndef PUGIXML_NO_STL
880 xml_parse_result load(std::basic_istream<
char, std::char_traits<char> >& stream,
unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
881 xml_parse_result load(std::basic_istream<
wchar_t, std::char_traits<wchar_t> >& stream,
unsigned int options = parse_default);
885 xml_parse_result load(
const char_t* contents,
unsigned int options = parse_default);
888 xml_parse_result load_file(
const char* path,
unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
889 xml_parse_result load_file(
const wchar_t* path,
unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
892 xml_parse_result load_buffer(
const void* contents,
size_t size,
unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
896 xml_parse_result load_buffer_inplace(
void* contents,
size_t size,
unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
900 xml_parse_result load_buffer_inplace_own(
void* contents,
size_t size,
unsigned int options = parse_default, xml_encoding encoding = encoding_auto);
903 void save(
xml_writer& writer,
const char_t* indent = PUGIXML_TEXT(
"\t"),
unsigned int flags = format_default, xml_encoding encoding = encoding_auto)
const;
905 #ifndef PUGIXML_NO_STL
907 void save(std::basic_ostream<
char, std::char_traits<char> >& stream,
const char_t* indent = PUGIXML_TEXT(
"\t"),
unsigned int flags = format_default, xml_encoding encoding = encoding_auto)
const;
908 void save(std::basic_ostream<
wchar_t, std::char_traits<wchar_t> >& stream,
const char_t* indent = PUGIXML_TEXT(
"\t"),
unsigned int flags = format_default)
const;
912 bool save_file(
const char* path,
const char_t* indent = PUGIXML_TEXT(
"\t"),
unsigned int flags = format_default, xml_encoding encoding = encoding_auto)
const;
913 bool save_file(
const wchar_t* path,
const char_t* indent = PUGIXML_TEXT(
"\t"),
unsigned int flags = format_default, xml_encoding encoding = encoding_auto)
const;
919 #ifndef PUGIXML_NO_XPATH
921 enum xpath_value_type
943 operator bool()
const;
946 const char* description()
const;
955 xpath_value_type _type;
966 const char_t* name()
const;
969 xpath_value_type type()
const;
972 bool get_boolean()
const;
973 double get_number()
const;
974 const char_t* get_string()
const;
978 bool set(
bool value);
979 bool set(
double value);
980 bool set(
const char_t* value);
1005 bool set(
const char_t* name,
bool value);
1006 bool set(
const char_t* name,
double value);
1007 bool set(
const char_t* name,
const char_t* value);
1022 typedef void (*unspecified_bool_type)(
xpath_query***);
1026 xpath_query& operator=(
const xpath_query&);
1037 xpath_value_type return_type()
const;
1041 bool evaluate_boolean(
const xpath_node& n)
const;
1045 double evaluate_number(
const xpath_node& n)
const;
1047 #ifndef PUGIXML_NO_STL
1050 string_t evaluate_string(
const xpath_node& n)
const;
1057 size_t evaluate_string(char_t* buffer,
size_t capacity,
const xpath_node& n)
const;
1068 operator unspecified_bool_type()
const;
1071 bool operator!()
const;
1074 #ifndef PUGIXML_NO_EXCEPTIONS
1086 virtual const char* what()
const throw();
1100 typedef void (*unspecified_bool_type)(
xpath_node***);
1118 operator unspecified_bool_type()
const;
1121 bool operator!()
const;
1130 bool PUGIXML_FUNCTION operator&&(
const xpath_node& lhs,
bool rhs);
1131 bool PUGIXML_FUNCTION operator||(
const xpath_node& lhs,
bool rhs);
1163 type_t type()
const;
1166 size_t size()
const;
1169 const xpath_node& operator[](
size_t index)
const;
1176 void sort(
bool reverse =
false);
1196 #ifndef PUGIXML_NO_STL
1198 std::basic_string<char, std::char_traits<char>, std::allocator<char> > PUGIXML_FUNCTION as_utf8(
const wchar_t* str);
1199 std::basic_string<char, std::char_traits<char>, std::allocator<char> > PUGIXML_FUNCTION as_utf8(
const std::basic_string<
wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >& str);
1202 std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > PUGIXML_FUNCTION as_wide(
const char* str);
1203 std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > PUGIXML_FUNCTION as_wide(
const std::basic_string<
char, std::char_traits<char>, std::allocator<char> >& str);
1207 typedef void* (*allocation_function)(
size_t size);
1210 typedef void (*deallocation_function)(
void* ptr);
1213 void PUGIXML_FUNCTION set_memory_management_functions(allocation_function allocate, deallocation_function deallocate);
1216 allocation_function PUGIXML_FUNCTION get_memory_allocation_function();
1217 deallocation_function PUGIXML_FUNCTION get_memory_deallocation_function();
1220 #if !defined(PUGIXML_NO_STL) && (defined(_MSC_VER) || defined(__ICC))
1230 #if !defined(PUGIXML_NO_STL) && defined(__SUNPRO_CC)