docs: Replaced all tabs with 4 spaces (guaranteed tab size)

git-svn-id: http://pugixml.googlecode.com/svn/trunk@591 99668b35-9821-0410-8761-19e4c4f06640
This commit is contained in:
arseny.kapoulkine 2010-07-11 13:29:12 +00:00
parent f73df8d06e
commit fb507ab2d6
23 changed files with 994 additions and 949 deletions

File diff suppressed because it is too large Load Diff

View File

@ -5,21 +5,23 @@
//[code_custom_memory_management_decl //[code_custom_memory_management_decl
void* custom_allocate(size_t size) void* custom_allocate(size_t size)
{ {
return new (std::nothrow) char[size]; return new (std::nothrow) char[size];
} }
void custom_deallocate(void* ptr) void custom_deallocate(void* ptr)
{ {
delete[] static_cast<char*>(ptr); delete[] static_cast<char*>(ptr);
} }
//] //]
int main() int main()
{ {
//[code_custom_memory_management_call //[code_custom_memory_management_call
pugi::set_memory_management_functions(custom_allocate, custom_deallocate); pugi::set_memory_management_functions(custom_allocate, custom_deallocate);
//] //]
pugi::xml_document doc; pugi::xml_document doc;
doc.load("<node/>"); doc.load("<node/>");
} }
// vim:et

View File

@ -8,55 +8,57 @@ bool load_preprocess(pugi::xml_document& doc, const char* path);
bool preprocess(pugi::xml_node node) bool preprocess(pugi::xml_node node)
{ {
for (pugi::xml_node child = node.first_child(); child; ) for (pugi::xml_node child = node.first_child(); child; )
{ {
if (child.type() == pugi::node_pi && strcmp(child.name(), "include") == 0) if (child.type() == pugi::node_pi && strcmp(child.name(), "include") == 0)
{ {
pugi::xml_node include = child; pugi::xml_node include = child;
// load new preprocessed document (note: ideally this should handle relative paths) // load new preprocessed document (note: ideally this should handle relative paths)
const char* path = include.value(); const char* path = include.value();
pugi::xml_document doc; pugi::xml_document doc;
if (!load_preprocess(doc, path)) return false; if (!load_preprocess(doc, path)) return false;
// insert the comment marker above include directive // insert the comment marker above include directive
node.insert_child_before(pugi::node_comment, include).set_value(path); node.insert_child_before(pugi::node_comment, include).set_value(path);
// copy the document above the include directive (this retains the original order!) // copy the document above the include directive (this retains the original order!)
for (pugi::xml_node ic = doc.first_child(); ic; ic = ic.next_sibling()) for (pugi::xml_node ic = doc.first_child(); ic; ic = ic.next_sibling())
{ {
node.insert_copy_before(ic, include); node.insert_copy_before(ic, include);
} }
// remove the include node and move to the next child // remove the include node and move to the next child
child = child.next_sibling(); child = child.next_sibling();
node.remove_child(include); node.remove_child(include);
} }
else else
{ {
if (!preprocess(child)) return false; if (!preprocess(child)) return false;
child = child.next_sibling(); child = child.next_sibling();
} }
} }
return true; return true;
} }
bool load_preprocess(pugi::xml_document& doc, const char* path) bool load_preprocess(pugi::xml_document& doc, const char* path)
{ {
pugi::xml_parse_result result = doc.load_file(path, pugi::parse_default | pugi::parse_pi); // for <?include?> pugi::xml_parse_result result = doc.load_file(path, pugi::parse_default | pugi::parse_pi); // for <?include?>
return result ? preprocess(doc) : false; return result ? preprocess(doc) : false;
} }
//] //]
int main() int main()
{ {
pugi::xml_document doc; pugi::xml_document doc;
if (!load_preprocess(doc, "character.xml")) return -1; if (!load_preprocess(doc, "character.xml")) return -1;
doc.print(std::cout); doc.print(std::cout);
} }
// vim:et

View File

@ -5,25 +5,27 @@
void check_xml(const char* source) void check_xml(const char* source)
{ {
//[code_load_error_handling //[code_load_error_handling
pugi::xml_document doc; pugi::xml_document doc;
pugi::xml_parse_result result = doc.load(source); pugi::xml_parse_result result = doc.load(source);
if (result) if (result)
std::cout << "XML [" << source << "] parsed without errors, attr value: [" << doc.child("node").attribute("attr").value() << "]\n\n"; std::cout << "XML [" << source << "] parsed without errors, attr value: [" << doc.child("node").attribute("attr").value() << "]\n\n";
else else
{ {
std::cout << "XML [" << source << "] parsed with errors, attr value: [" << doc.child("node").attribute("attr").value() << "]\n"; std::cout << "XML [" << source << "] parsed with errors, attr value: [" << doc.child("node").attribute("attr").value() << "]\n";
std::cout << "Error description: " << result.description() << "\n"; std::cout << "Error description: " << result.description() << "\n";
std::cout << "Error offset: " << result.offset << " (error at [..." << (source + result.offset) << "]\n\n"; std::cout << "Error offset: " << result.offset << " (error at [..." << (source + result.offset) << "]\n\n";
} }
//] //]
} }
int main() int main()
{ {
check_xml("<node attr='value'><child>text</child></node>"); check_xml("<node attr='value'><child>text</child></node>");
check_xml("<node attr='value'><child>text</chil></node>"); check_xml("<node attr='value'><child>text</chil></node>");
check_xml("<node attr='value'><child>text</child>"); check_xml("<node attr='value'><child>text</child>");
check_xml("<node attr='value\"><child>text</child></node>"); check_xml("<node attr='value\"><child>text</child></node>");
check_xml("<node attr='value'><#tag /></node>"); check_xml("<node attr='value'><#tag /></node>");
} }
// vim:et

