From a15cf65c44d5c224169c32ef5495b68c758134b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Frings-F=C3=BCrst?= Date: Sun, 18 May 2014 16:08:14 +0200 Subject: Imported Upstream version 3.3.0.2 --- xsd/documentation/cxx/tree/dbxml/index.xhtml | 348 +++++++++++++++++++++++++++ 1 file changed, 348 insertions(+) create mode 100644 xsd/documentation/cxx/tree/dbxml/index.xhtml (limited to 'xsd/documentation/cxx/tree/dbxml/index.xhtml') diff --git a/xsd/documentation/cxx/tree/dbxml/index.xhtml b/xsd/documentation/cxx/tree/dbxml/index.xhtml new file mode 100644 index 0000000..adfeb24 --- /dev/null +++ b/xsd/documentation/cxx/tree/dbxml/index.xhtml @@ -0,0 +1,348 @@ + + + + + + C++/Tree Mapping and Berkeley DB XML Integration Guide + + + + + + + + + + + +
+
+ +

Introduction

+ +

This guide shows how to integrate the + C++/Tree + mapping generated by + CodeSynthesis XSD + with + Berkeley DB XML. + + Berkeley DB XML is an embedded XML database which allows efficient + storage and query of XML instance documents. + + CodeSynthesis XSD is a W3C XML Schema to C++ data binding compiler. + + The C++/Tree mapping allows you to manipulate the data stored in XML + using objects that semantically correspond to your application + domain rather than dealing with direct representations of XML. + + For an introduction to + the Berkeley DB XML refer to the + Berkeley DB XML + Getting Started Guide. + For an introduction to the C++/Tree mapping refer to + the C++/Tree Mapping Getting Started Guide. +

+ + +

This guide describes the following four operations:

+ +
    +
  • Create a new document in DB from an object model
  • +
  • Create an object model from a document in DB
  • +
  • Create an object model from a document fragment in DB
  • +
  • Update a document fragment in DB from an object model
  • +
+ +

Our examples will be based on simple XML for book library. The XML + Schema definition for the library is in + library.xsd and is compiled by XSD + to obtain library.hxx and library.cxx. + All C++ code fragments that are presented in this guide are available + as a single program in driver.cxx. + The complete example is available in the + examples/cxx/tree/dbxml directory of the XSD distribution.

+ +

Note that due to the incomplete DOM API implementation provided by DB + XML (as of version 2.3.10), the generated code and your application + should be compiled with the DBXML_DOM macro defined in + order to avoid using unsupported parts of the API. +

+ +

A sample XML document for the library schema is presented below:

+ +
+<lib:catalog xmlns:lib="http://www.codesynthesis.com/library">
+  <book available="true" id="ES">
+    <isbn>20530902</isbn>
+    <title>The Elements of Style</title>
+    <genre>reference</genre>
+
+    <author>
+      <name>William Strunk, Jr.</name>
+      <born>1869-07-01</born>
+      <died>1946-09-26</died>
+    </author>
+
+    <author>
+      <name>E.B. White</name>
+      <born>1899-07-11</born>
+      <died>1985-10-01</died>
+    </author>
+  </book>
+</lib:catalog>
+  
+ +

Create Document from Object Model

+ +

In this step, we will programmatically create a book catalog + with one book, save it into an XmlDocument object + using one of the serialization functions generated by XSD ( + catalog_ in our case), and store the + XmlDocument object as a new document in the + DB container:

+ +
+XmlManager manager;
+XmlContainer container (manager.createContainer ("new.bdbxml"));
+XmlUpdateContext update_context (manager.createUpdateContext ());
+XmlQueryContext context (manager.createQueryContext ());
+context.setNamespace ("lib", "http://www.codesynthesis.com/library");
+
+// Create a new catalog with one book.
+//
+catalog c;
+
+book b (20530902,                        // ISBN
+        title ("The Elements of Style"), // Title
+        genre::reference,                // Genre
+        "ES");                           // ID
+
+author strunk ("William Strunk, Jr.", date (1869, 7, 1));
+strunk.died (date (1946, 9, 26));
+
+b.author ().push_back (strunk);
+c.book ().push_back (b);
+
+// Create a new XML document.
+//
+XmlDocument doc (manager.createDocument ());
+doc.setName ("new.xml");
+
+// Obtain its DOM representation and add the root element.
+//
+xercesc::DOMDocument& dom_doc (*doc.getContentAsDOM ());
+
+dom_doc.appendChild (
+  dom_doc.createElementNS (
+    xml::string ("http://www.codesynthesis.com/library").c_str (),
+    xml::string ("lib:catalog").c_str ()));
+
+// Serialize the object model to the XML document. Also avoid
+// re-initializing the Xerces-C++ runtime since XmlManager has
+// it initialized.
+//
+catalog_ (dom_doc, c, xml_schema::flags::dont_initialize);
+
+// Place the document into the container.
+//
+container.putDocument (doc, update_context);
+  
+ +

