diff options
author | Karen Arutyunov <karen@codesynthesis.com> | 2020-12-18 18:48:46 +0300 |
---|---|---|
committer | Karen Arutyunov <karen@codesynthesis.com> | 2021-02-25 13:45:48 +0300 |
commit | 5e527213a2430bb3018e5eebd909aef294edf9b5 (patch) | |
tree | 94de33c82080b53d9a9e300170f6d221d89078f4 /xsd-examples/cxx/tree/custom/calendar | |
parent | 7420f85ea19b0562ffdd8123442f32bc8bac1267 (diff) |
Switch to build2
Diffstat (limited to 'xsd-examples/cxx/tree/custom/calendar')
-rw-r--r-- | xsd-examples/cxx/tree/custom/calendar/.gitignore | 2 | ||||
-rw-r--r-- | xsd-examples/cxx/tree/custom/calendar/README | 47 | ||||
-rw-r--r-- | xsd-examples/cxx/tree/custom/calendar/buildfile | 47 | ||||
-rw-r--r-- | xsd-examples/cxx/tree/custom/calendar/calendar.xml | 22 | ||||
-rw-r--r-- | xsd-examples/cxx/tree/custom/calendar/calendar.xsd | 31 | ||||
-rw-r--r-- | xsd-examples/cxx/tree/custom/calendar/driver.cxx | 39 | ||||
-rw-r--r-- | xsd-examples/cxx/tree/custom/calendar/xml-schema-custom.cxx | 56 | ||||
-rw-r--r-- | xsd-examples/cxx/tree/custom/calendar/xml-schema-custom.hxx | 33 |
8 files changed, 277 insertions, 0 deletions
diff --git a/xsd-examples/cxx/tree/custom/calendar/.gitignore b/xsd-examples/cxx/tree/custom/calendar/.gitignore new file mode 100644 index 0000000..2f35b6b --- /dev/null +++ b/xsd-examples/cxx/tree/custom/calendar/.gitignore @@ -0,0 +1,2 @@ +calendar.?xx +xml-schema.hxx diff --git a/xsd-examples/cxx/tree/custom/calendar/README b/xsd-examples/cxx/tree/custom/calendar/README new file mode 100644 index 0000000..f7f6989 --- /dev/null +++ b/xsd-examples/cxx/tree/custom/calendar/README @@ -0,0 +1,47 @@ +This example shows how to customize the XML Schema built-in types by mapping +xsd:date built-in type to the date class from the Boost date_time library. +You will need the Boost date_time library[1] installed in order to build +and run this example. For more information on the C++/Tree mapping +customization see the C++/Tree Mapping Customization Guide[2]. + +[1] http://www.boost.org +[2] http://wiki.codesynthesis.com/Tree/Customization_guide + +The example consists of the following files: + +calendar.xsd + XML Schema definition for a simple calendar format. + +calendar.xml + Sample XML instance document. + +xml-schema.hxx + C++ types for XML Schema built-in types. This header file is generated + by XSD using the --generate-xml-schema option. The --custom-type option + is also used to customize the xsd:date type. + +calendar.hxx +calendar.ixx +calendar.cxx + C++ types that represent the given vocabulary and a set of parsing + functions that convert XML instance documents to a tree-like in-memory + object model. These are generated by XSD from calendar.xsd with the + --extern-xml-schema option in order to include xml-schema.hxx. + +xml-schema-custom.hxx + Header file which defines our own xml_schema::date class. It is + included at the end of xml-schema.hxx using the --hxx-epilogue + option. + +xml-schema-custom.cxx + Source file which contains the implementation of our xml_schema:date + 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 calendar events to STDERR. + +To run the example on the sample XML instance document simply execute: + +$ ./driver calendar.xml diff --git a/xsd-examples/cxx/tree/custom/calendar/buildfile b/xsd-examples/cxx/tree/custom/calendar/buildfile new file mode 100644 index 0000000..3c26122 --- /dev/null +++ b/xsd-examples/cxx/tree/custom/calendar/buildfile @@ -0,0 +1,47 @@ +# file : cxx/tree/custom/calendar/buildfile +# license : not copyrighted - public domain + +import libs = libxsd%lib{xsd} +import libs += libxerces-c%lib{xerces-c} +import libs += libboost-date-time%lib{boost_date_time} + +./: exe{driver} doc{README} + +exe{driver}: {hxx cxx}{* -calendar -xml-schema} \ + {hxx ixx cxx}{calendar} \ + {hxx }{xml-schema} \ + $libs + +exe{driver}: xml{calendar}: test.input = true + +<{hxx ixx cxx}{calendar}>: xsd{calendar} $xsd +{{ + diag xsd ($<[0]) # @@ TMP + + $xsd cxx-tree --std c++11 \ + --generate-inline \ + --extern-xml-schema xml-schema.xsd \ + --output-dir $out_base \ + $path($<[0]) +}} + +hxx{xml-schema}: $xsd +{{ + diag xsd gen ($>[0]) + + # Note that the specified xml-schema.xsd doesn't exist and is only used to + # deduce the generated header name. + # + $xsd cxx-tree --std c++11 \ + --generate-xml-schema \ + --custom-type date \ + --hxx-epilogue '#include "xml-schema-custom.hxx"' \ + --output-dir $out_base \ + xml-schema.xsd +}} + +cxx.poptions =+ "-I$out_base" "-I$src_base" + +# Define XSD_CXX11 since we include libxsd headers directly. +# +cxx.poptions += -DXSD_CXX11 diff --git a/xsd-examples/cxx/tree/custom/calendar/calendar.xml b/xsd-examples/cxx/tree/custom/calendar/calendar.xml new file mode 100644 index 0000000..8fff59c --- /dev/null +++ b/xsd-examples/cxx/tree/custom/calendar/calendar.xml @@ -0,0 +1,22 @@ +<?xml version="1.0"?> + +<!-- + +file : cxx/tree/custom/calendar/calendar.xml +copyright : not copyrighted - public domain + +--> + +<cal:events xmlns:cal="http://www.codesynthesis.com/calendar" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.codesynthesis.com/calendar calendar.xsd"> + + <event title="Bike ride" date="2006-09-04"> + Don't forget to change the tire. + </event> + + <event title="Mountain hike" date="2006-09-05"> + Can be cancelled if it is too cold. + </event> + +</cal:events> diff --git a/xsd-examples/cxx/tree/custom/calendar/calendar.xsd b/xsd-examples/cxx/tree/custom/calendar/calendar.xsd new file mode 100644 index 0000000..8b36c34 --- /dev/null +++ b/xsd-examples/cxx/tree/custom/calendar/calendar.xsd @@ -0,0 +1,31 @@ +<?xml version="1.0"?> + +<!-- + +file : cxx/tree/custom/calendar/calendar.xsd +copyright : not copyrighted - public domain + +--> + +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:cal="http://www.codesynthesis.com/calendar" + targetNamespace="http://www.codesynthesis.com/calendar"> + + <xsd:complexType name="event"> + <xsd:simpleContent> + <xsd:extension base="xsd:string"> + <xsd:attribute name="title" type="xsd:string" use="required"/> + <xsd:attribute name="date" type="xsd:date" use="required"/> + </xsd:extension> + </xsd:simpleContent> + </xsd:complexType> + + <xsd:complexType name="events"> + <xsd:sequence> + <xsd:element name="event" type="cal:event" maxOccurs="unbounded"/> + </xsd:sequence> + </xsd:complexType> + + <xsd:element name="events" type="cal:events"/> + +</xsd:schema> diff --git a/xsd-examples/cxx/tree/custom/calendar/driver.cxx b/xsd-examples/cxx/tree/custom/calendar/driver.cxx new file mode 100644 index 0000000..fdecf57 --- /dev/null +++ b/xsd-examples/cxx/tree/custom/calendar/driver.cxx @@ -0,0 +1,39 @@ +// file : cxx/tree/custom/calendar/driver.cxx +// copyright : not copyrighted - public domain + +#include <memory> // std::unique_ptr +#include <iostream> + +#include "calendar.hxx" + +using std::cerr; +using std::endl; + +int +main (int argc, char* argv[]) +{ + if (argc != 2) + { + cerr << "usage: " << argv[0] << " calendar.xml" << endl; + return 1; + } + + try + { + using namespace calendar; + + std::unique_ptr<events> e (events_ (argv[1])); + + for (events::event_const_iterator i (e->event ().begin ()); + i != e->event ().end (); ++i) + { + cerr << i->date () << " " << i->title () << endl + << *i << endl; + } + } + catch (const xml_schema::exception& e) + { + cerr << e << endl; + return 1; + } +} diff --git a/xsd-examples/cxx/tree/custom/calendar/xml-schema-custom.cxx b/xsd-examples/cxx/tree/custom/calendar/xml-schema-custom.cxx new file mode 100644 index 0000000..2bfe0f2 --- /dev/null +++ b/xsd-examples/cxx/tree/custom/calendar/xml-schema-custom.cxx @@ -0,0 +1,56 @@ +// file : cxx/tree/custom/calendar/xml-schema-custom.cxx +// copyright : not copyrighted - public domain + +// Include xml-schema.hxx instead of xml-schema-custom.hxx here. +// +#include "xml-schema.hxx" + +#include <xsd/cxx/xml/string.hxx> // xsd::cxx::xml::transcode +#include <xsd/cxx/tree/text.hxx> // xsd::cxx::tree::text_content + +using namespace boost; +using namespace boost::gregorian; + +namespace xml_schema +{ + date:: + date (const xercesc::DOMElement& e, flags f, container* c) + : simple_type (e, f, c), + gregorian::date ( + from_simple_string ( + xsd::cxx::tree::text_content<char> (e))) + { + } + + date:: + date (const xercesc::DOMAttr& a, flags f, container* c) + : simple_type (a, f, c), + gregorian::date ( + from_simple_string ( + xsd::cxx::xml::transcode<char> (a.getValue ()))) + { + } + + date:: + date (const std::string& s, + const xercesc::DOMElement* e, + flags f, + container* c) + : simple_type (s, e, f, c), + gregorian::date (from_simple_string (s)) + { + } + + date:: + date (const date& d, flags f, container* c) + : simple_type (d, f, c), + gregorian::date (d) + { + } + + date* date:: + _clone (flags f, container* c) const + { + return new date (*this, f, c); + } +} diff --git a/xsd-examples/cxx/tree/custom/calendar/xml-schema-custom.hxx b/xsd-examples/cxx/tree/custom/calendar/xml-schema-custom.hxx new file mode 100644 index 0000000..f8f8218 --- /dev/null +++ b/xsd-examples/cxx/tree/custom/calendar/xml-schema-custom.hxx @@ -0,0 +1,33 @@ +// file : cxx/tree/custom/calendar/xml-schema-custom.hxx +// copyright : not copyrighted - public domain + +// Do not include this file directly, use xml-schema.hxx instead. This +// file is included into generated xml-schema.hxx so we do not need to +// guard against multiple inclusions. +// + +#include <boost/date_time/gregorian/gregorian.hpp> // boost::gregorian::date + +namespace xml_schema +{ + class date: public simple_type, + public boost::gregorian::date + { + public: + // Parsing c-tors: element, attribute, and list item. + // + date (const xercesc::DOMElement&, flags = 0, container* = 0); + date (const xercesc::DOMAttr&, flags = 0, container* = 0); + date (const std::string&, + const xercesc::DOMElement*, + flags = 0, + container* = 0); + + // Copy c-tor and _clone. + // + date (const date&, flags = 0, container* = 0); + + virtual date* + _clone (flags = 0, container* = 0) const; + }; +} |