View File

@ -5,10 +5,12 @@
int main() int main()
{ {
//[code_load_file //[code_load_file
pugi::xml_document doc; pugi::xml_document doc;
pugi::xml_parse_result result = doc.load_file("tree.xml"); pugi::xml_parse_result result = doc.load_file("tree.xml");
std::cout << "Load result: " << result.description() << ", mesh name: " << doc.child("mesh").attribute("name").value() << std::endl; std::cout << "Load result: " << result.description() << ", mesh name: " << doc.child("mesh").attribute("name").value() << std::endl;
//] //]
} }
// vim:et

View File

@ -5,58 +5,60 @@
int main() int main()
{ {
//[code_load_memory_decl //[code_load_memory_decl
const char source[] = "<mesh name='sphere'><bounds>0 0 1 1</bounds></mesh>"; const char source[] = "<mesh name='sphere'><bounds>0 0 1 1</bounds></mesh>";
size_t size = sizeof(source); size_t size = sizeof(source);
//] //]
pugi::xml_document doc; pugi::xml_document doc;
{ {
//[code_load_memory_buffer //[code_load_memory_buffer
// You can use load_buffer to load document from immutable memory block: // You can use load_buffer to load document from immutable memory block:
pugi::xml_parse_result result = doc.load_buffer(source, size); pugi::xml_parse_result result = doc.load_buffer(source, size);
//] //]
std::cout << "Load result: " << result.description() << ", mesh name: " << doc.child("mesh").attribute("name").value() << std::endl; std::cout << "Load result: " << result.description() << ", mesh name: " << doc.child("mesh").attribute("name").value() << std::endl;
} }
{ {
//[code_load_memory_buffer_inplace //[code_load_memory_buffer_inplace
// You can use load_buffer_inplace to load document from mutable memory block; the block's lifetime must exceed that of document // You can use load_buffer_inplace to load document from mutable memory block; the block's lifetime must exceed that of document
char* buffer = new char[size]; char* buffer = new char[size];
memcpy(buffer, source, size); memcpy(buffer, source, size);
// The block can be allocated by any method; the block is modified during parsing // The block can be allocated by any method; the block is modified during parsing
pugi::xml_parse_result result = doc.load_buffer_inplace(buffer, size); pugi::xml_parse_result result = doc.load_buffer_inplace(buffer, size);
//<- //<-
std::cout << "Load result: " << result.description() << ", mesh name: " << doc.child("mesh").attribute("name").value() << std::endl; std::cout << "Load result: " << result.description() << ", mesh name: " << doc.child("mesh").attribute("name").value() << std::endl;
//-> //->
// You have to destroy the block yourself after the document is no longer used // You have to destroy the block yourself after the document is no longer used
delete[] buffer; delete[] buffer;
//] //]
} }
{ {
//[code_load_memory_buffer_inplace_own //[code_load_memory_buffer_inplace_own
// You can use load_buffer_inplace_own to load document from mutable memory block and to pass the ownership of this block // You can use load_buffer_inplace_own to load document from mutable memory block and to pass the ownership of this block
// The block has to be allocated via pugixml allocation function - using i.e. operator new here is incorrect // The block has to be allocated via pugixml allocation function - using i.e. operator new here is incorrect
char* buffer = static_cast<char*>(pugi::get_memory_allocation_function()(size)); char* buffer = static_cast<char*>(pugi::get_memory_allocation_function()(size));
memcpy(buffer, source, size); memcpy(buffer, source, size);
// The block will be deleted by the document // The block will be deleted by the document
pugi::xml_parse_result result = doc.load_buffer_inplace_own(buffer, size); pugi::xml_parse_result result = doc.load_buffer_inplace_own(buffer, size);
//] //]
std::cout << "Load result: " << result.description() << ", mesh name: " << doc.child("mesh").attribute("name").value() << std::endl; std::cout << "Load result: " << result.description() << ", mesh name: " << doc.child("mesh").attribute("name").value() << std::endl;
} }
{ {
//[code_load_memory_string //[code_load_memory_string
// You can use load to load document from null-terminated strings, for example literals: // You can use load to load document from null-terminated strings, for example literals:
pugi::xml_parse_result result = doc.load("<mesh name='sphere'><bounds>0 0 1 1</bounds></mesh>"); pugi::xml_parse_result result = doc.load("<mesh name='sphere'><bounds>0 0 1 1</bounds></mesh>");
//] //]
std::cout << "Load result: " << result.description() << ", mesh name: " << doc.child("mesh").attribute("name").value() << std::endl; std::cout << "Load result: " << result.description() << ", mesh name: " << doc.child("mesh").attribute("name").value() << std::endl;
} }
} }
// vim:et