If we now resolve the new.xml in the container and + print its content, we will get:

+ +
+<lib:catalog xmlns:lib="http://www.codesynthesis.com/library">
+  <book available="true" id="ES">
+    <isbn>20530902</isbn>
+    <title>The Elements of Style</title>
+    <genre>reference</genre>
+    <author>
+      <name>William Strunk, Jr.</name>
+      <born>1869-07-01</born>
+      <died>1946-09-26</died>
+    </author>
+  </book>
+</lib:catalog>
+  
+ +

Create Object Model from Document

+ +

Creating an object model from a document is a matter + of obtaining XmlDocument object and passing its DOM + representation to one of the parsing functions generated by XSD + (catalog_ in our case): +

+ +
+// Resolve the document in the container.
+//
+XmlDocument doc (container.getDocument ("new.xml"));
+
+// Create the object model from the document's DOM. Also avoid
+// re-initializing the Xerces-C++ runtime since XmlManager has
+// it initialized.
+//
+auto_ptr<catalog> c (catalog_ (*doc.getContentAsDOM (),
+                               xml_schema::flags::dont_initialize));
+
+cerr << *c << endl;
+  
+ +

This code fragment prints:

+ +
+book:
+isbn: 20530902
+title: The Elements of Style
+genre: reference
+author:
+name: William Strunk, Jr.
+born: 1869-07-01
+died: 1946-09-26
+available: 1
+id: ES
+  
+ +

Create Object Model from Document Fragment

+ +

The following code fragment looks up the book with id "ES" + using XQuery. It then creates a book object from the + resulting XmlValue:

+ +
+string query ("collection('new.bdbxml')/lib:catalog/book[@id='ES']");
+
+// Find "The Elements of Style".
+//
+XmlValue v;
+XmlResults results (manager.query (query, context));
+
+if (results.next (v))
+{
+  // Create an object model from the document fragment.
+  //
+  auto_ptr<book> b (
+    new book (
+      *static_cast<xercesc::DOMElement*> (v.asNode ())));
+
+  cerr << *b << endl;
+}
+  
+ +

This code fragment prints:

+ +
+isbn: 20530902
+title: The Elements of Style
+genre: reference
+author:
+name: William Strunk, Jr.
+born: 1869-07-01
+died: 1946-09-26
+available: 1
+id: ES
+  
+ +

Note that we had to perform a static_cast from + xercesc::DOMNode + returned by the XmlValue::asNode member function to + xercesc::DOMElement. This is safe since we know + that in our schema books are represented as XML elements.

+ +

Update Document Fragment from Object Model

+ +

Analogous to the create case, the following code fragment looks + up the book with id "ES" using XQuery. It then creates + a book object from the resulting XmlValue, + adds another author, changes the availability status, and saves + the changes back to the XmlValue object: +

+ +
+string query ("collection('new.bdbxml')/lib:catalog/book[@id='ES']");
+
+// Find "The Elements of Style".
+//
+XmlValue v;
+XmlResults results (manager.query (query, context));
+
+if (results.next (v))
+{
+  // Create an object model from the document fragment.
+  //
+  auto_ptr<book> b (
+    new book (
+      *static_cast<xercesc::DOMElement*> (v.asNode ())));
+
+  // Add another author, change the availability status.
+  //
+  author white ("E.B. White", date (1899, 7, 11));
+  white.died (date (1985, 10, 1));
+
+  b->author ().push_back (white);
+  b->available (false);
+
+  // Update the document fragment from the object model.
+  //
+  *static_cast<xercesc::DOMElement*> (v.asNode ()) << *b;
+
+  // Update the document in the container.
+  //
+  XmlDocument doc (v.asDocument ());
+  container.updateDocument (doc, update_context);
+}
+  
+ +

If we now resolve the new.xml in the container and + print its content, we will get:

+ +
+<lib:catalog xmlns:lib="http://www.codesynthesis.com/library">
+  <book available="false" id="ES">
+    <isbn>20530902</isbn>
+    <title>The Elements of Style</title>
+    <genre>reference</genre>
+    <author>
+      <name>William Strunk, Jr.</name>
+      <born>1869-07-01</born>
+      <died>1946-09-26</died>
+    </author>
+    <author>
+      <name>E.B. White</name>
+      <born>1899-07-11</born>
+      <died>1985-10-01</died>
+    </author>
+  </book>
+</lib:catalog>
+  
+ +
+ + +
+ + + -- cgit v1.2.3