From 5e527213a2430bb3018e5eebd909aef294edf9b5 Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Fri, 18 Dec 2020 18:48:46 +0300 Subject: Switch to build2 --- xsd-examples/cxx/tree/custom/wildcard/.gitignore | 1 + xsd-examples/cxx/tree/custom/wildcard/README | 45 ++++++++++++ xsd-examples/cxx/tree/custom/wildcard/buildfile | 27 +++++++ xsd-examples/cxx/tree/custom/wildcard/driver.cxx | 47 ++++++++++++ .../cxx/tree/custom/wildcard/wildcard-custom.cxx | 84 ++++++++++++++++++++++ .../cxx/tree/custom/wildcard/wildcard-custom.hxx | 66 +++++++++++++++++ xsd-examples/cxx/tree/custom/wildcard/wildcard.xml | 14 ++++ xsd-examples/cxx/tree/custom/wildcard/wildcard.xsd | 25 +++++++ 8 files changed, 309 insertions(+) create mode 100644 xsd-examples/cxx/tree/custom/wildcard/.gitignore create mode 100644 xsd-examples/cxx/tree/custom/wildcard/README create mode 100644 xsd-examples/cxx/tree/custom/wildcard/buildfile create mode 100644 xsd-examples/cxx/tree/custom/wildcard/driver.cxx create mode 100644 xsd-examples/cxx/tree/custom/wildcard/wildcard-custom.cxx create mode 100644 xsd-examples/cxx/tree/custom/wildcard/wildcard-custom.hxx create mode 100644 xsd-examples/cxx/tree/custom/wildcard/wildcard.xml create mode 100644 xsd-examples/cxx/tree/custom/wildcard/wildcard.xsd (limited to 'xsd-examples/cxx/tree/custom/wildcard') diff --git a/xsd-examples/cxx/tree/custom/wildcard/.gitignore b/xsd-examples/cxx/tree/custom/wildcard/.gitignore new file mode 100644 index 0000000..f32cbe8 --- /dev/null +++ b/xsd-examples/cxx/tree/custom/wildcard/.gitignore @@ -0,0 +1 @@ +wildcard.?xx diff --git a/xsd-examples/cxx/tree/custom/wildcard/README b/xsd-examples/cxx/tree/custom/wildcard/README new file mode 100644 index 0000000..70eaea4 --- /dev/null +++ b/xsd-examples/cxx/tree/custom/wildcard/README @@ -0,0 +1,45 @@ +This example shows how to use type customization to parse and serialize +a specific attribute that is matched by a wildcard (anyAttribute). The +example achieves this by customizing the type to include the data +members and accessors/modifiers that represent the attribute as well as +the parsing constructor and serialization operator where the attribute +value is extracted from and inserted back to DOM, respectively. For +more information on the C++/Tree mapping customization see the C++/Tree +Mapping Customization Guide[1]. + +[1] http://wiki.codesynthesis.com/Tree/Customization_guide + +The example consists of the following files: + +wildcard.xsd + XML Schema definition for simple data type and element. + +wildcard.xml + Sample XML instance document. + +wildcard.hxx +wildcard.ixx +wildcard.cxx + C++ types that represent the given vocabulary, a set of parsing + functions that convert XML instance documents to a tree-like in-memory + object model, and a set of serialization functions that convert the + object model back to XML. These are generated by XSD from wildcard.xsd + with the --custom-type option in order to customize the data type. + +wildcard-custom.hxx + Header file which defines our own data class by inheriting from the + generated data_base. It is included at the end of wildcard.hxx using + the --hxx-epilogue option. + +wildcard-custom.cxx + Source file which contains the implementation of our data class. + +driver.cxx + Driver for the example. It first calls one of the parsing functions + that constructs the object model from the input file. It then prints + the data to STDERR, including the extra attribute. Finally, the driver + serializes the object model back to XML. + +To run the example on the sample XML instance document simply execute: + +$ ./driver wildcard.xml diff --git a/xsd-examples/cxx/tree/custom/wildcard/buildfile b/xsd-examples/cxx/tree/custom/wildcard/buildfile new file mode 100644 index 0000000..e386709 --- /dev/null +++ b/xsd-examples/cxx/tree/custom/wildcard/buildfile @@ -0,0 +1,27 @@ +# file : cxx/tree/custom/wildcard/buildfile +# license : not copyrighted - public domain + +import libs = libxsd%lib{xsd} +import libs += libxerces-c%lib{xerces-c} + +./: exe{driver} doc{README} + +exe{driver}: {hxx cxx}{* -wildcard} {hxx ixx cxx}{wildcard} $libs + +exe{driver}: xml{wildcard}: test.input = true + +<{hxx ixx cxx}{wildcard}>: xsd{wildcard} $xsd +{{ + diag xsd ($<[0]) # @@ TMP + + $xsd cxx-tree --std c++11 \ + --generate-inline \ + --generate-serialization \ + --generate-ostream \ + --custom-type data=/data_base \ + --hxx-epilogue '#include "wildcard-custom.hxx"' \ + --output-dir $out_base \ + $path($<[0]) +}} + +cxx.poptions =+ "-I$out_base" "-I$src_base" diff --git a/xsd-examples/cxx/tree/custom/wildcard/driver.cxx b/xsd-examples/cxx/tree/custom/wildcard/driver.cxx new file mode 100644 index 0000000..43fae82 --- /dev/null +++ b/xsd-examples/cxx/tree/custom/wildcard/driver.cxx @@ -0,0 +1,47 @@ +// file : cxx/tree/custom/wildcard/driver.cxx +// copyright : not copyrighted - public domain + +#include // std::unique_ptr +#include + +#include "wildcard.hxx" + +using std::cerr; +using std::endl; + +int +main (int argc, char* argv[]) +{ + if (argc != 2) + { + cerr << "usage: " << argv[0] << " wildcard.xml" << endl; + return 1; + } + + try + { + using namespace wildcard; + + // Parse. + // + std::unique_ptr d (data_ (argv[1])); + + // Print. + // + cerr << *d << endl; + + // Serialize. + // + xml_schema::namespace_infomap map; + + map["wc"].name = "http://www.codesynthesis.com/wildcard"; + map["wc"].schema = "wildcard.xsd"; + + data_ (std::cout, *d, map); + } + catch (const xml_schema::exception& e) + { + cerr << e << endl; + return 1; + } +} diff --git a/xsd-examples/cxx/tree/custom/wildcard/wildcard-custom.cxx b/xsd-examples/cxx/tree/custom/wildcard/wildcard-custom.cxx new file mode 100644 index 0000000..16798d2 --- /dev/null +++ b/xsd-examples/cxx/tree/custom/wildcard/wildcard-custom.cxx @@ -0,0 +1,84 @@ +// file : cxx/tree/custom/wildcard/wildcard-custom.cxx +// copyright : not copyrighted - public domain + +#include + +// Include wildcard.hxx instead of wildcard-custom.hxx here. +// +#include "wildcard.hxx" + +namespace wildcard +{ + data:: + data (const xml_schema::string& d) + : data_base (d), scope_present_ (false) + { + } + + data:: + data (const xercesc::DOMElement& e, + xml_schema::flags f, + xml_schema::container* c) + : data_base (e, f, c), scope_present_ (false) + { + // Check if we've got the scope attribute. + // + namespace xml = xsd::cxx::xml; + xml::string name ("scope"); + + if (e.hasAttribute (name.c_str ())) + { + scope (xml::transcode (e.getAttribute (name.c_str ()))); + } + } + + data:: + data (const data& d, + xml_schema::flags f, + xml_schema::container* c) + : data_base (d, f, c), + scope_present_ (d.scope_present_), + scope_ (d.scope_) + { + } + + data* data:: + _clone (xml_schema::flags f, xml_schema::container* c) const + { + return new data (*this, f, c); + } + + void + operator<< (xercesc::DOMElement& e, const data& x) + { + // Use our base to serialize data and id. + // + const data_base& b (x); + e << b; + + // Add the scope attribute if present. + // + if (x.scope_present ()) + { + namespace xml = xsd::cxx::xml; + xml::string name ("scope"); + xml::string value (x.scope ()); + + e.setAttribute (name.c_str (), value.c_str ()); + } + } + + std::ostream& + operator<< (std::ostream& os, const data& x) + { + // Use our base to print date and id. + // + const data_base& b (x); + os << b; + + if (x.scope_present ()) + os << std::endl << "scope: " << x.scope (); + + return os; + } +} diff --git a/xsd-examples/cxx/tree/custom/wildcard/wildcard-custom.hxx b/xsd-examples/cxx/tree/custom/wildcard/wildcard-custom.hxx new file mode 100644 index 0000000..e789a86 --- /dev/null +++ b/xsd-examples/cxx/tree/custom/wildcard/wildcard-custom.hxx @@ -0,0 +1,66 @@ +// file : cxx/tree/custom/wildcard/wildcard-custom.hxx +// copyright : not copyrighted - public domain + +// Do not include this file directly, use wildcard.hxx instead. This +// file is included into generated wildcard.hxx so we do not need to +// guard against multiple inclusions. +// + +namespace wildcard +{ + class data: public data_base + { + // Standard constructors. + // + public: + data (const xml_schema::string&); + + data (const xercesc::DOMElement&, + xml_schema::flags = 0, + xml_schema::container* = 0); + + data (const data&, + xml_schema::flags = 0, + xml_schema::container* = 0); + + virtual data* + _clone (xml_schema::flags = 0, + xml_schema::container* = 0) const; + + // Our customizations. + // + public: + bool + scope_present () const + { + return scope_present_; + } + + const xml_schema::string& + scope () const + { + return scope_; + } + + void + scope (const xml_schema::string& s) + { + scope_present_ = true; + scope_ = s; + } + + private: + bool scope_present_; + xml_schema::string scope_; + }; + + // Serialization operator. + // + void + operator<< (xercesc::DOMElement&, const data&); + + // std::ostream insertion operator. + // + std::ostream& + operator<< (std::ostream&, const data&); +} diff --git a/xsd-examples/cxx/tree/custom/wildcard/wildcard.xml b/xsd-examples/cxx/tree/custom/wildcard/wildcard.xml new file mode 100644 index 0000000..8f6ba65 --- /dev/null +++ b/xsd-examples/cxx/tree/custom/wildcard/wildcard.xml @@ -0,0 +1,14 @@ + + + + +abc123 diff --git a/xsd-examples/cxx/tree/custom/wildcard/wildcard.xsd b/xsd-examples/cxx/tree/custom/wildcard/wildcard.xsd new file mode 100644 index 0000000..a19be3f --- /dev/null +++ b/xsd-examples/cxx/tree/custom/wildcard/wildcard.xsd @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + -- cgit v1.1