View File

@ -4,25 +4,27 @@
int main() int main()
{ {
pugi::xml_document doc; pugi::xml_document doc;
//[code_load_options //[code_load_options
const char* source = "<!--comment--><node>&lt;</node>"; const char* source = "<!--comment--><node>&lt;</node>";
// Parsing with default options; note that comment node is not added to the tree, and entity reference &lt; is expanded // Parsing with default options; note that comment node is not added to the tree, and entity reference &lt; is expanded
doc.load(source); doc.load(source);
std::cout << "First node value: [" << doc.first_child().value() << "], node child value: [" << doc.child_value("node") << "]\n"; std::cout << "First node value: [" << doc.first_child().value() << "], node child value: [" << doc.child_value("node") << "]\n";
// Parsing with additional parse_comments option; comment node is now added to the tree // Parsing with additional parse_comments option; comment node is now added to the tree
doc.load(source, pugi::parse_default | pugi::parse_comments); doc.load(source, pugi::parse_default | pugi::parse_comments);
std::cout << "First node value: [" << doc.first_child().value() << "], node child value: [" << doc.child_value("node") << "]\n"; std::cout << "First node value: [" << doc.first_child().value() << "], node child value: [" << doc.child_value("node") << "]\n";
// Parsing with additional parse_comments option and without the (default) parse_escapes option; &lt; is not expanded // Parsing with additional parse_comments option and without the (default) parse_escapes option; &lt; is not expanded
doc.load(source, (pugi::parse_default | pugi::parse_comments) & ~pugi::parse_escapes); doc.load(source, (pugi::parse_default | pugi::parse_comments) & ~pugi::parse_escapes);
std::cout << "First node value: [" << doc.first_child().value() << "], node child value: [" << doc.child_value("node") << "]\n"; std::cout << "First node value: [" << doc.first_child().value() << "], node child value: [" << doc.child_value("node") << "]\n";
// Parsing with minimal option mask; comment node is not added to the tree, and &lt; is not expanded // Parsing with minimal option mask; comment node is not added to the tree, and &lt; is not expanded
doc.load(source, pugi::parse_minimal); doc.load(source, pugi::parse_minimal);
std::cout << "First node value: [" << doc.first_child().value() << "], node child value: [" << doc.child_value("node") << "]\n"; std::cout << "First node value: [" << doc.first_child().value() << "], node child value: [" << doc.child_value("node") << "]\n";
//] //]
} }
// vim:et

View File

