int main() { XMLPlatformUtils::Initialize(); // Populate vector of items vector<Item> items; items.push_back(Item(Product("Toaster", 29.95), 3)); items.push_back(Item(Product("Hair dryer", 24.95), 1)); // Build the DOM document DOMImplementation* implementation = DOMImplementation::getImplementation(); DOMDocument* doc = implementation->createDocument(); doc->setStandalone(true); DOMElement* root = create_item_list(doc, items); doc->appendChild(root); // Print the DOM document DOMWriter* writer = implementation->createDOMWriter(); writer->setFeature(XMLUni::fgDOMWRTFormatPrettyPrint, true); XMLFormatTarget* out = new StdOutFormatTarget(); writer->writeNode(out, *doc); writer->release(); doc->release(); return 0; }
/** * This method converts the entries in the map (created from the command-line arguments) * into XML which will then be fed as input into the parameter handling code (i.e. ParameterSet class). */ string parameterTask::buildParameterSetXML(const string & xmlFileNamePrefix) { string retVal; try { XMLPlatformUtils::Initialize(); } catch (const XMLException& toCatch) { ACS_LOG(LM_ERROR, "parameterTask::buildParameterSetXML", (LM_ERROR, "Error - XMLException - info: %s\n", StrX(toCatch.getMessage()).localForm())) } DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(StrX("XML 2.0").unicodeForm()); if (impl != NULL) { try { // create a new DOMDocument which we will populate with // entries from the command-line parameters, in order to // make an xml version of the parameter set for use internally string qualifiedName(PARAMETERSET_NAMESPACE_PREFIX); qualifiedName.append(":").append(PARAMETERSET_STRING); DOMDocument* doc = impl->createDocument( StrX(PSET_NAMESPACE_URI).unicodeForm(), // root element namespace URI. StrX(qualifiedName.c_str()).unicodeForm(), // root element name 0); // document type object (DTD). doc->setStandalone(true); // set our internal auto_ptr to point to the new document this->domDocument.reset(doc); string schemaHint(PSET_NAMESPACE_URI); schemaHint.append(" ").append(PARAMETERSET_SCHEMA_NAME); DOMElement* rootElem = doc->getDocumentElement(); rootElem->setAttribute(StrX("xmlns:xsi").unicodeForm(), StrX("http://www.w3.org/2001/XMLSchema-instance").unicodeForm()); rootElem->setAttribute(StrX("xsi:schemaLocation").unicodeForm(), StrX(schemaHint.c_str()).unicodeForm()); DOMElement* psetdefElem = doc->createElement(StrX(PSETDEF_STRING).unicodeForm()); rootElem->appendChild(psetdefElem); string xmlFileName = xmlFileNamePrefix + ".xml"; DOMText* psetdefValTextNode = doc->createTextNode(StrX(xmlFileName.c_str()).unicodeForm()); psetdefElem->appendChild(psetdefValTextNode); DOMElement* nameElem = doc->createElement(StrX(NAME_STRING).unicodeForm()); rootElem->appendChild(nameElem); DOMText* nameValTextNode = doc->createTextNode(StrX("command-line values").unicodeForm()); nameElem->appendChild(nameValTextNode); map<string, vector<string> >::iterator position; // for each parameter in the parameterMap for(position = parameterMap.begin(); position != parameterMap.end(); ++position) { // determine the type by looking it up in our parameter set definition, i.e. psetdef // (which we have obtained by parsing the task's psetdef xml file containing the task's metadata) // and add an element of the proper type to the XML document being constructed, with name equal to the // key portion of the current map entry, value equal to the value portion of the current map entry. ParamSetDef::paramTypesEnum paramType = paramSetDef->getParamTypeForName(position->first); switch(paramType) { case ParamSetDef::BOOL: { DOMElement *boolElem = createBoolElement(position->first, position->second, doc); rootElem->appendChild(boolElem); break; } case ParamSetDef::INT: { DOMElement *intElem = createIntElement(position->first, position->second, doc); rootElem->appendChild(intElem); break; } case ParamSetDef::INT_ARRAY: { DOMElement *intArrayElem = createIntArrayElement(position->first, position->second, doc); rootElem->appendChild(intArrayElem); break; } case ParamSetDef::DOUBLE: { DOMElement *doubleElem = createDoubleElement(position->first, position->second, doc); rootElem->appendChild(doubleElem); break; } case ParamSetDef::DOUBLE_ARRAY: { DOMElement * doubleArrayElem = createDoubleArrayElement(position->first, position->second, doc); rootElem->appendChild(doubleArrayElem); break; } case ParamSetDef::STRING: { DOMElement *stringElem = createStringElement(position->first, position->second, doc); rootElem->appendChild(stringElem); break; } case ParamSetDef::STRING_ARRAY: { DOMElement * stringArrayElem = createStringArrayElement(position->first, position->second, doc); rootElem->appendChild(stringArrayElem); break; } } } // construct the DOM writer DOMWriter *domWriter = impl->createDOMWriter(); if (domWriter->canSetFeature(XMLUni::fgDOMWRTFormatPrettyPrint, true)) { domWriter->setFeature(XMLUni::fgDOMWRTFormatPrettyPrint, true); } // construct the MemBufFormatTarget XMLFormatTarget *myFormatTarget = new MemBufFormatTarget(); // set the encoding to be ISO-8859-1 XMLCh tempStr[100]; XMLString::transcode("ISO-8859-1", tempStr, 99); domWriter->setEncoding(tempStr); // serialize the document to an internal memory buffer domWriter->writeNode(myFormatTarget, *doc); // get the string which is encoded in ISO-8859-1 from the MemBufFormatTarget char* theXMLString_Encoded = (char*) ((MemBufFormatTarget*)myFormatTarget)->getRawBuffer(); retVal = string(StrX(theXMLString_Encoded).localForm()); // release the memory delete myFormatTarget; delete domWriter; //doc->release(); } catch (const OutOfMemoryException& e) { ACS_LOG(LM_ERROR, "parameterTask::buildParameterSetXML", (LM_ERROR, "Error - OutOfMemoryException - info: %s\n", StrX(e.getMessage()).localForm())) } catch (const DOMException& e) { ACS_LOG(LM_ERROR, "parameterTask::buildParameterSetXML", (LM_ERROR, "Error - DOMException - info: %s\n", StrX(e.getMessage()).localForm())) } } else {