summaryrefslogtreecommitdiff
path: root/docs/samples/include.cpp
diff options
context:
space:
mode:
authorarseny.kapoulkine <arseny.kapoulkine@99668b35-9821-0410-8761-19e4c4f06640>2010-07-08 04:34:03 +0000
committerarseny.kapoulkine <arseny.kapoulkine@99668b35-9821-0410-8761-19e4c4f06640>2010-07-08 04:34:03 +0000
commit6d0f60a808f419d6acaf54f020b2d53a00d843ba (patch)
tree0005d8e8b48a1a44afa0f40cc10829f79f217168 /docs/samples/include.cpp
parentc3e70f0b74a77d8aa0296c7991eb9768280426da (diff)
docs: Added document modification documentation
git-svn-id: http://pugixml.googlecode.com/svn/trunk@574 99668b35-9821-0410-8761-19e4c4f06640
Diffstat (limited to 'docs/samples/include.cpp')
-rw-r--r--docs/samples/include.cpp62
1 files changed, 62 insertions, 0 deletions
diff --git a/docs/samples/include.cpp b/docs/samples/include.cpp
new file mode 100644
index 0000000..528d016
--- /dev/null
+++ b/docs/samples/include.cpp
@@ -0,0 +1,62 @@
+#include "pugixml.hpp"
+
+#include <string.h>
+#include <iostream>
+
+//[code_include
+bool load_preprocess(pugi::xml_document& doc, const char* path);
+
+bool preprocess(pugi::xml_node node)
+{
+ for (pugi::xml_node child = node.first_child(); child; )
+ {
+ if (child.type() == pugi::node_pi && strcmp(child.name(), "include") == 0)
+ {
+ pugi::xml_node include = child;
+
+ // load new preprocessed document (note: ideally this should handle relative paths)
+ const char* path = include.value();
+
+ pugi::xml_document doc;
+ if (!load_preprocess(doc, path)) return false;
+
+ // insert the comment marker above include directive
+ node.insert_child_before(pugi::node_comment, include).set_value(path);
+
+ // 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())
+ {
+ node.insert_copy_before(ic, include);
+ }
+
+ // remove the include node and move to the next child
+ child = child.next_sibling();
+
+ node.remove_child(include);
+ }
+ else
+ {
+ if (!preprocess(child)) return false;
+
+ child = child.next_sibling();
+ }
+ }
+
+ return true;
+}
+
+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?>
+
+ return result ? preprocess(doc) : false;
+}
+//]
+
+int main()
+{
+ pugi::xml_document doc;
+ if (!load_preprocess(doc, "character.xml")) return -1;
+
+ doc.print(std::cout);
+}