@ -6,90 +6,92 @@
void print_doc(const char* message, const pugi::xml_document& doc, const pugi::xml_parse_result& result) void print_doc(const char* message, const pugi::xml_document& doc, const pugi::xml_parse_result& result)
{ {
std::cout std::cout
<< message << message
<< "\t: load result '" << result.description() << "'" << "\t: load result '" << result.description() << "'"
<< ", first character of root name: U+" << std::hex << std::uppercase << std::setw(4) << std::setfill('0') << pugi::as_wide(doc.first_child().name())[0] << ", first character of root name: U+" << std::hex << std::uppercase << std::setw(4) << std::setfill('0') << pugi::as_wide(doc.first_child().name())[0]
<< ", year: " << doc.first_child().first_child().first_child().child_value() << ", year: " << doc.first_child().first_child().first_child().child_value()
<< std::endl; << std::endl;
} }
bool try_imbue(std::wistream& stream, const char* name) bool try_imbue(std::wistream& stream, const char* name)
{ {
try try
{ {
stream.imbue(std::locale(name)); stream.imbue(std::locale(name));
return true; return true;
} }
catch (const std::exception&) catch (const std::exception&)
{ {
return false; return false;
} }
} }
int main() int main()
{ {
pugi::xml_document doc; pugi::xml_document doc;
{ {
//[code_load_stream //[code_load_stream
std::ifstream stream("weekly-utf-8.xml"); std::ifstream stream("weekly-utf-8.xml");
pugi::xml_parse_result result = doc.load(stream); pugi::xml_parse_result result = doc.load(stream);
//] //]
// first character of root name: U+9031, year: 1997 // first character of root name: U+9031, year: 1997
print_doc("UTF8 file from narrow stream", doc, result); print_doc("UTF8 file from narrow stream", doc, result);
} }
{ {
std::ifstream stream("weekly-utf-16.xml"); std::ifstream stream("weekly-utf-16.xml");
pugi::xml_parse_result result = doc.load(stream); pugi::xml_parse_result result = doc.load(stream);
// first character of root name: U+9031, year: 1997 // first character of root name: U+9031, year: 1997
print_doc("UTF16 file from narrow stream", doc, result); print_doc("UTF16 file from narrow stream", doc, result);
} }
{ {
// Since wide streams are treated as UTF-16/32 ones, you can't load the UTF-8 file from a wide stream // Since wide streams are treated as UTF-16/32 ones, you can't load the UTF-8 file from a wide stream
// directly if you have localized characters; you'll have to provide a UTF8 locale (there is no // directly if you have localized characters; you'll have to provide a UTF8 locale (there is no
// standard one; you can use utf8_codecvt_facet from Boost or codecvt_utf8 from C++0x) // standard one; you can use utf8_codecvt_facet from Boost or codecvt_utf8 from C++0x)
std::wifstream stream("weekly-utf-8.xml"); std::wifstream stream("weekly-utf-8.xml");
if (try_imbue(stream, "en_US.UTF-8")) // try Linux encoding if (try_imbue(stream, "en_US.UTF-8")) // try Linux encoding
{ {
pugi::xml_parse_result result = doc.load(stream); pugi::xml_parse_result result = doc.load(stream);
// first character of root name: U+00E9, year: 1997 // first character of root name: U+00E9, year: 1997
print_doc("UTF8 file from wide stream", doc, result); print_doc("UTF8 file from wide stream", doc, result);
} }
else else
{ {
std::cout << "UTF-8 locale is not available\n"; std::cout << "UTF-8 locale is not available\n";
} }
} }
{ {
// Since wide streams are treated as UTF-16/32 ones, you can't load the UTF-16 file from a wide stream without // Since wide streams are treated as UTF-16/32 ones, you can't load the UTF-16 file from a wide stream without
// using custom codecvt; you can use codecvt_utf16 from C++0x // using custom codecvt; you can use codecvt_utf16 from C++0x
} }
{ {
// Since encoding names are non-standard, you can't load the Shift-JIS (or any other non-ASCII) file // Since encoding names are non-standard, you can't load the Shift-JIS (or any other non-ASCII) file
// from a wide stream portably // from a wide stream portably
std::wifstream stream("weekly-shift_jis.xml"); std::wifstream stream("weekly-shift_jis.xml");
if (try_imbue(stream, ".932") || // try Microsoft encoding if (try_imbue(stream, ".932") || // try Microsoft encoding
try_imbue(stream, "ja_JP.SJIS")) // try Linux encoding; run "localedef -i ja_JP -c -f SHIFT_JIS /usr/lib/locale/ja_JP.SJIS" to get it try_imbue(stream, "ja_JP.SJIS")) // try Linux encoding; run "localedef -i ja_JP -c -f SHIFT_JIS /usr/lib/locale/ja_JP.SJIS" to get it
{ {
pugi::xml_parse_result result = doc.load(stream); pugi::xml_parse_result result = doc.load(stream);
// first character of root name: U+9031, year: 1997 // first character of root name: U+9031, year: 1997
print_doc("Shift-JIS file from wide stream", doc, result); print_doc("Shift-JIS file from wide stream", doc, result);
} }
else else
{ {
std::cout << "Shift-JIS locale is not available\n"; std::cout << "Shift-JIS locale is not available\n";
} }
} }
} }
// vim:et

View File

@ -4,27 +4,29 @@
int main() int main()
{ {
pugi::xml_document doc; pugi::xml_document doc;
//[code_modify_add //[code_modify_add
// add node with some name // add node with some name
pugi::xml_node node = doc.append_child(); pugi::xml_node node = doc.append_child();
node.set_name("node"); node.set_name("node");
// add description node with text child // add description node with text child
pugi::xml_node descr = node.append_child(); pugi::xml_node descr = node.append_child();
descr.set_name("description"); descr.set_name("description");
descr.append_child(pugi::node_pcdata).set_value("Simple node"); descr.append_child(pugi::node_pcdata).set_value("Simple node");
// add param node before the description // add param node before the description
pugi::xml_node param = node.insert_child_before(pugi::node_element, descr); pugi::xml_node param = node.insert_child_before(pugi::node_element, descr);
param.set_name("param"); param.set_name("param");
// add attributes to param node // add attributes to param node
param.append_attribute("name") = "version"; param.append_attribute("name") = "version";
param.append_attribute("value") = 1.1; param.append_attribute("value") = 1.1;
param.insert_attribute_after("type", param.attribute("name")) = "float"; param.insert_attribute_after("type", param.attribute("name")) = "float";
//] //]
doc.print(std::cout); doc.print(std::cout);
} }
// vim:et

View File

