"XML for C++ Developers"
XML 1-3, p.18
 
Listing 1
 
<?xml version ="1.0"?>
<schema name = "posample.xsd"
xmlns = "http://www.w3.org/1999/05/06-xmlschema-
1/structures.xsd">
<elementType name = "PurchaseOrder" model = "open">
<sequence>
<elementTypeRef name = "Buyer"/>
<elementTypeRef name = "Seller"/>
<elementTypeRef name = "Items"
minOccur = "1"
maxOccur = "*"/>
</sequence>
<attrDecl name = "PONumber" required = "true">
<datatypeRef name = "number"/>
</attrDecl>
<attrDecl name = "Date" required = "true">
<datatypeRef name = "date"/>
</attrDecl>
</elementType>
<attrDecl name = "PONumber" required = "true">
<datatypeRef name = "number"/>
</attrDecl>
<attrDecl name = "Date" required = "true">
<datatypeRef name = "date"/>
</attrDecl>
<elementType name = "CompanyName" model = "open">
<datatypeRef name = "string"/>
</elementType>
<elementType name = "BuyingAgent" model = "open">
<datatypeRef name = "string"/>
</elementType>
<elementType name = "Address" model = "open">
<datatypeRef name = "string"/>
</elementType>
<elementType name = "City" model = "open">
<datatypeRef name = "string"/>
</elementType>
<elementType name = "State" model = "open">
<datatypeRef name = "string"/>
</elementType>
<elementType name = "Zip" model = "open">
<datatypeRef name = "string"/>
</elementType>
<elementType name = "Buyer" model = "open">
<sequence>
<elementTypeRef name = "BuyingAgent"/>
<elementTypeRef name = "CompanyName"/>
<elementTypeRef name = "Address"/>
<elementTypeRef name = "City"/>
<elementTypeRef name = "State"/>
<elementTypeRef name = "Zip"/>
</sequence>
</elementType>
<elementType name = "Seller" model = "open">
<sequence>
<elementTypeRef name = "CompanyName"/>
<elementTypeRef name = "Address"/>
<elementTypeRef name = "City"/>
<elementTypeRef name = "State"/>
<elementTypeRef name = "Zip"/>
</sequence>
</elementType>
<elementType name = "Items" model = "open">
<datatypeRef name = "string"/>
<attrDecl name = "PartNumber" required = "true">
<datatypeRef name = "string"/>
</attrDecl>
<attrDecl name = "Quantity" required = "true">
<datatypeRef name = "integer"/>
</attrDecl>
<attrDecl name = "Price" required = "true">
<datatypeRef name = "real"/>
</attrDecl>
</elementType>
<attrDecl name = "PartNumber" required = "true">
<datatypeRef name = "string"/>
</attrDecl>
<attrDecl name = "Quantity" required = "true">
<datatypeRef name = "integer"/>
</attrDecl>
<attrDecl name = "Price" required = "true">
<datatypeRef name = "real"/>
</attrDecl>
</schema>
 
Listing 2
 