@ -5,37 +5,39 @@
int main() int main()
{ {
pugi::xml_document doc; pugi::xml_document doc;
if (!doc.load("<node id='123'>text</node><!-- comment -->", pugi::parse_default | pugi::parse_comments)) return -1; if (!doc.load("<node id='123'>text</node><!-- comment -->", pugi::parse_default | pugi::parse_comments)) return -1;
//[code_modify_base_node //[code_modify_base_node
pugi::xml_node node = doc.child("node"); pugi::xml_node node = doc.child("node");
// change node name // change node name
std::cout << node.set_name("notnode"); std::cout << node.set_name("notnode");
std::cout << ", new node name: " << node.name() << std::endl; std::cout << ", new node name: " << node.name() << std::endl;
// change comment text // change comment text
std::cout << doc.last_child().set_value("useless comment"); std::cout << doc.last_child().set_value("useless comment");
std::cout << ", new comment text: " << doc.last_child().value() << std::endl; std::cout << ", new comment text: " << doc.last_child().value() << std::endl;
// we can't change value of the element or name of the comment // we can't change value of the element or name of the comment
std::cout << node.set_value("1") << ", " << doc.last_child().set_name("2") << std::endl; std::cout << node.set_value("1") << ", " << doc.last_child().set_name("2") << std::endl;
//] //]
//[code_modify_base_attr //[code_modify_base_attr
pugi::xml_attribute attr = node.attribute("id"); pugi::xml_attribute attr = node.attribute("id");
// change attribute name/value // change attribute name/value
std::cout << attr.set_name("key") << ", " << attr.set_value("345"); std::cout << attr.set_name("key") << ", " << attr.set_value("345");
std::cout << ", new attribute: " << attr.name() << "=" << attr.value() << std::endl; std::cout << ", new attribute: " << attr.name() << "=" << attr.value() << std::endl;
// we can use numbers or booleans // we can use numbers or booleans
attr.set_value(1.234); attr.set_value(1.234);
std::cout << "new attribute value: " << attr.value() << std::endl; std::cout << "new attribute value: " << attr.value() << std::endl;
// we can also use assignment operators for more concise code // we can also use assignment operators for more concise code
attr = true; attr = true;
std::cout << "final attribute value: " << attr.value() << std::endl; std::cout << "final attribute value: " << attr.value() << std::endl;
//] //]
} }
// vim:et

View File

@ -4,22 +4,24 @@
int main() int main()
{ {
pugi::xml_document doc; pugi::xml_document doc;
if (!doc.load("<node><description>Simple node</description><param name='id' value='123'/></node>")) return -1; if (!doc.load("<node><description>Simple node</description><param name='id' value='123'/></node>")) return -1;
//[code_modify_remove //[code_modify_remove
// remove description node with the whole subtree // remove description node with the whole subtree
pugi::xml_node node = doc.child("node"); pugi::xml_node node = doc.child("node");
node.remove_child("description"); node.remove_child("description");
// remove id attribute // remove id attribute
pugi::xml_node param = node.child("param"); pugi::xml_node param = node.child("param");
param.remove_attribute("value"); param.remove_attribute("value");
// we can also remove nodes/attributes by handles // we can also remove nodes/attributes by handles
pugi::xml_attribute id = param.attribute("name"); pugi::xml_attribute id = param.attribute("name");
param.remove_attribute(id); param.remove_attribute(id);
//] //]
doc.print(std::cout); doc.print(std::cout);
} }
// vim:et

View File

@ -7,108 +7,110 @@
//[code_save_custom_writer //[code_save_custom_writer
struct xml_string_writer: pugi::xml_writer struct xml_string_writer: pugi::xml_writer
{ {
std::string result; std::string result;
virtual void write(const void* data, size_t size) virtual void write(const void* data, size_t size)
{ {
result += std::string(static_cast<const char*>(data), size); result += std::string(static_cast<const char*>(data), size);
} }
}; };
//] //]
struct xml_memory_writer: pugi::xml_writer struct xml_memory_writer: pugi::xml_writer
{ {
char* buffer; char* buffer;
size_t capacity; size_t capacity;
size_t result; size_t result;
xml_memory_writer(): buffer(0), capacity(0), result(0) xml_memory_writer(): buffer(0), capacity(0), result(0)
{ {
} }
xml_memory_writer(char* buffer, size_t capacity): buffer(buffer), capacity(capacity), result(0) xml_memory_writer(char* buffer, size_t capacity): buffer(buffer), capacity(capacity), result(0)
{ {
} }
size_t written_size() const size_t written_size() const
{ {
return result < capacity ? result : capacity; return result < capacity ? result : capacity;
} }
virtual void write(const void* data, size_t size) virtual void write(const void* data, size_t size)
{ {
if (result < capacity) if (result < capacity)
{ {
size_t chunk = (capacity - result < size) ? capacity - result : size; size_t chunk = (capacity - result < size) ? capacity - result : size;
memcpy(buffer + result, data, chunk); memcpy(buffer + result, data, chunk);
} }
result += size; result += size;
} }
}; };
std::string node_to_string(pugi::xml_node node) std::string node_to_string(pugi::xml_node node)
{ {
xml_string_writer writer; xml_string_writer writer;
node.print(writer); node.print(writer);
return writer.result; return writer.result;
} }
char* node_to_buffer(pugi::xml_node node, char* buffer, size_t size) char* node_to_buffer(pugi::xml_node node, char* buffer, size_t size)
{ {
if (size == 0) return buffer; if (size == 0) return buffer;
// leave one character for null terminator // leave one character for null terminator
xml_memory_writer writer(buffer, size - 1); xml_memory_writer writer(buffer, size - 1);
node.print(writer); node.print(writer);
// null terminate // null terminate
buffer[writer.written_size()] = 0; buffer[writer.written_size()] = 0;
return buffer; return buffer;
} }
char* node_to_buffer_heap(pugi::xml_node node) char* node_to_buffer_heap(pugi::xml_node node)
{ {
// first pass: get required memory size // first pass: get required memory size
xml_memory_writer counter; xml_memory_writer counter;
node.print(counter); node.print(counter);
// allocate necessary size (+1 for null termination) // allocate necessary size (+1 for null termination)
char* buffer = new char[counter.result + 1]; char* buffer = new char[counter.result + 1];
// second pass: actual printing // second pass: actual printing
xml_memory_writer writer(buffer, counter.result); xml_memory_writer writer(buffer, counter.result);
node.print(writer); node.print(writer);
// null terminate // null terminate
buffer[writer.written_size()] = 0; buffer[writer.written_size()] = 0;
return buffer; return buffer;
} }
int main() int main()
{ {
// get a test document // get a test document
pugi::xml_document doc; pugi::xml_document doc;
doc.load("<foo bar='baz'>hey</foo>"); doc.load("<foo bar='baz'>hey</foo>");
// get contents as std::string (single pass) // get contents as std::string (single pass)
printf("contents: [%s]\n", node_to_string(doc).c_str()); printf("contents: [%s]\n", node_to_string(doc).c_str());
// get contents into fixed-size buffer (single pass) // get contents into fixed-size buffer (single pass)
char large_buf[128]; char large_buf[128];
printf("contents: [%s]\n", node_to_buffer(doc, large_buf, sizeof(large_buf))); printf("contents: [%s]\n", node_to_buffer(doc, large_buf, sizeof(large_buf)));
// get contents into fixed-size buffer (single pass, shows truncating behavior) // get contents into fixed-size buffer (single pass, shows truncating behavior)
char small_buf[22]; char small_buf[22];
printf("contents: [%s]\n", node_to_buffer(doc, small_buf, sizeof(small_buf))); printf("contents: [%s]\n", node_to_buffer(doc, small_buf, sizeof(small_buf)));
// get contents into heap-allocated buffer (two passes) // get contents into heap-allocated buffer (two passes)
char* heap_buf = node_to_buffer_heap(doc); char* heap_buf = node_to_buffer_heap(doc);
printf("contents: [%s]\n", heap_buf); printf("contents: [%s]\n", heap_buf);
delete[] heap_buf; delete[] heap_buf;
} }
// vim:et

View File

@ -4,12 +4,14 @@
int main() int main()
{ {
// get a test document // get a test document
pugi::xml_document doc; pugi::xml_document doc;
doc.load("<foo bar='baz'>hey</foo>"); doc.load("<foo bar='baz'>hey</foo>");
//[code_save_file //[code_save_file
// save document to file // save document to file
std::cout << "Saving result: " << doc.save_file("save_file_output.xml") << std::endl; std::cout << "Saving result: " << doc.save_file("save_file_output.xml") << std::endl;
//] //]
} }
// vim:et

View File

@ -4,43 +4,45 @@
int main() int main()
{ {
//[code_save_options //[code_save_options
// get a test document // get a test document
pugi::xml_document doc; pugi::xml_document doc;
doc.load("<foo bar='baz'><call>hey</call></foo>"); doc.load("<foo bar='baz'><call>hey</call></foo>");
// default options; prints // default options; prints
// <?xml version="1.0"?> // <?xml version="1.0"?>
// <foo bar="baz"> // <foo bar="baz">
// <call>hey</call> // <call>hey</call>
// </foo> // </foo>
doc.save(std::cout); doc.save(std::cout);
std::cout << std::endl; std::cout << std::endl;
// default options with custom indentation string; prints // default options with custom indentation string; prints
// <?xml version="1.0"?> // <?xml version="1.0"?>
// <foo bar="baz"> // <foo bar="baz">
// --<call>hey</call> // --<call>hey</call>
// </foo> // </foo>
doc.save(std::cout, "--"); doc.save(std::cout, "--");
std::cout << std::endl; std::cout << std::endl;
// default options without indentation; prints // default options without indentation; prints
// <?xml version="1.0"?> // <?xml version="1.0"?>
// <foo bar="baz"> // <foo bar="baz">
// <call>hey</call> // <call>hey</call>
// </foo> // </foo>
doc.save(std::cout, "\t", pugi::format_default & ~pugi::format_indent); // can also pass "" instead of indentation string for the same effect doc.save(std::cout, "\t", pugi::format_default & ~pugi::format_indent); // can also pass "" instead of indentation string for the same effect
std::cout << std::endl; std::cout << std::endl;
// raw output; prints // raw output; prints
// <?xml version="1.0"?><foo bar="baz"><call>hey</call></foo> // <?xml version="1.0"?><foo bar="baz"><call>hey</call></foo>
doc.save(std::cout, "\t", pugi::format_raw); doc.save(std::cout, "\t", pugi::format_raw);
std::cout << std::endl << std::endl; std::cout << std::endl << std::endl;
// raw output without declaration; prints // raw output without declaration; prints
// <foo bar="baz"><call>hey</call></foo> // <foo bar="baz"><call>hey</call></foo>
doc.save(std::cout, "\t", pugi::format_raw | pugi::format_no_declaration); doc.save(std::cout, "\t", pugi::format_raw | pugi::format_no_declaration);
std::cout << std::endl; std::cout << std::endl;
//] //]
} }
// vim:et