// ---------------------------------------------------------------------------
// Includes
// ---------------------------------------------------------------------------
#include <util/PlatformUtils.hpp>
#include <parsers/DOMParser.hpp>
#include <dom/DOM_Node.hpp>
#include <dom/DOM_NamedNodeMap.hpp>
#include "DOMTreeErrorReporter.hpp"
#include <string.h>
#include <stdlib.h>
// ---------------------------------------------------------------------------
//
// main
//
// ---------------------------------------------------------------------------
struct {
char *PartNumber;
char *Quantity;
char *Price; // Yuck, DOM can't handle numbers!
} items[] = {
"123456-7890", "4", "10.20",
"234567-8901", "5", "23.21",
"098765-4321", "2", "98.42",
NULL, NULL, NULL
};
int main(int argC, char* argV[])
{
// Initialize the XML4C2 system
try
{
XMLPlatformUtils::Initialize();
}
catch(const XMLException& toCatch)
{
cerr << "Error during Xerces-c Initialization.\n"
<< " Exception message:"
<< DOMString(toCatch.getMessage()) << endl;
return 1;
}
// create a DOM Document node
DOM_Document PODoc = DOM_Document::createDocument();
DOM_Text tab = PODoc.createTextNode(DOMString("\t"));
// create the root node for a PO
DOM_Node PO = PODoc.createElement("PurchaseOrder");
PODoc.appendChild(PO);
// set the PONumber
DOM_Attr PONumber = PODoc.createAttribute("PONumber");
PONumber.setValue(DOMString("12345")); // strings only, yuck!
DOM_NamedNodeMap attrs = PO.getAttributes();
attrs.setNamedItem(PONumber);
// set the PONumber
DOM_Attr PODate = PODoc.createAttribute("Date");
PODate.setValue(DOMString("March 30, 2000")); // strings
only, yuck!
attrs.setNamedItem(PODate);
//
// create the Buyer Info
//
DOM_Node Buyer = PODoc.createElement("Buyer");
PO.appendChild(Buyer);
// set the Buyer subelements
// first, the agent's name
DOM_Node BuyingAgent =
PODoc.createElement(DOMString("BuyingAgent"));
DOM_Text BuyingAgentName = PODoc.createTextNode(DOM-
String("J.Q. Buyer"));
Buyer.appendChild(BuyingAgent);
BuyingAgent.appendChild(BuyingAgentName);
// next, the buyer's company
DOM_Node BuyerCompany =
PODoc.createElement(DOMString("CompanyName"));
DOM_Text BuyerCompanyName = PODoc.createTextNode(DOM-
String("Acme Buying, Inc."));
BuyerCompany.appendChild(BuyerCompanyName);
Buyer.appendChild(BuyerCompany);
// next, the buyer's address
DOM_Node BuyerAddress =
PODoc.createElement(DOMString("Address"));
DOM_Text BuyerAddressName = PODoc.createTextNode(DOM-
String("123 21st Street"));
BuyerAddress.appendChild(BuyerAddressName);
Buyer.appendChild(BuyerAddress);
// next, the buyer's city
DOM_Node BuyerCity =
PODoc.createElement(DOMString("City"));
DOM_Text BuyerCityName = PODoc.createTextNode(DOM-
String("New York"));
BuyerCity.appendChild(BuyerCityName);
Buyer.appendChild(BuyerCity);
// next, the buyer's state
DOM_Node BuyerState =
PODoc.createElement(DOMString("State"));
DOM_Text BuyerStateName = PODoc.createTextNode(DOM-
String("NY"));
BuyerState.appendChild(BuyerStateName);
Buyer.appendChild(BuyerState);
// finally, the buyer's zip
DOM_Node BuyerZip =
PODoc.createElement(DOMString("Zip"));
DOM_Text BuyerZipName = PODoc.createTextNode(DOM-
String("01234"));
BuyerZip.appendChild(BuyerZipName);
Buyer.appendChild(BuyerZip);
//
// create the Seller Info
//
DOM_Node Seller = PODoc.createElement("Seller");
PO.appendChild(Seller);
// set the Seller subelements
// first, the Seller's company
DOM_Node SellerCompany =
PODoc.createElement(DOMString("CompanyName"));
DOM_Text SellerCompanyName = PODoc.createTextNode(DOM-
String("Zeta Selling, Inc."));
SellerCompany.appendChild(SellerCompanyName);
Seller.appendChild(SellerCompany);
String("Zeta Selling, Inc."));
SellerCompany.appendChild(SellerCompanyName);
Seller.appendChild(SellerCompany);
// next, the seller's address
DOM_Node SellerAddress =
PODoc.createElement(DOMString("Address"));
DOM_Text SellerAddressName = PODoc.createTextNode(DOM-
String("123 12th Street"));
SellerAddress.appendChild(SellerAddressName);
Seller.appendChild(SellerAddress);
// next, the seller's city
DOM_Node SellerCity =
PODoc.createElement(DOMString("City"));
DOM_Text SellerCityName = PODoc.createTextNode(DOM-
String("Las Angelese"));
SellerCity.appendChild(SellerCityName);
Seller.appendChild(SellerCity);
// next, the seller's state
DOM_Node SellerState =
PODoc.createElement(DOMString("State"));
DOM_Text SellerStateName = PODoc.createTextNode(DOM-
String("CA"));
SellerState.appendChild(SellerStateName);
Seller.appendChild(SellerState);
// finally, the seller's zip
DOM_Node SellerZip =
PODoc.createElement(DOMString("Zip"));
DOM_Text SellerZipName = PODoc.createTextNode(DOM-
String("43210"));
SellerZip.appendChild(SellerZipName);
Seller.appendChild(SellerZip);
//
// Create an Item element for each item on the PO
//
for (int i = 0; items[i].PartNumber; i++) {
// create an item node
DOM_Node Item = PODoc.createElement("Item");
PO.appendChild(Item);
DOM_NamedNodeMap attrs = Item.getAttributes();
// set the PartNumber
DOM_Attr PartNumber = PODoc.createAttribute("PartNumber");
PartNumber.setValue(DOMString(items[i].PartNumber));
attrs.setNamedItem(PartNumber);
// set the Quantity
DOM_Attr Quantity = PODoc.createAttribute("Quantity");
Quantity.setValue(DOMString(items[i].Quantity));
attrs.setNamedItem(Quantity);
// set the Price
DOM_Attr Price = PODoc.createAttribute("Price");
Price.setValue(DOMString(items[i].Price));
attrs.setNamedItem(Price);
}
// write out the XML
cout << PODoc << endl;
//
// The DOM document and its contents are reference
// counted, and need no explicit deletion.
//
return
 