View File

@ -4,13 +4,15 @@
int main() int main()
{ {
// get a test document // get a test document
pugi::xml_document doc; pugi::xml_document doc;
doc.load("<foo bar='baz'><call>hey</call></foo>"); doc.load("<foo bar='baz'><call>hey</call></foo>");
//[code_save_stream //[code_save_stream
// save document to standard output // save document to standard output
std::cout << "Document:\n"; std::cout << "Document:\n";
doc.save(std::cout); doc.save(std::cout);
//] //]
} }
// vim:et

View File

@ -4,21 +4,23 @@
int main() int main()
{ {
//[code_save_subtree //[code_save_subtree
// get a test document // get a test document
pugi::xml_document doc; pugi::xml_document doc;
doc.load("<foo bar='baz'><call>hey</call></foo>"); doc.load("<foo bar='baz'><call>hey</call></foo>");
// print document to standard output (prints <?xml version="1.0"?><foo bar="baz"><call>hey</call></foo>) // print document to standard output (prints <?xml version="1.0"?><foo bar="baz"><call>hey</call></foo>)
doc.save(std::cout, "", pugi::format_raw); doc.save(std::cout, "", pugi::format_raw);
std::cout << std::endl; std::cout << std::endl;
// print document to standard output as a regular node (prints <foo bar="baz"><call>hey</call></foo>) // print document to standard output as a regular node (prints <foo bar="baz"><call>hey</call></foo>)
doc.print(std::cout, "", pugi::format_raw); doc.print(std::cout, "", pugi::format_raw);
std::cout << std::endl; std::cout << std::endl;
// print a subtree to standard output (prints <call>hey</call>) // print a subtree to standard output (prints <call>hey</call>)
doc.child("foo").child("call").print(std::cout, "", pugi::format_raw); doc.child("foo").child("call").print(std::cout, "", pugi::format_raw);
std::cout << std::endl; std::cout << std::endl;
//] //]
} }
// vim:et

View File

@ -5,7 +5,7 @@
int main() int main()
{ {
pugi::xml_document doc; pugi::xml_document doc;
if (!doc.load_file("xgconsole.xml")) return -1; if (!doc.load_file("xgconsole.xml")) return -1;
pugi::xml_node tools = doc.child("Profile").child("Tools"); pugi::xml_node tools = doc.child("Profile").child("Tools");
@ -47,3 +47,5 @@ int main()
} }
//] //]
} }
// vim:et

View File

@ -4,7 +4,7 @@
int main() int main()
{ {
pugi::xml_document doc; pugi::xml_document doc;
if (!doc.load_file("xgconsole.xml")) return -1; if (!doc.load_file("xgconsole.xml")) return -1;
pugi::xml_node tools = doc.child("Profile").child("Tools"); pugi::xml_node tools = doc.child("Profile").child("Tools");
@ -23,3 +23,5 @@ int main()
} }
//] //]
} }
// vim:et

View File

@ -25,7 +25,7 @@ struct allow_remote_predicate
int main() int main()
{ {
pugi::xml_document doc; pugi::xml_document doc;
if (!doc.load_file("xgconsole.xml")) return -1; if (!doc.load_file("xgconsole.xml")) return -1;
pugi::xml_node tools = doc.child("Profile").child("Tools"); pugi::xml_node tools = doc.child("Profile").child("Tools");
@ -44,3 +44,5 @@ int main()
std::cout << tools.find_child(small_timeout).attribute("Filename").value() << std::endl; std::cout << tools.find_child(small_timeout).attribute("Filename").value() << std::endl;
//] //]
} }
// vim:et

View File

@ -23,7 +23,7 @@ struct simple_walker: pugi::xml_tree_walker
int main() int main()
{ {
pugi::xml_document doc; pugi::xml_document doc;
if (!doc.load_file("tree.xml")) return -1; if (!doc.load_file("tree.xml")) return -1;
//[code_traverse_walker_traverse //[code_traverse_walker_traverse
@ -31,3 +31,5 @@ int main()
doc.traverse(walker); doc.traverse(walker);
//] //]
} }
// vim:et

View File

@ -4,38 +4,40 @@
int main() int main()
{ {
pugi::xml_document doc; pugi::xml_document doc;
if (!doc.load_file("xgconsole.xml")) return -1; if (!doc.load_file("xgconsole.xml")) return -1;
//[code_xpath_error //[code_xpath_error
// Exception is thrown for incorrect query syntax // Exception is thrown for incorrect query syntax
try try
{ {
doc.select_nodes("//nodes[#true()]"); doc.select_nodes("//nodes[#true()]");
} }
catch (const pugi::xpath_exception& e) catch (const pugi::xpath_exception& e)
{ {
std::cout << "Select failed: " << e.what() << std::endl; std::cout << "Select failed: " << e.what() << std::endl;
} }
// Exception is thrown for incorrect query semantics // Exception is thrown for incorrect query semantics
try try
{ {
doc.select_nodes("(123)/next"); doc.select_nodes("(123)/next");
} }
catch (const pugi::xpath_exception& e) catch (const pugi::xpath_exception& e)
{ {
std::cout << "Select failed: " << e.what() << std::endl; std::cout << "Select failed: " << e.what() << std::endl;
} }
// Exception is thrown for query with incorrect return type // Exception is thrown for query with incorrect return type
try try
{ {
doc.select_nodes("123"); doc.select_nodes("123");
} }
catch (const pugi::xpath_exception& e) catch (const pugi::xpath_exception& e)
{ {
std::cout << "Select failed: " << e.what() << std::endl; std::cout << "Select failed: " << e.what() << std::endl;
} }
//] //]
} }
// vim:et

View File

@ -5,30 +5,32 @@
int main() int main()
{ {
pugi::xml_document doc; pugi::xml_document doc;
if (!doc.load_file("xgconsole.xml")) return -1; if (!doc.load_file("xgconsole.xml")) return -1;
//[code_xpath_query //[code_xpath_query
// Select nodes via compiled query // Select nodes via compiled query
pugi::xpath_query query_remote_tools("/Profile/Tools/Tool[@AllowRemote='true']"); pugi::xpath_query query_remote_tools("/Profile/Tools/Tool[@AllowRemote='true']");
pugi::xpath_node_set tools = query_remote_tools.evaluate_node_set(doc); pugi::xpath_node_set tools = query_remote_tools.evaluate_node_set(doc);
std::cout << "Remote tool: "; std::cout << "Remote tool: ";
tools[2].node().print(std::cout); tools[2].node().print(std::cout);
// Evaluate numbers via compiled query // Evaluate numbers via compiled query
pugi::xpath_query query_timeouts("sum(//Tool/@Timeout)"); pugi::xpath_query query_timeouts("sum(//Tool/@Timeout)");
std::cout << query_timeouts.evaluate_number(doc) << std::endl; std::cout << query_timeouts.evaluate_number(doc) << std::endl;
// Evaluate strings via compiled query for different context nodes // Evaluate strings via compiled query for different context nodes
pugi::xpath_query query_name_valid("string-length(substring-before(@Filename, '_')) > 0 and @OutputFileMasks"); pugi::xpath_query query_name_valid("string-length(substring-before(@Filename, '_')) > 0 and @OutputFileMasks");
pugi::xpath_query query_name("concat(substring-before(@Filename, '_'), ' produces ', @OutputFileMasks)"); pugi::xpath_query query_name("concat(substring-before(@Filename, '_'), ' produces ', @OutputFileMasks)");
for (pugi::xml_node tool = doc.first_element_by_path("Profile/Tools/Tool"); tool; tool = tool.next_sibling()) for (pugi::xml_node tool = doc.first_element_by_path("Profile/Tools/Tool"); tool; tool = tool.next_sibling())
{ {
std::string s = query_name.evaluate_string(tool); std::string s = query_name.evaluate_string(tool);
if (query_name_valid.evaluate_boolean(tool)) std::cout << s << std::endl; if (query_name_valid.evaluate_boolean(tool)) std::cout << s << std::endl;
} }
//] //]
} }
// vim:et

View File

@ -4,22 +4,24 @@
int main() int main()
{ {
pugi::xml_document doc; pugi::xml_document doc;
if (!doc.load_file("xgconsole.xml")) return -1; if (!doc.load_file("xgconsole.xml")) return -1;
//[code_xpath_select //[code_xpath_select
pugi::xpath_node_set tools = doc.select_nodes("/Profile/Tools/Tool[@AllowRemote='true' and @DeriveCaptionFrom='lastparam']"); pugi::xpath_node_set tools = doc.select_nodes("/Profile/Tools/Tool[@AllowRemote='true' and @DeriveCaptionFrom='lastparam']");
std::cout << "Tools:"; std::cout << "Tools:";
for (pugi::xpath_node_set::const_iterator it = tools.begin(); it != tools.end(); ++it) for (pugi::xpath_node_set::const_iterator it = tools.begin(); it != tools.end(); ++it)
{ {
pugi::xpath_node node = *it; pugi::xpath_node node = *it;
std::cout << " " << node.node().attribute("Filename").value(); std::cout << " " << node.node().attribute("Filename").value();
} }
pugi::xpath_node build_tool = doc.select_single_node("//Tool[contains(Description, 'build system')]"); pugi::xpath_node build_tool = doc.select_single_node("//Tool[contains(Description, 'build system')]");
std::cout << "\nBuild tool: " << build_tool.node().attribute("Filename").value() << "\n"; std::cout << "\nBuild tool: " << build_tool.node().attribute("Filename").value() << "\n";
//] //]
} }
// vim:et