Listing 3
 
{
// create the PO object and set attributes
posample::PurchaseOrder PO;
PO.Set_Date("March 28, 2000");
PO.Set_PONumber(12345);
// set Buyer info
posample::Buyer Buyer = PO.Get_Buyer();
Buyer.Set_BuyingAgent("J. Q. Buyer");
Buyer.Set_CompanyName("Buyer, Inc.");
Buyer.Set_Address("123 21st Street");
Buyer.Set_City("New York");
Buyer.Set_State("NY");
Buyer.Set_Zip("12345");
PO.Set_Buyer(Buyer);
// set Seller info
posample::Seller Seller = PO.Get_Seller();
Seller.Set_CompanyName("Seller, Inc.");
Seller.Set_Address("123 21st Street");
Seller.Set_City("New York");
Seller.Set_State("NY");
Seller.Set_Zip("12345");
PO.Set_Seller(Seller);
// XList is a derivative of the MFC CList template
eXactML::XList<posample::Item *> & itemList =
PO.Get_ItemList();
for (int i = 0; items[i].PartNumber; i++) {
posample::Item *pItem = new posample::Item;
pItem->Set_PartNumber(items[i].PartNumber);
pItem->Set_Quantity(items[i].Quantity);
pItem->Set_Price(items[i].Price);
itemList.AddTail(pItem);
}
// verify that we have valid XML
try {
PO.IsValid();
}
catch (eXactML::XException e) {
CString msg;
msg.Format("Exception: (%s) while validating
imported XML", e.GetMsg().c_str());
AfxMessageBox("XML import validation failed!\n" +
msg,MB_OK|MB_ICONSTOP);
return;
}
// export the data to XML format.
try {
PO.EmitXMLToFile("posample.xml");
}
catch (CFileException e) {
TCHAR szCause[255];
e.GetErrorMessage(szCause, 255);
AfxMessageBox("CFileException: " +
CString(szCause));
}
catch (XException e) {
CString msg;
msg.Format("Exception: (%s) while generating
XML",e.GetMsg().c_str());
AfxMessageBox("Export to " +
CString("posample.xml") + " failed!" + "\n" + msg);
return;
}
catch (CException e) {
TCHAR szCause[255];
e.GetErrorMessage(szCause, 255);
AfxMessageBox("CFileException: " +
CString(szCause));
}
catch (...) {
AfxMessageBox("Unrecognized exception while gener-
ating XML.");
return;
}
}