void test_dispatcher() { RefCountedPtr<SysContext> ctx(new SysContext); RefCountedPtr<iSysComponent> cpt( new StdLogger( StdLogger::LOGC_DEBUG) ); ctx->addComponent( cpt ); // create the interfaces RefCountedPtr<RpcInterface> intf( new RpcInterface( NTEXT("interface"), ctx )); RefCountedPtr<RpcInterface> intf1( new RpcInterface( NTEXT("interface"), ctx )); RefCountedPtr<RpcInterface> intf2( new RpcInterface( NTEXT("interface"), ctx )); // create the methods RefCountedPtr<Object1Method1> method( new Object1Method1(NTEXT("method"), NTEXT("default")) ); intf->addMethod( (RefCountedPtr<iRpcMethod>&)method ); RefCountedPtr<Object1Method1> method1( new Object1Method1(NTEXT("method"), NTEXT("apache")) ); intf1->addMethod( (RefCountedPtr<iRpcMethod>&)method1 ); RefCountedPtr<Object1Method1> method2( new Object1Method1(NTEXT("method"), NTEXT("cslib")) ); intf2->addMethod( (RefCountedPtr<iRpcMethod>&)method2 ); RpcDispatcher disp( NTEXT("test-dispatcher"), ctx ); disp.addInterface( intf ); disp.addInterface( intf1, APACHE_TENANT ); disp.addInterface( intf2, CSLIB_TENANT ); DOMDocument* requestDoc = DomUtils::getDocument( NTEXT("rpc_dispatcher.xml") ); if (requestDoc != NULL) { StreamFormatTarget targ(COUT); DOMDocument* responseDoc = DomUtils::createDocument( NTEXT("default") ); if (responseDoc != NULL) { disp.dispatch( requestDoc, responseDoc ); disp.dispatch( requestDoc, responseDoc, APACHE_TENANT ); disp.dispatch( requestDoc, responseDoc, CSLIB_TENANT ); disp.dispatch( requestDoc, responseDoc, INVALID_TENANT ); DomUtils::print( responseDoc, NTEXT("UTF-8"), targ ); responseDoc->release(); } requestDoc->release(); } }
void ItemDataLoader::loadData(string filename) { XMLPlatformUtils::Initialize(); XmlHelper::initializeTranscoder(); XercesDOMParser* parser = new XercesDOMParser(); parser->setValidationScheme(XercesDOMParser::Val_Always); // optional. parser->setDoNamespaces(true); // optional XmlPtr res = XmlResourceManager::getSingleton().create(filename, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); res->parseBy(parser); DOMDocument* doc = parser->getDocument(); DOMElement* dataDocumentContent = XmlHelper::getChildNamed( doc->getDocumentElement(), "Inhalt"); initializeWeapons(XmlHelper::getChildNamed(dataDocumentContent, "Waffen")); initializeArmors(XmlHelper::getChildNamed(dataDocumentContent, "Rüstungen")); initializeItems(XmlHelper::getChildNamed(dataDocumentContent, "Gegenstände")); doc->release(); res.setNull(); XmlResourceManager::getSingleton().remove(filename); XMLPlatformUtils::Terminate(); }
/* Write the file. */ bool GQCFileData::Write(const std::string &fileName) { // Initialize the XML4C2 system. try { XMLPlatformUtils::Initialize(); } catch (const XMLException&) { return false; } // Create a DOM implementation object and create the document type for it. DOMImplementation *impl = DOMImplementationRegistry::getDOMImplementation(ToXMLCh(L"LS")); DOMDocument* doc = impl->createDocument(); //doc->setStandalone(true); // Create the serializer. DOMLSSerializer *theSerializer = ((DOMImplementationLS*)impl)->createLSSerializer(); DOMLSOutput *theOutputDesc = ((DOMImplementationLS*)impl)->createLSOutput(); //theSerializer->setEncoding(ToXMLCh(GENERIC_REPORT_FILE_ENCODING)); theOutputDesc->setEncoding(ToXMLCh(GENERIC_REPORT_FILE_ENCODING)); // Create the root element DOMElement *rootElement = CreateGenericReportElement(doc); // store the parameters AddNameValuePairs(ANALYSIS_PARAMETERS, analysisParameters, doc, rootElement); AddNameValuePairs(QC_RESULTS, qcResults, doc, rootElement); AddNameValuePairs(SAMPLE_SIGNATURE, sampleSignature, doc, rootElement); // Add an empty table (required by the DTD) AddBlankReportTable(doc, rootElement); // Store the element to the document. doc->appendChild(rootElement); // Write the file. bool status = false; XMLFormatTarget *myFormTarget = new LocalFileFormatTarget(fileName.c_str()); theOutputDesc->setByteStream(myFormTarget); try { theSerializer->write(doc, theOutputDesc); status = true; } catch (...) { status = false; } // Clean up doc->release(); theOutputDesc->release(); theSerializer->release(); delete myFormTarget; XMLPlatformUtils::Terminate(); return status; }
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; }
void EntityXMLFileWriter::WriteEntity(World* world, EntityID entity) { using namespace xercesc; DOMDocument* doc = m_DOMImplementation->createDocument(nullptr, X("Entity"), nullptr); DOMElement* root = doc->getDocumentElement(); root->setAttribute(X("xmlns:xsi"), X("http://www.w3.org/2001/XMLSchema-instance")); root->setAttribute(X("xsi:noNamespaceSchemaLocation"), X("../Types/Entity.xsd")); root->setAttribute(X("xmlns:c"), X("components")); const std::string& name = world->GetName(entity); if (!name.empty()) { root->setAttribute(X("name"), X(name)); } DOMElement* componentsElement = doc->createElement(X("Components")); root->appendChild(componentsElement); appentEntityComponents(componentsElement, world, entity); DOMElement* childrenElement = doc->createElement(X("Children")); root->appendChild(childrenElement); appendEntityChildren(childrenElement, world, entity); try { LocalFileFormatTarget* target = new LocalFileFormatTarget(X(m_FilePath.string())); DOMLSOutput* output = static_cast<DOMImplementationLS*>(m_DOMImplementation)->createLSOutput(); output->setByteStream(target); m_DOMLSSerializer->write(doc, output); delete target; } catch (const std::runtime_error& e) { LOG_ERROR("Failed to save \"%s\": %s", m_FilePath.c_str(), e.what()); } doc->release(); }
XERCES_CPP_NAMESPACE_BEGIN DOMDocument * XIncludeDOMDocumentProcessor::doXIncludeDOMProcess(const DOMDocument * const source, XMLErrorReporter *errorHandler, XMLEntityHandler* entityResolver /*=NULL*/){ XIncludeUtils xiu(errorHandler); DOMImplementation* impl = source->getImplementation(); DOMDocument *xincludedDocument = impl->createDocument(); try { /* set up the declaration etc of the output document to match the source */ xincludedDocument->setDocumentURI( source->getDocumentURI()); xincludedDocument->setXmlStandalone( source->getXmlStandalone()); xincludedDocument->setXmlVersion( source->getXmlVersion()); /* copy entire source document into the xincluded document. Xincluded document can then be modified in place */ DOMNode *child = source->getFirstChild(); for (; child != NULL; child = child->getNextSibling()){ if (child->getNodeType() == DOMNode::DOCUMENT_TYPE_NODE){ /* I am simply ignoring these at the moment */ continue; } DOMNode *newNode = xincludedDocument->importNode(child, true); xincludedDocument->appendChild(newNode); } DOMNode *docNode = xincludedDocument->getDocumentElement(); /* parse and include the document node */ xiu.parseDOMNodeDoingXInclude(docNode, xincludedDocument, entityResolver); xincludedDocument->normalizeDocument(); } catch(const XMLErrs::Codes) { xincludedDocument->release(); return NULL; } catch(...) { xincludedDocument->release(); throw; } return xincludedDocument; }
void DsaDataLoader::loadData(string filename) { XMLPlatformUtils::Initialize(); XmlHelper::initializeTranscoder(); DOMDocument* doc = loadDataFile(filename); DOMElement* dataDocumentContent = XmlHelper::getChildNamed(doc->getDocumentElement(), "Inhalt"); initializeTalente(XmlHelper::getChildNamed(dataDocumentContent, "Talente")); initializeKampftechniken(XmlHelper::getChildNamed(dataDocumentContent, "Kampftechniken")); initializePersonen(XmlHelper::getChildNamed(dataDocumentContent, "Personen")); doc->release(); XMLPlatformUtils::Terminate(); }
//----------------------------------------------------------------------- void XercesWriter::writeXMLFile(const XMLNode* root, const Ogre::String& filename) { XERCES_CPP_NAMESPACE_USE; DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(L"Core"); DOMDocumentType* docType = NULL; DOMDocument* doc = impl->createDocument(NULL, transcode(root->getName()).c_str(), docType); populateDOMElement(root, doc->getDocumentElement()); LocalFileFormatTarget destination(filename.c_str()); DOMWriter* writer = impl->createDOMWriter(); writer->setFeature(XMLUni::fgDOMWRTFormatPrettyPrint, true); writer->writeNode(&destination, *doc); writer->release(); doc->release(); }
int evaluate(int argc, char ** argv) { char * filename = NULL; char * outfile = NULL; unsigned char * keyStr = NULL; bool doDecrypt = true; bool errorsOccured = false; bool doDecryptElement = false; bool useInteropResolver = false; bool encryptFileAsData = false; bool parseXMLInput = true; bool doXMLOutput = false; bool isXKMSKey = false; XSECCryptoKey * kek = NULL; XSECCryptoKey * key = NULL; int keyLen = 0; encryptionMethod kekAlg = ENCRYPT_NONE; encryptionMethod keyAlg = ENCRYPT_NONE; DOMDocument *doc; unsigned char keyBuf[24]; XMLFormatTarget *formatTarget ; #if defined(_WIN32) && defined (XSEC_HAVE_WINCAPI) HCRYPTPROV win32DSSCSP = 0; // Crypto Providers HCRYPTPROV win32RSACSP = 0; CryptAcquireContext(&win32DSSCSP, NULL, NULL, PROV_DSS, CRYPT_VERIFYCONTEXT); CryptAcquireContext(&win32RSACSP, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT); #endif if (argc < 2) { printUsage(); return 2; } // Run through parameters int paramCount = 1; while (paramCount < argc - 1) { if (_stricmp(argv[paramCount], "--decrypt-element") == 0 || _stricmp(argv[paramCount], "-de") == 0) { paramCount++; doDecrypt = true; doDecryptElement = true; doXMLOutput = true; parseXMLInput = true; } else if (_stricmp(argv[paramCount], "--interop") == 0 || _stricmp(argv[paramCount], "-i") == 0) { // Use the interop key resolver useInteropResolver = true; paramCount++; } else if (_stricmp(argv[paramCount], "--encrypt-file") == 0 || _stricmp(argv[paramCount], "-ef") == 0) { // Use this file as the input doDecrypt = false; encryptFileAsData = true; doXMLOutput = true; parseXMLInput = false; paramCount++; } else if (_stricmp(argv[paramCount], "--encrypt-xml") == 0 || _stricmp(argv[paramCount], "-ex") == 0) { // Us this file as an XML input file doDecrypt = false; encryptFileAsData = false; doXMLOutput = true; parseXMLInput = true; paramCount++; } else if (_stricmp(argv[paramCount], "--out-file") == 0 || _stricmp(argv[paramCount], "-o") == 0) { if (paramCount +2 >= argc) { printUsage(); return 1; } paramCount++; outfile = argv[paramCount]; paramCount++; } else if (_stricmp(argv[paramCount], "--xkms") == 0 || _stricmp(argv[paramCount], "-x") == 0) { paramCount++; isXKMSKey = true; } #if defined (XSEC_HAVE_WINCAPI) else if (_stricmp(argv[paramCount], "--wincapi") == 0 || _stricmp(argv[paramCount], "-w") == 0) { // Use the interop key resolver WinCAPICryptoProvider * cp = new WinCAPICryptoProvider(); XSECPlatformUtils::SetCryptoProvider(cp); paramCount++; } #endif #if defined (XSEC_HAVE_NSS) else if (_stricmp(argv[paramCount], "--nss") == 0 || _stricmp(argv[paramCount], "-n") == 0) { // NSS Crypto Provider NSSCryptoProvider * cp = new NSSCryptoProvider(); XSECPlatformUtils::SetCryptoProvider(cp); paramCount++; } #endif else if (_stricmp(argv[paramCount], "--key") == 0 || _stricmp(argv[paramCount], "-k") == 0) { // Have a key! paramCount++; bool isKEK = false; XSECCryptoSymmetricKey::SymmetricKeyType loadKeyAs = XSECCryptoSymmetricKey::KEY_NONE; if (_stricmp(argv[paramCount], "kek") == 0) { isKEK = true; paramCount++; if (paramCount >= argc) { printUsage(); return 2; } } if (_stricmp(argv[paramCount], "3DES") == 0 || _stricmp(argv[paramCount], "AES128") == 0 || _stricmp(argv[paramCount], "AES192") == 0 || _stricmp(argv[paramCount], "AES256") == 0 || _stricmp(argv[paramCount], "AES128-GCM") == 0 || _stricmp(argv[paramCount], "AES192-GCM") == 0 || _stricmp(argv[paramCount], "AES256-GCM") == 0) { if (paramCount +2 >= argc) { printUsage(); return 2; } switch(argv[paramCount][4]) { case '\0' : keyLen = 24; loadKeyAs = XSECCryptoSymmetricKey::KEY_3DES_192; keyAlg = ENCRYPT_3DES_CBC; break; case '2' : keyLen = 16; loadKeyAs = XSECCryptoSymmetricKey::KEY_AES_128; if (isKEK) { kekAlg = ENCRYPT_KW_AES128; } else if (strlen(argv[paramCount]) == 6) { keyAlg = ENCRYPT_AES128_CBC; } else { keyAlg = ENCRYPT_AES128_GCM; } break; case '9' : keyLen = 24; loadKeyAs = XSECCryptoSymmetricKey::KEY_AES_192; if (isKEK) { kekAlg = ENCRYPT_KW_AES192; } else if (strlen(argv[paramCount]) == 6) { keyAlg = ENCRYPT_AES192_CBC; } else { keyAlg = ENCRYPT_AES192_GCM; } break; case '5' : keyLen = 32; loadKeyAs = XSECCryptoSymmetricKey::KEY_AES_256; if (isKEK) { kekAlg = ENCRYPT_KW_AES256; } else if (strlen(argv[paramCount]) == 6) { keyAlg = ENCRYPT_AES256_CBC; } else { keyAlg = ENCRYPT_AES256_GCM; } break; } paramCount++; unsigned char keyStr[64]; if (strlen(argv[paramCount]) > 64) { cerr << "Key string too long\n"; return 2; } XSECCryptoSymmetricKey * sk = XSECPlatformUtils::g_cryptoProvider->keySymmetric(loadKeyAs); if (isXKMSKey) { unsigned char kbuf[XSEC_MAX_HASH_SIZE]; CalculateXKMSKEK((unsigned char *) argv[paramCount], (int) strlen(argv[paramCount]), kbuf, XSEC_MAX_HASH_SIZE); sk->setKey(kbuf, keyLen); } else { memset(keyStr, 0, 64); strcpy((char *) keyStr, argv[paramCount]); sk->setKey(keyStr, keyLen); } paramCount++; if (isKEK) kek = sk; else key = sk; } #if defined (XSEC_HAVE_OPENSSL) else if (_stricmp(argv[paramCount], "RSA") == 0) { // RSA private key file if (paramCount + 3 >= argc) { printUsage(); return 2; } if (!isKEK) { cerr << "RSA private keys may only be KEKs\n"; return 2; } BIO * bioKey; if ((bioKey = BIO_new(BIO_s_file())) == NULL) { cerr << "Error opening private key file\n\n"; return 1; } if (BIO_read_filename(bioKey, argv[paramCount + 1]) <= 0) { cerr << "Error opening private key file\n\n"; return 1; } EVP_PKEY * pkey; pkey = PEM_read_bio_PrivateKey(bioKey,NULL,NULL,argv[paramCount + 2]); if (pkey == NULL) { cerr << "Error loading private key\n\n"; return 1; } kek = new OpenSSLCryptoKeyRSA(pkey); kekAlg = ENCRYPT_RSA_15; EVP_PKEY_free(pkey); BIO_free(bioKey); paramCount += 3; } else if (_stricmp(argv[paramCount], "X509") == 0) { // X509 cert used to load an encrypting key if (paramCount + 2 >= argc) { printUsage(); exit (1); } if (!isKEK) { cerr << "X509 private keys may only be KEKs\n"; return 2; } // Load the encrypting key // For now just read a particular file BIO * bioX509; if ((bioX509 = BIO_new(BIO_s_file())) == NULL) { cerr << "Error opening file\n\n"; exit (1); } if (BIO_read_filename(bioX509, argv[paramCount + 1]) <= 0) { cerr << "Error opening X509 Certificate " << argv[paramCount + 1] << "\n\n"; exit (1); } X509 * x ; x = PEM_read_bio_X509_AUX(bioX509,NULL,NULL,NULL); if (x == NULL) { BIO * bio_err; if ((bio_err=BIO_new(BIO_s_file())) != NULL) BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT); cerr << "Error loading certificate key\n\n"; ERR_print_errors(bio_err); BIO_free(bio_err); exit (1); } // Now load the key EVP_PKEY *pkey; pkey = X509_get_pubkey(x); if (pkey == NULL || pkey->type != EVP_PKEY_RSA) { cerr << "Error extracting RSA key from certificate" << endl; } kek = new OpenSSLCryptoKeyRSA(pkey); kekAlg = ENCRYPT_RSA_15; // Clean up EVP_PKEY_free (pkey); X509_free(x); BIO_free(bioX509); paramCount += 2; } /* argv[1] = "--x509cert" */ #endif /* XSEC_HAVE_OPENSSL */ else { printUsage(); return 2; } } else { cerr << "Unknown option: " << argv[paramCount] << endl; printUsage(); return 2; } } if (paramCount >= argc) { printUsage(); return 2; } if (outfile != NULL) { formatTarget = new LocalFileFormatTarget(outfile); } else { formatTarget = new StdOutFormatTarget(); } filename = argv[paramCount]; if (parseXMLInput) { XercesDOMParser * parser = new XercesDOMParser; Janitor<XercesDOMParser> j_parser(parser); parser->setDoNamespaces(true); parser->setCreateEntityReferenceNodes(true); // Now parse out file xsecsize_t errorCount = 0; try { parser->parse(filename); errorCount = parser->getErrorCount(); if (errorCount > 0) errorsOccured = true; } catch (const XMLException& e) { cerr << "An error occured during parsing\n Message: " << e.getMessage() << endl; errorsOccured = true; } catch (const DOMException& e) { cerr << "A DOM error occured during parsing\n DOMException code: " << e.code << endl; errorsOccured = true; } if (errorsOccured) { cout << "Errors during parse" << endl; return (2); } /* Now that we have the parsed file, get the DOM document and start looking at it */ doc = parser->adoptDocument(); } else { // Create an empty document XMLCh tempStr[100]; XMLString::transcode("Core", tempStr, 99); DOMImplementation *impl = DOMImplementationRegistry::getDOMImplementation(tempStr); doc = impl->createDocument( 0, // root element namespace URI. MAKE_UNICODE_STRING("ADoc"), // root element name NULL);// DOMDocumentType()); // document type object (DTD). } XSECProvider prov; XENCCipher * cipher = prov.newCipher(doc); if (kek != NULL) cipher->setKEK(kek); if (key != NULL) cipher->setKey(key); try { if (doDecrypt) { if (useInteropResolver == true) { // Map out base path of the file char path[_MAX_PATH]; char baseURI[(_MAX_PATH * 2) + 10]; getcwd(path, _MAX_PATH); strcpy(baseURI, "file:///"); // Ugly and nasty but quick if (filename[0] != '\\' && filename[0] != '/' && filename[1] != ':') { strcat(baseURI, path); strcat(baseURI, "/"); } else if (path[1] == ':') { path[2] = '\0'; strcat(baseURI, path); } strcat(baseURI, filename); // Find any ':' and "\" characters int lastSlash = 0; for (unsigned int i = 8; i < strlen(baseURI); ++i) { if (baseURI[i] == '\\') { lastSlash = i; baseURI[i] = '/'; } else if (baseURI[i] == '/') lastSlash = i; } // The last "\\" must prefix the filename baseURI[lastSlash + 1] = '\0'; XMLCh * uriT = XMLString::transcode(baseURI); XencInteropResolver ires(doc, &(uriT[8])); XSEC_RELEASE_XMLCH(uriT); cipher->setKeyInfoResolver(&ires); } // Find the EncryptedData node DOMNode * n = findXENCNode(doc, "EncryptedData"); if (doDecryptElement) { while (n != NULL) { // decrypt cipher->decryptElement(static_cast<DOMElement *>(n)); // Find the next EncryptedData node n = findXENCNode(doc, "EncryptedData"); } } else { XSECBinTXFMInputStream * bis = cipher->decryptToBinInputStream(static_cast<DOMElement *>(n)); Janitor<XSECBinTXFMInputStream> j_bis(bis); XMLByte buf[1024]; xsecsize_t read = bis->readBytes(buf, 1023); while (read > 0) { formatTarget->writeChars(buf, read, NULL); read = bis->readBytes(buf, 1023); } } } else { XENCEncryptedData *xenc = NULL; // Encrypting if (kek != NULL && key == NULL) { XSECPlatformUtils::g_cryptoProvider->getRandom(keyBuf, 24); XSECCryptoSymmetricKey * k = XSECPlatformUtils::g_cryptoProvider->keySymmetric(XSECCryptoSymmetricKey::KEY_3DES_192); k->setKey(keyBuf, 24); cipher->setKey(k); keyAlg = ENCRYPT_3DES_CBC; keyStr = keyBuf; keyLen = 24; } if (encryptFileAsData) { // Create a BinInputStream #if defined(XSEC_XERCES_REQUIRES_MEMMGR) BinFileInputStream * is = new BinFileInputStream(filename, XMLPlatformUtils::fgMemoryManager); #else BinFileInputStream * is = new BinFileInputStream(filename); #endif xenc = cipher->encryptBinInputStream(is, keyAlg); // Replace the document element DOMElement * elt = doc->getDocumentElement(); doc->replaceChild(xenc->getElement(), elt); elt->release(); } else { // Document encryption cipher->encryptElement(doc->getDocumentElement(), keyAlg); } // Do we encrypt a created key? if (kek != NULL && xenc != NULL) { XENCEncryptedKey *xkey = cipher->encryptKey(keyStr, keyLen, kekAlg); // Add to the EncryptedData xenc->appendEncryptedKey(xkey); } } if (doXMLOutput) { // Output the result XMLCh core[] = { XERCES_CPP_NAMESPACE_QUALIFIER chLatin_C, XERCES_CPP_NAMESPACE_QUALIFIER chLatin_o, XERCES_CPP_NAMESPACE_QUALIFIER chLatin_r, XERCES_CPP_NAMESPACE_QUALIFIER chLatin_e, XERCES_CPP_NAMESPACE_QUALIFIER chNull }; DOMImplementation *impl = DOMImplementationRegistry::getDOMImplementation(core); #if defined (XSEC_XERCES_DOMLSSERIALIZER) // DOM L3 version as per Xerces 3.0 API DOMLSSerializer *theSerializer = ((DOMImplementationLS*)impl)->createLSSerializer(); Janitor<DOMLSSerializer> j_theSerializer(theSerializer); // Get the config so we can set up pretty printing DOMConfiguration *dc = theSerializer->getDomConfig(); dc->setParameter(XMLUni::fgDOMWRTFormatPrettyPrint, false); // Now create an output object to format to UTF-8 DOMLSOutput *theOutput = ((DOMImplementationLS*)impl)->createLSOutput(); Janitor<DOMLSOutput> j_theOutput(theOutput); theOutput->setEncoding(MAKE_UNICODE_STRING("UTF-8")); theOutput->setByteStream(formatTarget); theSerializer->write(doc, theOutput); #else DOMWriter *theSerializer = ((DOMImplementationLS*)impl)->createDOMWriter(); Janitor<DOMWriter> j_theSerializer(theSerializer); theSerializer->setEncoding(MAKE_UNICODE_STRING("UTF-8")); if (theSerializer->canSetFeature(XMLUni::fgDOMWRTFormatPrettyPrint, false)) theSerializer->setFeature(XMLUni::fgDOMWRTFormatPrettyPrint, false); theSerializer->writeNode(formatTarget, *doc); #endif cout << endl; } } catch (XSECException &e) { char * msg = XMLString::transcode(e.getMsg()); cerr << "An error occured during encryption/decryption operation\n Message: " << msg << endl; XSEC_RELEASE_XMLCH(msg); errorsOccured = true; if (formatTarget != NULL) delete formatTarget; doc->release(); return 2; } catch (XSECCryptoException &e) { cerr << "An error occured during encryption/decryption operation\n Message: " << e.getMsg() << endl; errorsOccured = true; if (formatTarget != NULL) delete formatTarget; doc->release(); #if defined (XSEC_HAVE_OPENSSL) ERR_load_crypto_strings(); BIO * bio_err; if ((bio_err=BIO_new(BIO_s_file())) != NULL) BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT); ERR_print_errors(bio_err); #endif return 2; } if (formatTarget != NULL) delete formatTarget; doc->release(); return 0; }
void InputManager::loadKeyMapping(const Ogre::String& filename) { using namespace XERCES_CPP_NAMESPACE; using XERCES_CPP_NAMESPACE::DOMDocument; using std::make_pair; XMLPlatformUtils::Initialize(); XmlHelper::initializeTranscoder(); XercesDOMParser* parser = new XercesDOMParser(); parser->setValidationScheme(XercesDOMParser::Val_Always); // optional. parser->setDoNamespaces(true); // optional /* ErrorHandler* errHandler = (ErrorHandler*) new HandlerBase(); parser->setErrorHandler(errHandler);*/ XMLCh* ALT = XMLString::transcode("AltChar"); XMLCh* SHIFT = XMLString::transcode("ShiftChar"); XMLCh* NORMAL = XMLString::transcode("NormalChar"); XMLCh* DESCR = XMLString::transcode("KeyDescription"); XMLCh* CODE = XMLString::transcode("KeyCode"); XMLCh* KEY = XMLString::transcode("Key"); XmlPtr res = XmlResourceManager::getSingleton().create( filename, ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); res->parseBy(parser); DOMDocument* doc = parser->getDocument(); DOMElement* dataDocumentContent = doc->getDocumentElement(); DOMNodeList* keymaps = dataDocumentContent->getElementsByTagName(KEY); for (unsigned int idx = 0; idx < keymaps->getLength(); idx++) { DOMElement* key = static_cast<DOMElement*>(keymaps->item(idx)); int keycode = XMLString::parseInt(key->getAttribute(CODE)); const XMLCh* xmlch; xmlch = key->getAttribute(NORMAL); if (xmlch != NULL && XMLString::stringLen(xmlch) > 0) { CeGuiString s(XmlHelper::transcodeToString(xmlch)); mKeyMapNormal.insert(make_pair(keycode, s[0])); } xmlch = key->getAttribute(ALT); if (xmlch != NULL && XMLString::stringLen(xmlch) > 0) { CeGuiString s(XmlHelper::transcodeToString(xmlch)); mKeyMapAlt.insert(make_pair(keycode, s[0])); } xmlch = key->getAttribute(SHIFT); if (xmlch != NULL && XMLString::stringLen(xmlch) > 0) { CeGuiString s(XmlHelper::transcodeToString(xmlch)); mKeyMapShift.insert(make_pair(keycode, s[0])); } xmlch = key->getAttribute(DESCR); mKeyNames.insert(make_pair(keycode, XmlHelper::transcodeToString(xmlch))); } XMLString::release(&ALT); XMLString::release(&SHIFT); XMLString::release(&NORMAL); XMLString::release(&CODE); XMLString::release(&DESCR); XMLString::release(&KEY); doc->release(); XMLPlatformUtils::Terminate(); //XmlResourceManager::getSingleton().remove(filename); //res.setNull(); }
int main(int argC, char*[]) { // Initialize the XML4C2 system. try { XMLPlatformUtils::Initialize(); } catch(const XMLException& toCatch) { char *pMsg = XMLString::transcode(toCatch.getMessage()); XERCES_STD_QUALIFIER cerr << "Error during Xerces-c Initialization.\n" << " Exception message:" << pMsg; XMLString::release(&pMsg); return 1; } // Watch for special case help request int errorCode = 0; if (argC > 1) { XERCES_STD_QUALIFIER cout << "\nUsage:\n" " CreateDOMDocument\n\n" "This program creates a new DOM document from scratch in memory.\n" "It then prints the count of elements in the tree.\n" << XERCES_STD_QUALIFIER endl; errorCode = 1; } if(errorCode) { XMLPlatformUtils::Terminate(); return errorCode; } { // Nest entire test in an inner block. // The tree we create below is the same that the XercesDOMParser would // have created, except that no whitespace text nodes would be created. // <company> // <product>Xerces-C</product> // <category idea='great'>XML Parsing Tools</category> // <developedBy>Apache Software Foundation</developedBy> // </company> DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(X("Core")); if (impl != NULL) { try { DOMDocument* doc = impl->createDocument( 0, // root element namespace URI. X("company"), // root element name 0); // document type object (DTD). DOMElement* rootElem = doc->getDocumentElement(); DOMElement* prodElem = doc->createElement(X("product")); rootElem->appendChild(prodElem); DOMText* prodDataVal = doc->createTextNode(X("Xerces-C")); prodElem->appendChild(prodDataVal); DOMElement* catElem = doc->createElement(X("category")); rootElem->appendChild(catElem); catElem->setAttribute(X("idea"), X("great")); DOMText* catDataVal = doc->createTextNode(X("XML Parsing Tools")); catElem->appendChild(catDataVal); DOMElement* devByElem = doc->createElement(X("developedBy")); rootElem->appendChild(devByElem); DOMText* devByDataVal = doc->createTextNode(X("Apache Software Foundation")); devByElem->appendChild(devByDataVal); // // Now count the number of elements in the above DOM tree. // const XMLSize_t elementCount = doc->getElementsByTagName(X("*"))->getLength(); XERCES_STD_QUALIFIER cout << "The tree just created contains: " << elementCount << " elements." << XERCES_STD_QUALIFIER endl; doc->release(); } catch (const OutOfMemoryException&) { XERCES_STD_QUALIFIER cerr << "OutOfMemoryException" << XERCES_STD_QUALIFIER endl; errorCode = 5; } catch (const DOMException& e) { XERCES_STD_QUALIFIER cerr << "DOMException code is: " << e.code << XERCES_STD_QUALIFIER endl; errorCode = 2; } catch (...) { XERCES_STD_QUALIFIER cerr << "An error occurred creating the document" << XERCES_STD_QUALIFIER endl; errorCode = 3; } } // (inpl != NULL) else { XERCES_STD_QUALIFIER cerr << "Requested implementation is not supported" << XERCES_STD_QUALIFIER endl; errorCode = 4; } } XMLPlatformUtils::Terminate(); return errorCode; }
Triggerconf::Triggerconf(string _filename, bool _autocreateitems, bool _mustexist, bool _savechanges) : file( _filename ), autocreate( _autocreateitems ), savechanges( _savechanges ) { rootnode = NULL; goodstate = true; lasterror = ""; try { XMLPlatformUtils::Initialize(); // // if the file does not exists we create it with the root node // but only if the constructor parameter is fine with this // FileHandle filehandle = XMLPlatformUtils::openFile (file.c_str ()); if (filehandle == NULL && _mustexist == false) { static const XMLCh gLS [] = {chLatin_L, chLatin_S, chNull}; DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(gLS); XMLCh* xroot = XMLString::transcode( ROOT_NAME ); DOMDocument* doc = impl->createDocument( 0, xroot, 0 ); DOMElement* elemrt = doc->getDocumentElement(); DOMLSSerializer* writer = ((DOMImplementationLS*)impl)->createLSSerializer(); XMLString::release (&xroot); if (writer->getDomConfig()->canSetParameter(XMLUni::fgDOMWRTFormatPrettyPrint, true)) writer->getDomConfig()->setParameter(XMLUni::fgDOMWRTFormatPrettyPrint, true); if (writer->getDomConfig()->canSetParameter(XMLUni::fgDOMWRTBOM, true)) writer->getDomConfig()->setParameter(XMLUni::fgDOMWRTBOM, true); XMLFormatTarget* target = new LocalFileFormatTarget (file.c_str ()); target->flush(); DOMLSOutput* output = ((DOMImplementationLS*)impl)->createLSOutput(); output->setByteStream( target ); writer->write( elemrt, output ); writer->release(); doc->release(); delete output; delete target; } else if (filehandle == NULL && _mustexist == true) { setError ("file " + file + " does not exist"); return; } else { XMLPlatformUtils::closeFile (filehandle); } // // parse the file // parser = new XercesDOMParser (); errhandler = (ErrorHandler*) new HandlerBase (); parser->setErrorHandler (errhandler); parser->parse (file.c_str ()); rootnode = getChildOfType (parser->getDocument (), DOMNode::ELEMENT_NODE); if (rootnode != NULL) { char* xmlstring = XMLString::transcode (rootnode->getNodeName ()); if (((string) ROOT_NAME).compare (xmlstring) == 0) resetError(); else setError("invalid root item in file " + file); XMLString::release (&xmlstring); } else setError("parsing xml file " + file + " failed"); } catch (const XMLException& toCatch) { char* message = XMLString::transcode (toCatch.getMessage()); setError ("failed parsing file " + file + ": " + message); XMLString::release(&message); } catch (const DOMException& toCatch) { char* message = XMLString::transcode (toCatch.msg); setError ("failed parsing file " + file + ": " + message); XMLString::release(&message); } catch (...) { setError( "failed parsing file " + file ); } }
bool XCube::writeXML(const std::string &outputfile) { DWXML xml; xercesc::XercesDOMParser *m_DOMXmlParser1=xml.getDOMParser(); m_DOMXmlParser1->setValidationScheme( XercesDOMParser::Val_Auto ); m_DOMXmlParser1->setDoNamespaces( false ); m_DOMXmlParser1->setDoSchema( false ); m_DOMXmlParser1->setLoadExternalDTD( false ); XMLCh temp2[100]; XMLString::transcode("Core", temp2, 99); DOMImplementation* impl2 = DOMImplementationRegistry::getDOMImplementation(temp2); DOMDocument* doc = impl2->createDocument( 0, // root element namespace URI. XMLString::transcode("Schema"), // root element name 0); // document type object (DTD). if (impl2 != NULL) { try { DOMElement *cubeElem = doc->createElement(XMLString::transcode("Cube")); if(this->_name != "") cubeElem->setAttribute(XMLString::transcode("name"),XMLString::transcode(this->_name.c_str())); if(this->_fact != "") cubeElem->setAttribute(XMLString::transcode("tablename"),XMLString::transcode(this->_fact.c_str())); if(this->_dimensions.size() > 0) { for(int i = 0; i < this->_dimensions.size(); i ++) { Dimension *tempDimension = this->getDimension(this->_dimensions[i]->getName()); cubeElem->appendChild(tempDimension->recursiveXML(doc)); } } XSchema *tempschema = this->getSchema(); DOMElement* schemaElem = doc->getDocumentElement();//create root if(DataSource *tempDS = tempschema->getDataSource()) { schemaElem -> appendChild(tempDS->recursiveXML(doc)); } schemaElem -> appendChild(cubeElem); } catch (const OutOfMemoryException &) { XERCES_STD_QUALIFIER cerr << "OutOfMemoryException" << XERCES_STD_QUALIFIER endl; return false; } catch (const DOMException& e) { XERCES_STD_QUALIFIER cerr << "DOMException code is: " << e.code << XERCES_STD_QUALIFIER endl; return false; } catch (...) { XERCES_STD_QUALIFIER cerr << "An error occurred creating the document" << XERCES_STD_QUALIFIER endl; return false; } } else {return false;} //use DOMwriter for export XML file //Writer Ini bool bRet = true; XMLCh tempStr[100]; XMLString::transcode("LS", tempStr, 99); DOMImplementation *impl = DOMImplementationRegistry::getDOMImplementation(tempStr); DOMWriter *m_pWriter = ((DOMImplementationLS*)impl)->createDOMWriter(); //set XML File in "UTF-8" XMLCh *encoding = XMLString::transcode("UTF-8"); m_pWriter -> setEncoding(encoding); // DOMDocument* m_pDoc; const char * outfile = outputfile.c_str(); XMLFormatTarget* m_pFormatTarget = new LocalFileFormatTarget(outfile); // construct the LocalFileFormatTarget // m_pFormatTarget = new LocalFileFormatTarget(szPath); // serialize a DOMNode to the local file "myXMLFile.xml" //Write File in UTF-8 bRet = m_pWriter->writeNode(m_pFormatTarget, *doc); if (bRet == false) { return false; } else { try { // optionally, you can flush the buffer to ensure all contents are written m_pFormatTarget->flush(); delete m_pFormatTarget; delete m_DOMXmlParser1; delete m_pWriter; doc->release(); XMLPlatformUtils::Terminate(); return true; } catch (const OutOfMemoryException&) { XERCES_STD_QUALIFIER cerr << "OutOfMemoryException" << XERCES_STD_QUALIFIER endl; return false; } catch (XMLException& e) { XERCES_STD_QUALIFIER cerr << "An error occurred during creation of output transcoder. Msg is:" << XERCES_STD_QUALIFIER endl << XMLString::transcode(e.getMessage()) << XERCES_STD_QUALIFIER endl; return false; } } }
/** * Main routine that utilizes Xercesc module to create a DOM object in memory * and prints out the resultant DOM structure * @param argC number of command line args * @param argV name of command line args * @return 0 if no errors occurred */ int main(int argC, char*argv[]) { // Initialize the XML4C2 system. try { XMLPlatformUtils::Initialize(); } catch (const XMLException& toCatch) { char *pMsg = XMLString::transcode(toCatch.getMessage()); XERCES_STD_QUALIFIER cerr << "Error during Xerces-c Initialization.\n" << " Exception message:" << pMsg; XMLString::release(&pMsg); return 1; } // Watch for special case help request int errorCode = 0; if (argC > 1) { XERCES_STD_QUALIFIER cout << "\nUsage:\n" " CreateDOMDocument\n\n" "This program creates a new DOM document from scratch in memory.\n" "It then prints the count of elements in the tree.\n" << XERCES_STD_QUALIFIER endl; errorCode = 1; } if (errorCode) { XMLPlatformUtils::Terminate(); return errorCode; } DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(X("Core")); if (impl != NULL) { try { // create a DomDocument instance DOMDocument* doc = impl->createDocument( 0, // root element namespace URI. X("TheHood"), // root element name 0); // document type object (DTD). // create root attribute nodes DOMAttr* woop_atr = doc->createAttribute(X("WOOP")); woop_atr->setValue(X("DANG")); DOMAttr* fiyah_atr = doc->createAttribute(X("FIYAH")); fiyah_atr->setValue(X("hot")); DOMAttr* hungry_atr = doc->createAttribute(X("hungry")); hungry_atr->setValue(X("starving")); // create root element DOMElement* rootElem = doc->getDocumentElement(); // set root attrs rootElem->setAttributeNode(woop_atr); rootElem->setAttributeNode(fiyah_atr); rootElem->setAttributeNode(hungry_atr); //create root child elements DOMElement* gangElem = doc->createElement(X("gang")); rootElem->appendChild(gangElem); DOMText* gangDataVal = doc->createTextNode(X("YoungThugz")); gangElem->appendChild(gangDataVal); gangElem->setAttribute(X("hardness"), X("rock")); //create gang attr nodes DOMAttr* members_atr = doc->createAttribute(X("members")); members_atr->setValue(X("500")); DOMAttr* color_atr = doc->createAttribute(X("color")); color_atr->setValue(X("magenta")); // set gang attr gangElem->setAttributeNode(members_atr); gangElem->setAttributeNode(color_atr); // create gang elem children DOMElement* piruElem = doc->createElement(X("piru")); piruElem->setNodeValue(X("w")); DOMElement* cripElem = doc->createElement(X("crip")); cripElem->setNodeValue(X("t")); DOMElement* trgElem = doc->createElement(X("trg")); trgElem->setNodeValue(X("o")); // append gang elem children gangElem->appendChild(piruElem); gangElem->appendChild(cripElem); gangElem->appendChild(trgElem); DOMElement* turfElem = doc->createElement(X("turf")); rootElem->appendChild(turfElem); turfElem->setAttribute(X("idea"), X("great")); DOMText* turfDataVal = doc->createTextNode(X("West Side Projects")); turfElem->appendChild(turfDataVal); DOMElement* cliqueElem = doc->createElement(X("clique")); rootElem->appendChild(cliqueElem); DOMText* cliqueDataVal = doc->createTextNode(X("Balla$")); cliqueElem->appendChild(cliqueDataVal); cliqueElem->setAttribute(X("Comradery"), X("tight")); DOMElement* sideElem = doc->createElement(X("side")); rootElem->appendChild(sideElem); DOMText* sideDataVal = doc->createTextNode(X("North North")); sideElem->appendChild(sideDataVal); // create side elem children DOMElement* tempElem = doc->createElement(X("temperature")); tempElem->setNodeValue(X("100 C")); DOMElement* med_incomeElem = doc->createElement(X("medianIncome")); med_incomeElem->setNodeValue(X("$20,000")); DOMElement* schoolsElem = doc->createElement(X("schools")); schoolsElem->setNodeValue(X("Regional")); // append side elem children sideElem->appendChild(tempElem); sideElem->appendChild(med_incomeElem); sideElem->appendChild(schoolsElem); DOMElement* gatElem = doc->createElement(X("gat")); rootElem->appendChild(gatElem); DOMText* gatDataVal = doc->createTextNode(X("Glock")); gatElem->appendChild(gatDataVal); //set gat attr gatElem->setAttribute(X("caliber"), X(".50")); // create gat elem children DOMElement* rifleElem = doc->createElement(X("rifle")); DOMElement* meleeElem = doc->createElement(X("melee")); DOMElement* pieceElem = doc->createElement(X("piece")); // append gat elem children gatElem->appendChild(rifleElem); gatElem->appendChild(meleeElem); gatElem->appendChild(pieceElem); DOMElement* contraElem = doc->createElement(X("contra")); rootElem->appendChild(contraElem); DOMText* contraDataVal = doc->createTextNode(X("Cocoa")); contraElem->appendChild(contraDataVal); contraElem->setAttribute(X("rareness"), X("extreme")); // create contra elem children DOMElement* methElem = doc->createElement(X("meth")); DOMElement* ganjaElem = doc->createElement(X("ganja")); DOMElement* ethElem = doc->createElement(X("ethanol")); // append contra elem children contraElem->appendChild(methElem); contraElem->appendChild(ganjaElem); contraElem->appendChild(ethElem); //create contra attr nodes DOMAttr* price_atr = doc->createAttribute(X("price")); price_atr->setValue(X("$25")); DOMAttr* source_atr = doc->createAttribute(X("source")); source_atr->setValue(X("Columbia")); // set contra attr contraElem->setAttributeNode(price_atr); contraElem->setAttributeNode(source_atr); DOMElement* rivalsElem = doc->createElement(X("rivals")); rootElem->appendChild(rivalsElem); DOMText* rivalsDataVal = doc->createTextNode(X("Warrriors")); rivalsElem->appendChild(rivalsDataVal); DOMElement* policeElem = doc->createElement(X("police")); rootElem->appendChild(policeElem); DOMText* policeDataVal = doc->createTextNode(X("popo")); policeElem->appendChild(policeDataVal); DOMElement* drugsElem = doc->createElement(X("drugs")); rootElem->appendChild(drugsElem); DOMText* drugsDataVal = doc->createTextNode(X("codiene")); drugsElem->appendChild(drugsDataVal); // create drugs elem children DOMElement* mixElem = doc->createElement(X("mix")); DOMElement* spriteElem = doc->createElement(X("sprite")); DOMElement* leanElem = doc->createElement(X("lean")); // append drugs elem children drugsElem->appendChild(mixElem); drugsElem->appendChild(spriteElem); drugsElem->appendChild(leanElem); DOMElement* crimeElem = doc->createElement(X("crime")); rootElem->appendChild(crimeElem); DOMText* crimeDataVal = doc->createTextNode(X("187")); crimeElem->appendChild(crimeDataVal); // // Now count the number of elements in the above DOM tree. // const XMLSize_t elementCount = doc->getElementsByTagName(X("*"))->getLength(); XERCES_STD_QUALIFIER cout << "The tree just created contains: " << elementCount << " elements." << XERCES_STD_QUALIFIER endl; // create serializer instance DOMLSSerializer *theSerializer = ((DOMImplementationLS*) impl)->createLSSerializer(); // create output instance DOMLSOutput *theOutputDesc = ((DOMImplementationLS*) impl)->createLSOutput(); // referenced the following http://stackoverflow.com/questions/2897317/writing-xml-with-xerces-3-0-1-and-c-on-windows // set output from serializer to stdout XMLFormatTarget *myFormTarget; myFormTarget = new StdOutFormatTarget(); theOutputDesc->setByteStream(myFormTarget); // Make the output more human readable by inserting line feeds. if (theSerializer->getDomConfig()->canSetParameter(XMLUni::fgDOMWRTFormatPrettyPrint, true)) theSerializer->getDomConfig()->setParameter(XMLUni::fgDOMWRTFormatPrettyPrint, true); // The end-of-line sequence of characters to be used in the XML being written out. theSerializer->setNewLine(XMLString::transcode("\r\n")); // output the DOM theSerializer->write(doc, theOutputDesc); cout << endl << endl << "*****************************************" << endl; // Using DOMTreeWalker class to traverse tree // create tree walker DOMTreeWalker* walker = doc->createTreeWalker(rootElem, DOMNodeFilter::SHOW_ELEMENT, NULL, true); // create vector to hold Dom nodes vector<DOMNode*> elem_vec; // traverse tree using walker for (DOMNode* current = walker->nextNode(); current != 0; current = walker->nextNode()) { // store nodes int vector elem_vec.push_back(current); } // sort function - alphabetically elements std::sort(elem_vec.begin(), elem_vec.end(), compare_elem_alpha); // iterate through sorted nodes for (auto i : elem_vec) { int x; string text = string(x(i->getTextContent())); cout << "Node Name: " << x(i->getNodeName()) << ((text != "") ? " |Text Content: " + text : "") << endl; //get attr map if (i->hasAttributes()) { DOMNamedNodeMap *attr_map = i->getAttributes(); // get each node in the map for (x = 0; x < attr_map->getLength(); x++) { DOMNode *temp = attr_map->item(x); cout << setw(5) << "" << "Attribute" << x + 1 << ": " << x(temp->getNodeName()) << " = " << x(temp->getNodeValue()) << endl; } } } // release doc resources doc->release(); } catch (const OutOfMemoryException&) { XERCES_STD_QUALIFIER cerr << "OutOfMemoryException" << XERCES_STD_QUALIFIER endl; errorCode = 5; } catch (const DOMException& e) { XERCES_STD_QUALIFIER cerr << "DOMException code is: " << e.code << XERCES_STD_QUALIFIER endl; errorCode = 2; } catch (...) { XERCES_STD_QUALIFIER cerr << "An error occurred creating the document" << XERCES_STD_QUALIFIER endl; errorCode = 3; } }// (impl != NULL) else { XERCES_STD_QUALIFIER cerr << "Requested implementation is not supported" << XERCES_STD_QUALIFIER endl; errorCode = 4; } }
int main(int argC, char*argV[]) { // Initialize the XML4C2 system. try { XMLPlatformUtils::Initialize();/*init*/ } catch(const XMLException& toCatch) { char *pMsg = XMLString::transcode(toCatch.getMessage()); XERCES_STD_QUALIFIER cerr << "Error during Xerces-c Initialization.\n" << " Exception message:" << pMsg; XMLString::release(&pMsg); return 1; } DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(X("LS"));/**Implementation*/ DOMLSSerializer* theSerializer = ((DOMImplementationLS*)impl)->createLSSerializer();/** createLSSerializer*/ DOMLSOutput *theOutputDesc = ((DOMImplementationLS*)impl)->createLSOutput();/**createLSOutput*/ MemBufFormatTarget* target = new MemBufFormatTarget(); theOutputDesc->setByteStream(target); if (impl != NULL) { try { DOMDocument* doc = impl->createDocument( 0, // root element namespace URI. /**可用资源标识*/ X("corporation"), // root element name /**a large companny*/ 0); // document type object (DTD). /**mem mannager mode object*/ doc->setXmlStandalone(true); DOMElement* rootElem = doc->getDocumentElement(); rootElem->setAttribute(X("xmlns"), X("com:cmcc:corporation")); rootElem->setAttribute(X("xmlns:xsi"), X("http://www.w3.org/2001/XMLSchema-instance")); rootElem->setAttribute(X("xsi:schemaLocation"), X("com:cmcc:corporation corporation.xsd")); //add node DOMElement* prodElem = doc->createElement(X("eid")); rootElem->appendChild(prodElem); DOMText* prodDataVal = doc->createTextNode(X("100000")); prodElem->appendChild(prodDataVal); XercesDOMParser* parser = new XercesDOMParser(); //add basic child MemBufInputSource* basic_mem = new MemBufInputSource( (const XMLByte* )basic_string.c_str(), strlen(basic_string.c_str()), "basic", false); parser->parse( *basic_mem ); DOMDocument* xmlDoc = parser->getDocument(); DOMElement* basic_root = xmlDoc->getDocumentElement(); DOMNode* newnode = doc->importNode((DOMNode* )basic_root, true); rootElem->appendChild(newnode); delete basic_mem; //add the rules child MemBufInputSource* rules_mem = new MemBufInputSource( (const XMLByte* )rules_string.c_str(), rules_string.length(), "rules", false); parser->parse( *rules_mem ); xmlDoc = parser->getDocument(); DOMElement* rules_root = xmlDoc->getDocumentElement(); newnode = doc->importNode((DOMNode* )rules_root, true); rootElem->appendChild(newnode); delete rules_mem; //add the accounts child MemBufInputSource* accounts_mem = new MemBufInputSource( (const XMLByte* )accounts_string.c_str(), accounts_string.length(), "accounts", false); parser->parse( *accounts_mem ); xmlDoc = parser->getDocument(); DOMElement* accounts_root = xmlDoc->getDocumentElement(); newnode = doc->importNode((DOMNode* )accounts_root, true); rootElem->appendChild(newnode); delete accounts_mem; theSerializer->write(doc, theOutputDesc); std::cout<< target->getRawBuffer()<< std::endl; delete target; delete parser; theOutputDesc->release(); theSerializer->release(); doc->release(); } catch(const OutOfMemoryException&) { XERCES_STD_QUALIFIER cerr << "OutOfMemoryException" << XERCES_STD_QUALIFIER endl; } catch (const DOMException& e) { XERCES_STD_QUALIFIER cerr << "DOMException code is: " << e.code << XERCES_STD_QUALIFIER endl; } catch (...) { XERCES_STD_QUALIFIER cerr << "An error occurred creating the document" << XERCES_STD_QUALIFIER endl; } } else { XERCES_STD_QUALIFIER cerr << "Requested implementation is not supported" << XERCES_STD_QUALIFIER endl; } XMLPlatformUtils::Terminate(); return 0; }
bool XmlWorldParser::process_xml(const char* xmlFile) { try { XMLPlatformUtils::Initialize(); } catch (const XMLException& toCatch) { char* message = XMLString::transcode(toCatch.getMessage()); cout << "Error during initialization! :\n" << message << "\n"; XMLString::release(&message); return 1; } XercesDOMParser* parser = new XercesDOMParser(); parser->setValidationScheme(XercesDOMParser::Val_Always); parser->setDoNamespaces(true); // optional /** * Configure parser error handling */ ErrorHandler* errHandler = (ErrorHandler*) new HandlerBase(); // ErrorHandler *errHandler =(ErrorHandler*) new DOMPrintErrorHandler(); parser->setErrorHandler(errHandler); try { parser->parse(xmlFile); } catch (const XMLException& toCatch) { char* message = XMLString::transcode(toCatch.getMessage()); cout << "Exception message is: \n" << message << "\n"; XMLString::release(&message); return -1; } catch (const DOMException& toCatch) { char* message = XMLString::transcode(toCatch.msg); cout << "Exception message is: \n" << message << "\n"; XMLString::release(&message); return -1; } catch (const SAXException& toCatch) { char* message = XMLString::transcode(toCatch.getMessage()); cout << "Exception message is: " << message << "\n"; XMLString::release(&message); return -1; } catch (const exception& toCatch) { cout << "Unexpected Exception \n" << toCatch.what() << endl; return -1; } /** * Walk through the document, adding bodies and joints in their relative frames */ DOMDocument* doc = parser->getDocument(); DOMTreeWalker* walker = doc->createTreeWalker(doc->getDocumentElement(), DOMNodeFilter::SHOW_ELEMENT, new BodiesInWorld(), true); /** Initial world frame */ double transform[3] = { 0, 0, 0 }; processNode(walker, transform); //TODO Ensure that I am cleaning up everything I need to /** Clean up no longer needed resources **/ doc->release(); delete errHandler; return true; }
int main() { try { XMLPlatformUtils::Initialize(); } catch (const XMLException& toCatch) { char *pMessage = XMLString::transcode(toCatch.getMessage()); fprintf(stderr, "Error during XMLPlatformUtils::Initialize(). \n" " Message is: %s\n", pMessage); XMLString::release(&pMessage); return -1; } // Create a XMLCh buffer for string manipulation XMLCh tempStr[4000]; XMLCh featureStr[100]; XMLString::transcode("Traversal",featureStr,99); // // Doc - Create a small document tree // { //creating a DOM Tree /* Tests are based on the tree structure below doc - root - E11 (attr01) - textNode1 - E111 - E112 - cdataSec - E12 (attr02) - textNode2 - E121 - E122 - E13 - E131 - docPI - comment */ DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(featureStr); DOMDocument* doc = impl->createDocument(); //Creating a root element XMLString::transcode("RootElement", tempStr, 3999); DOMElement* root = doc->createElement(tempStr); doc->appendChild(root); //Creating the siblings of root XMLString::transcode("FirstSibling", tempStr, 3999); DOMElement* E11 = doc->createElement(tempStr); root->appendChild(E11); XMLString::transcode("SecondSibling", tempStr, 3999); DOMElement* E12 = doc->createElement(tempStr); root->appendChild(E12); XMLString::transcode("ThirdSibling", tempStr, 3999); DOMElement* E13 = doc->createElement(tempStr); root->appendChild(E13); //Attaching texts to few siblings XMLString::transcode("Text1", tempStr, 3999); DOMText* textNode1 = doc->createTextNode(tempStr); E11->appendChild(textNode1); XMLString::transcode("Text2", tempStr, 3999); DOMText* textNode2 = doc->createTextNode(tempStr); E12->appendChild(textNode2); //creating child of siblings XMLString::transcode("FirstSiblingChild1", tempStr, 3999); DOMElement* E111 = doc->createElement(tempStr); E11->appendChild(E111); XMLString::transcode("Attr01", tempStr, 3999); DOMAttr* attr01 = doc->createAttribute(tempStr); DOMNode* rem = E11->setAttributeNode(attr01); if (rem) rem->release(); XMLString::transcode("FirstSiblingChild2", tempStr, 3999); DOMElement* E112 = doc->createElement(tempStr); E11->appendChild(E112); XMLString::transcode("SecondSiblingChild1", tempStr, 3999); DOMElement* E121 = doc->createElement(tempStr); E12->appendChild(E121); XMLString::transcode("Attr01", tempStr, 3999); DOMAttr* attr02 = doc->createAttribute(tempStr); rem = E12->setAttributeNode(attr02); if (rem) rem->release(); XMLString::transcode("SecondSiblingChild2", tempStr, 3999); DOMElement* E122 = doc->createElement(tempStr); E12->appendChild(E122); XMLString::transcode("ThirdSiblingChild1", tempStr, 3999); DOMElement* E131 = doc->createElement(tempStr); E13->appendChild(E131); XMLString::transcode("DocComment", tempStr, 3999); DOMComment* comment = doc->createComment(tempStr); root->appendChild(comment); XMLString::transcode("DocCDataSection", tempStr, 3999); DOMCDATASection* cdataSec = doc->createCDATASection(tempStr); E11->appendChild(cdataSec); XMLString::transcode("DocPI", tempStr, 3999); XMLCh piStr[] = {chLatin_D, chLatin_o, chLatin_c, chLatin_P, chLatin_I, chNull}; DOMProcessingInstruction* docPI = doc->createProcessingInstruction(piStr, tempStr); E13->appendChild(docPI); /* following are whatToShow types: SHOW_ALL = 0x0000FFFF, SHOW_ELEMENT = 0x00000001, SHOW_ATTRIBUTE = 0x00000002, SHOW_TEXT = 0x00000004, SHOW_CDATA_SECTION = 0x00000008, SHOW_ENTITY_REFERENCE = 0x00000010, SHOW_ENTITY = 0x00000020, SHOW_PROCESSING_INSTRUCTION = 0x00000040, SHOW_COMMENT = 0x00000080, SHOW_DOCUMENT = 0x00000100, SHOW_DOCUMENT_TYPE = 0x00000200, SHOW_DOCUMENT_FRAGMENT = 0x00000400, SHOW_NOTATION = 0x00000800 */ ////////// NodeIterator Test Cases //////////////// { // all node iterating test DOMNode* node = doc->getFirstChild(); UNUSED(node); // silence warning unsigned long whatToShow = DOMNodeFilter::SHOW_ALL; MyFilter* filter = new MyFilter(0); DOMNodeIterator* iter = ((DOMDocumentTraversal*)doc)->createNodeIterator(root, whatToShow, filter, true); TASSERT(iter->getWhatToShow() == 65535); TASSERT(iter->getExpandEntityReferences() == 1); DOMNode* nd; nd = iter->nextNode(); TASSERT (nd ==root); nd = iter->nextNode(); TASSERT (nd ==E11); nd = iter->nextNode(); TASSERT(nd == textNode1); nd = iter->nextNode(); TASSERT(nd == E111); nd = iter->nextNode(); TASSERT(nd == E112); nd = iter->nextNode(); TASSERT(nd == cdataSec); nd = iter->nextNode(); TASSERT(nd == E12); nd = iter->nextNode(); TASSERT(nd == textNode2); nd = iter->nextNode(); TASSERT(nd == E121); nd = iter->nextNode(); TASSERT(nd == E122); nd = iter->nextNode(); TASSERT(nd == E13); nd = iter->nextNode(); TASSERT(nd == E131); nd = iter->nextNode(); TASSERT(nd == docPI); nd = iter->nextNode(); TASSERT(nd == comment); nd = iter->previousNode(); TASSERT(nd == comment); nd = iter->previousNode(); TASSERT(nd == docPI); nd = iter->previousNode(); TASSERT(nd == E131); //test getRoot TASSERT(iter->getRoot() == root); TASSERT(iter->getRoot() != doc); delete filter; } { //element node iterating test DOMNode* node = doc->getFirstChild(); UNUSED(node); // silence warning unsigned long whatToShow = DOMNodeFilter::SHOW_ELEMENT; MyFilter* filter = new MyFilter(DOMNode::ELEMENT_NODE); DOMNodeIterator* iter = doc->createNodeIterator(root, whatToShow, filter, true); TASSERT(iter->getWhatToShow() == 1); TASSERT(iter->getExpandEntityReferences() == 1); DOMNode* nd; nd = iter->nextNode(); TASSERT (nd ==root); nd = iter->nextNode(); TASSERT (nd ==E11); nd = iter->nextNode(); TASSERT(nd == E111); nd = iter->nextNode(); TASSERT(nd == E112); nd = iter->nextNode(); TASSERT(nd == E12); nd = iter->nextNode(); TASSERT(nd == E121); nd = iter->nextNode(); TASSERT(nd == E122); nd = iter->nextNode(); TASSERT(nd == E13); nd = iter->nextNode(); TASSERT(nd == E131); nd = iter->previousNode(); TASSERT(nd == E131); nd = iter->previousNode(); TASSERT(nd == E13); nd = iter->previousNode(); TASSERT(nd == E122); delete filter; } { // Text node iterating test DOMNode* node = doc->getFirstChild(); UNUSED(node); // silence warning unsigned long whatToShow = DOMNodeFilter::SHOW_TEXT; MyFilter* filter = new MyFilter(DOMNode::TEXT_NODE); DOMNodeIterator* iter = ((DOMDocumentTraversal*)doc)->createNodeIterator(root, whatToShow, filter, true); TASSERT(iter->getWhatToShow() == 4); TASSERT(iter->getExpandEntityReferences() == 1); DOMNode* nd; nd = iter->nextNode(); TASSERT (nd ==textNode1); nd = iter->nextNode(); TASSERT (nd ==textNode2); nd = iter->previousNode(); TASSERT(nd == textNode2); delete filter; } { //CDataSection node itearating test DOMNode* node = doc->getFirstChild(); UNUSED(node); // silence warning unsigned long whatToShow = DOMNodeFilter::SHOW_CDATA_SECTION; MyFilter* filter = new MyFilter(DOMNode::CDATA_SECTION_NODE); DOMNodeIterator* iter = doc->createNodeIterator(root, whatToShow, filter, true); TASSERT(iter->getWhatToShow() == 8); TASSERT(iter->getExpandEntityReferences() == 1); DOMNode* nd; nd = iter->nextNode(); TASSERT(nd == cdataSec); nd = iter->nextNode(); TASSERT(nd == 0); delete filter; } { // PI nodes iterating test DOMNode* node = doc->getFirstChild(); UNUSED(node); // silence warning unsigned long whatToShow = DOMNodeFilter::SHOW_PROCESSING_INSTRUCTION; MyFilter* filter = new MyFilter(DOMNode::PROCESSING_INSTRUCTION_NODE); DOMNodeIterator* iter = ((DOMDocumentTraversal*)doc)->createNodeIterator(root, whatToShow, filter, true); TASSERT(iter->getWhatToShow() == 64); TASSERT(iter->getExpandEntityReferences() == 1); DOMNode* nd; nd = iter->nextNode(); TASSERT(nd == docPI); nd = iter->nextNode(); TASSERT(nd == 0); delete filter; } { DOMNode* node = doc->getFirstChild(); UNUSED(node); // silence warning unsigned long whatToShow = DOMNodeFilter::SHOW_COMMENT; MyFilter* filter = new MyFilter(DOMNode::COMMENT_NODE); DOMNodeIterator* iter = doc->createNodeIterator(root, whatToShow, filter, true); TASSERT(iter->getWhatToShow() == 128); TASSERT(iter->getExpandEntityReferences() == 1); DOMNode* nd; nd = iter->nextNode(); TASSERT(nd == comment); nd = iter->nextNode(); TASSERT(nd == 0); delete filter; } ////////// TreeWalker Test Cases //////////////// { unsigned long whatToShow = DOMNodeFilter::SHOW_ALL; DOMTreeWalker* tw = ((DOMDocumentTraversal*)doc)->createTreeWalker(doc, whatToShow, 0, true); TASSERT(tw->getCurrentNode() == doc); TASSERT(tw->firstChild() == root); TASSERT(tw->nextSibling() == 0); TASSERT(tw->lastChild() == comment); TASSERT(tw->firstChild() == 0); TASSERT(tw->lastChild() == 0); TASSERT(tw->nextSibling() == 0); TASSERT(tw->nextNode() == 0); TASSERT(tw->previousSibling() == E13); TASSERT(tw->previousNode() == E122); TASSERT(tw->parentNode() == E12); TASSERT(tw->firstChild() == textNode2); TASSERT(tw->previousSibling() == 0); TASSERT(tw->nextSibling() == E121); TASSERT(tw->nextNode() == E122); TASSERT(tw->parentNode() == E12); TASSERT(tw->previousSibling() == E11); TASSERT(tw->previousNode() == root); TASSERT(tw->previousNode() == doc); TASSERT(tw->previousNode() == 0); TASSERT(tw->parentNode() == 0); TASSERT(tw->getCurrentNode() == doc); } { MyFilter mf(DOMNode::ELEMENT_NODE); unsigned long whatToShow = DOMNodeFilter::SHOW_ALL; DOMTreeWalker* tw = doc->createTreeWalker(root, whatToShow, &mf, true); TASSERT(tw->getCurrentNode() == root); TASSERT(tw->parentNode() == 0); //should not change currentNode TASSERT(tw->getCurrentNode() == root); TASSERT(tw->nextNode() == E11); TASSERT(tw->nextNode() == E111); tw->setCurrentNode(E12); //when first is not visible, should it go to its sibling? TASSERT(tw->firstChild() == E121); //first visible child TASSERT(tw->previousSibling() == 0); } { MyFilter mf(DOMNode::ELEMENT_NODE, true); unsigned long whatToShow = DOMNodeFilter::SHOW_ELEMENT; DOMTreeWalker* tw = ((DOMDocumentTraversal*)doc)->createTreeWalker(root, whatToShow, &mf, true); tw->setCurrentNode(E12); TASSERT(tw->firstChild() == E121); //still first visible child } { MyFilter mf(DOMNode::TEXT_NODE); unsigned long whatToShow = DOMNodeFilter::SHOW_TEXT; DOMTreeWalker* tw = doc->createTreeWalker(root, whatToShow, &mf, true); //when first is not visible, should it go to its descendent? TASSERT(tw->firstChild() == textNode1); //E11 skipped TASSERT(tw->firstChild() == 0); TASSERT(tw->nextNode() == textNode2); TASSERT(tw->nextSibling() == 0); TASSERT(tw->parentNode() == 0); //no visible ancestor TASSERT(tw->getCurrentNode() == textNode2); tw->setCurrentNode(root); //when last is not visible, should it go to its sibling & descendent? TASSERT(tw->lastChild() == textNode2); //last visible child tw->setCurrentNode(E12); //when next sibling is not visible, should it go to its descendent? TASSERT(tw->nextSibling() == 0); } { MyFilter mf(DOMNode::TEXT_NODE, true); unsigned long whatToShow = DOMNodeFilter::SHOW_TEXT; DOMTreeWalker* tw = ((DOMDocumentTraversal*)doc)->createTreeWalker(root, whatToShow, &mf, true); TASSERT(tw->firstChild() == 0); //E11 rejected and no children is TEXT TASSERT(tw->getCurrentNode() == root); TASSERT(tw->nextNode() == 0); //E11 rejected so can't get to textNode1 //test getRoot TASSERT(tw->getRoot() == root); TASSERT(tw->getRoot() != doc); } doc->release(); }; // And call the termination method XMLPlatformUtils::Terminate(); if (errorOccurred) { printf("Test Failed\n"); return 4; } printf("Test Run Successfully\n"); return 0; };
void writeStatFile(Tag2Html::MP3Collection* mp3Collection) { ostringstream convert; XMLPlatformUtils::Initialize(); DOMImplementation* domImplementation = DOMImplementationRegistry::getDOMImplementation(XMLString::transcode("core")); // <html> DOMDocument* doc = domImplementation->createDocument(0, XMLString::transcode("html"), 0); DOMDocumentType* docType = domImplementation->createDocumentType(XMLString::transcode("html"), XMLString::transcode(""), XMLString::transcode("")); doc->insertBefore(docType, doc->getDocumentElement()); // <head> DOMElement* head = doc->createElement(XMLString::transcode("head")); // <link rel="stylesheet" type="text/css" href="index.css"> DOMElement* headLink = doc->createElement(XMLString::transcode("link")); headLink->setAttribute(XMLString::transcode("rel"), XMLString::transcode("stylesheet")); headLink->setAttribute(XMLString::transcode("type"), XMLString::transcode("text/css")); headLink->setAttribute(XMLString::transcode("href"), XMLString::transcode("index.css")); head->appendChild(headLink); // <title>tag2html stat page</title> DOMElement* headTitle = doc->createElement(XMLString::transcode("title")); headTitle->setTextContent(XMLString::transcode("tag2html stat page")); head->appendChild(headTitle); // <meta http-equiv="Content-Type" content="text/html" charset="utf-8"> DOMElement* headMeta = doc->createElement(XMLString::transcode("meta")); headMeta->setAttribute(XMLString::transcode("http-equiv"), XMLString::transcode("Content-Type")); headMeta->setAttribute(XMLString::transcode("content"), XMLString::transcode("text/html")); headMeta->setAttribute(XMLString::transcode("charset"), XMLString::transcode("utf-8")); head->appendChild(headMeta); // <body> DOMElement* body = doc->createElement(XMLString::transcode("body")); // <br><br><br> body->appendChild(doc->createElement(XMLString::transcode("br"))); body->appendChild(doc->createElement(XMLString::transcode("br"))); body->appendChild(doc->createElement(XMLString::transcode("br"))); // <table align="center" width="300"> DOMElement* table = doc->createElement(XMLString::transcode("table")); table->setAttribute(XMLString::transcode("align"), XMLString::transcode("center")); table->setAttribute(XMLString::transcode("width"), XMLString::transcode("300")); // <tbody> DOMElement* tbody = doc->createElement(XMLString::transcode("tbody")); // <tr valign="top" bgcolor="#CCCCCC"> DOMElement* tableRow = doc->createElement(XMLString::transcode("tr")); tableRow->setAttribute(XMLString::transcode("valign"), XMLString::transcode("top")); tableRow->setAttribute(XMLString::transcode("bgcolor"), XMLString::transcode("#CCCCCC")); // <td align="center"> DOMElement* tableColumn = doc->createElement(XMLString::transcode("td")); tableColumn->setAttribute(XMLString::transcode("align"), XMLString::transcode("center")); tableRow->appendChild(tableColumn); // <b>Statistics</b> DOMElement* columnStatistics = doc->createElement(XMLString::transcode("b")); columnStatistics->setTextContent(XMLString::transcode("Statistics")); tableColumn->appendChild(columnStatistics); // <tr> DOMElement* tableRow2 = doc->createElement(XMLString::transcode("tr")); // <td> DOMElement* tableColumn2 = doc->createElement(XMLString::transcode("td")); // <table class="nb"> DOMElement* innerTable = doc->createElement(XMLString::transcode("table")); innerTable->setAttribute(XMLString::transcode("class"), XMLString::transcode("nb")); // <tr> DOMElement* rowFileType = doc->createElement(XMLString::transcode("tr")); // <td style="font-weight: bold;">File Type:</td> DOMElement* columnFileType = doc->createElement(XMLString::transcode("td")); columnFileType->setAttribute(XMLString::transcode("style"), XMLString::transcode("font-weight: bold;")); columnFileType->setTextContent(XMLString::transcode("File Type:")); rowFileType->appendChild(columnFileType); // <td>MP3</td> DOMElement* columnFileTypeValue = doc->createElement(XMLString::transcode("td")); columnFileTypeValue->setTextContent(XMLString::transcode("MP3")); rowFileType->appendChild(columnFileTypeValue); // <tr> DOMElement* rowFileCount = doc->createElement(XMLString::transcode("tr")); // <td style="font-weight: bold;">File Count:</td> DOMElement* columnFileCount = doc->createElement(XMLString::transcode("td")); columnFileCount->setAttribute(XMLString::transcode("style"), XMLString::transcode("font-weight: bold;")); columnFileCount->setTextContent(XMLString::transcode("File Count:")); rowFileCount->appendChild(columnFileCount); // <td>" << mystat->mp3_count << "</td> DOMElement* columnFileCountValue = doc->createElement(XMLString::transcode("td")); convert.str(""); convert << mp3Collection->items.size(); columnFileCountValue->setTextContent(XMLString::transcode(convert.str().c_str())); rowFileCount->appendChild(columnFileCountValue); // <tr>\n"; DOMElement* rowArtistCount = doc->createElement(XMLString::transcode("tr")); // <td style="font-weight: bold;">Artist Count:</td> DOMElement* columnArtistCount = doc->createElement(XMLString::transcode("td")); columnArtistCount->setAttribute(XMLString::transcode("style"), XMLString::transcode("font-weight: bold;")); columnArtistCount->setTextContent(XMLString::transcode("Artist Count:")); rowArtistCount->appendChild(columnArtistCount); // <td>" << mystat->art_count << "</td> DOMElement* columnArtistCountValue = doc->createElement(XMLString::transcode("td")); convert.str(""); convert << mp3Collection->getArtistCount(); columnArtistCountValue->setTextContent(XMLString::transcode(convert.str().c_str())); rowArtistCount->appendChild(columnArtistCountValue); // <tr> DOMElement* rowAlbumCount = doc->createElement(XMLString::transcode("tr")); // <td style="font-weight: bold;">Album Count:</td> DOMElement* columnAlbumCount = doc->createElement(XMLString::transcode("td")); columnAlbumCount->setAttribute(XMLString::transcode("style"), XMLString::transcode("font-weight: bold;")); columnAlbumCount->setTextContent(XMLString::transcode("Album Count:")); rowAlbumCount->appendChild(columnAlbumCount); // <td>" << mystat->alb_count << "</td> DOMElement* columnAlbumCountValue = doc->createElement(XMLString::transcode("td")); convert.str(""); convert << mp3Collection->getAlbumCount(); columnAlbumCountValue->setTextContent(XMLString::transcode(convert.str().c_str())); rowAlbumCount->appendChild(columnAlbumCountValue); // <tr> DOMElement* rowTotalSize = doc->createElement(XMLString::transcode("tr")); // <td style="font-weight: bold;">Total Size:</td> DOMElement* columnTotalSize = doc->createElement(XMLString::transcode("td")); columnTotalSize->setAttribute(XMLString::transcode("style"), XMLString::transcode("font-weight: bold;")); columnTotalSize->setTextContent(XMLString::transcode("Total Filesize:")); rowTotalSize->appendChild(columnTotalSize); // <td>" << ( mystat->tot_filesize/(1024*1024)) << " MByte</td> DOMElement* columnTotalSizeValue = doc->createElement(XMLString::transcode("td")); convert.str(""); convert << (mp3Collection->getTotalFilesize() / 1024 / 1024) << " MB"; columnTotalSizeValue->setTextContent(XMLString::transcode(convert.str().c_str())); rowTotalSize->appendChild(columnTotalSizeValue); // <tr> DOMElement* rowTotalLength = doc->createElement(XMLString::transcode("tr")); // <td style="font-weight: bold;">Total Length:</td> DOMElement* columnTotalLength = doc->createElement(XMLString::transcode("td")); columnTotalLength->setAttribute(XMLString::transcode("style"), XMLString::transcode("font-weight: bold;")); columnTotalLength->setTextContent(XMLString::transcode("Total Length:")); rowTotalLength->appendChild(columnTotalLength); // <td> ~ " << mystat->tot_length << "</td> DOMElement* columnTotalLengthValue = doc->createElement(XMLString::transcode("td")); convert.str(""); char statLength[12]; struct tm* timeinfo = new tm(); int seconds = mp3Collection->getTotalLength(); if (seconds >= 60) { int minutes = seconds / 60; if (minutes >= 60) { timeinfo->tm_hour = minutes / 60; timeinfo->tm_min = minutes / 60; } else { timeinfo->tm_min = seconds / 60; } } timeinfo->tm_sec = seconds % 60; strftime(statLength, 12, "%H:%M:%S", timeinfo); columnTotalLengthValue->setTextContent(XMLString::transcode(statLength)); rowTotalLength->appendChild(columnTotalLengthValue); innerTable->appendChild(rowFileType); innerTable->appendChild(rowFileCount); innerTable->appendChild(rowArtistCount); innerTable->appendChild(rowAlbumCount); innerTable->appendChild(rowTotalSize); innerTable->appendChild(rowTotalLength); tableColumn2->appendChild(innerTable); tableRow2->appendChild(tableColumn2); tbody->appendChild(tableRow); tbody->appendChild(tableRow2); table->appendChild(tbody); body->appendChild(table); doc->getDocumentElement()->appendChild(head); doc->getDocumentElement()->appendChild(body); DOMWriter* writer = ((DOMImplementationLS*)domImplementation)->createDOMWriter(); if (writer->canSetFeature(XMLUni::fgDOMWRTFormatPrettyPrint, true)) { writer->setFeature(XMLUni::fgDOMWRTFormatPrettyPrint, true); } if (writer->canSetFeature(XMLUni::fgDOMXMLDeclaration, false)) { writer->setFeature(XMLUni::fgDOMXMLDeclaration, false); } XMLFormatTarget *fileFormatTarget = new LocalFileFormatTarget("stats.html"); writer->writeNode(fileFormatTarget, *doc); fileFormatTarget->flush(); writer->release(); doc->release(); XMLPlatformUtils::Terminate(); }
// --------------------------------------------------------------------------- // This method assumes that currentNode is an xinclude element and parses // it accordingly, acting on what it finds. // --------------------------------------------------------------------------- bool XIncludeUtils::doDOMNodeXInclude(DOMNode *xincludeNode, DOMDocument *parsedDocument, XMLEntityHandler* entityResolver){ bool modifiedNode = false; /* the relevant attributes to look for */ const XMLCh *href = NULL; const XMLCh *parse = NULL; const XMLCh *xpointer = NULL; const XMLCh *encoding = NULL; const XMLCh *accept = NULL; const XMLCh *acceptlanguage = NULL; DOMNode *includeParent = xincludeNode->getParentNode(); if(xincludeNode->hasAttributes()) { /* get all the attributes of the node */ DOMNamedNodeMap *pAttributes = xincludeNode->getAttributes(); XMLSize_t nSize = pAttributes->getLength(); for(XMLSize_t i=0;i<nSize;++i) { DOMAttr *pAttributeNode = (DOMAttr*) pAttributes->item(i); const XMLCh *attrName = pAttributeNode->getName(); /* check each attribute against the potential useful names */ if (XMLString::equals(attrName, XIncludeUtils::fgXIIncludeHREFAttrName)){ href = pAttributeNode->getValue(); } else if (XMLString::equals(attrName, XIncludeUtils::fgXIIncludeParseAttrName)){ parse = pAttributeNode->getValue(); } else if (XMLString::equals(attrName, XIncludeUtils::fgXIIncludeXPointerAttrName)){ xpointer = pAttributeNode->getValue(); } else if (XMLString::equals(attrName, XIncludeUtils::fgXIIncludeEncodingAttrName)){ encoding = pAttributeNode->getValue(); } else if (XMLString::equals(attrName, XIncludeUtils::fgXIIncludeAcceptAttrName)){ accept = pAttributeNode->getValue(); } else if (XMLString::equals(attrName, XIncludeUtils::fgXIIncludeAcceptLanguageAttrName)){ acceptlanguage = pAttributeNode->getValue(); } else { /* if any other attribute is in the xi namespace, it's an error */ const XMLCh *attrNamespaceURI = pAttributeNode->getNamespaceURI(); if (attrNamespaceURI && XMLString::equals(attrNamespaceURI, XIncludeUtils::fgXIIIncludeNamespaceURI)){ } else { /* ignore - any other attribute is allowed according to spec, and must be ignored */ } } } } // 3.1 xi:include Element // The children property of the xi:include element may include a single xi:fallback element; // the appearance of more than one xi:fallback element, an xi:include element, // or any other element from the XInclude namespace is a fatal error. DOMNode *child; DOMElement *fallback = NULL; for (child = xincludeNode->getFirstChild(); child != 0; child=child->getNextSibling()){ if(child->getNodeType()!=DOMNode::ELEMENT_NODE) continue; if ( isXIFallbackDOMNode(child) ){ if (fallback != NULL){ /* fatal error - there are more than one fallback children */ XIncludeUtils::reportError(xincludeNode, XMLErrs::XIncludeMultipleFallbackElems, parsedDocument->getDocumentURI(), parsedDocument->getDocumentURI()); return false; } fallback = (DOMElement*)child; } else if(isXIIncludeDOMNode(child) || XMLString::equals(child->getNamespaceURI(), XIncludeUtils::fgXIIIncludeNamespaceURI)) { /* fatal error - an xi element different from xi:fallback is a child of xi:include */ XIncludeUtils::reportError(xincludeNode, XMLErrs::XIncludeDisallowedChild, child->getNodeName(), parsedDocument->getDocumentURI()); return false; } } if (href == NULL){ /* this is an unrecoverable error until we have xpointer support - if there is an xpointer, the current document is assumed however, there is no xpointer support yet */ XIncludeUtils::reportError(xincludeNode, XMLErrs::XIncludeNoHref, NULL, parsedDocument->getDocumentURI()); return false; } /* set up the accept and accept-language values */ if (accept != NULL){ } if (parse == NULL){ /* use the default, as specified */ parse = XIncludeUtils::fgXIIncludeParseAttrXMLValue; } if (xpointer != NULL){ /* not supported yet */ /* Note that finding an xpointer attr along with parse="text" is a Fatal Error * - http://www.w3.org/TR/xinclude/#include-location */ XIncludeUtils::reportError(xincludeNode, XMLErrs::XIncludeXPointerNotSupported, NULL, href); return false; } /* set up the href according to what has gone before */ XIncludeLocation hrefLoc(href); XIncludeLocation relativeLocation(href); const XMLCh *includeBase = xincludeNode->getBaseURI(); if (includeBase != NULL){ hrefLoc.prependPath(includeBase); } if (getBaseAttrValue(xincludeNode) != NULL){ relativeLocation.prependPath(getBaseAttrValue(xincludeNode)); } /* Take the relevant action - we need to retrieve the target as a whole before we can know if it was successful or not, therefore the do* methods do not modify the parsedDocument. Swapping the results in is left to the caller (i.e. here) */ DOMText *includedText = NULL; DOMDocument *includedDoc = NULL; if (XMLString::equals(parse, XIncludeUtils::fgXIIncludeParseAttrXMLValue)){ /* including a XML element */ includedDoc = doXIncludeXMLFileDOM(hrefLoc.getLocation(), relativeLocation.getLocation(), xincludeNode, parsedDocument, entityResolver); } else if (XMLString::equals(parse, XIncludeUtils::fgXIIncludeParseAttrTextValue)){ /* including a text value */ includedText = doXIncludeTEXTFileDOM(hrefLoc.getLocation(), relativeLocation.getLocation(), encoding, xincludeNode, parsedDocument, entityResolver); } else { /* invalid parse attribute value - fatal error according to the specification */ XIncludeUtils::reportError(xincludeNode, XMLErrs::XIncludeInvalidParseVal, parse, parsedDocument->getDocumentURI()); return false; } RefVectorOf<DOMNode> delayedProcessing(12,false); if (includedDoc == NULL && includedText == NULL){ /* there was an error - this is now a resource error let's see if there is a fallback */ XIncludeUtils::reportError(xincludeNode, XMLErrs::XIncludeIncludeFailedResourceError, hrefLoc.getLocation(), parsedDocument->getDocumentURI()); if (includeParent == NULL){ includeParent = parsedDocument; } // we could be getting errors trying to insert elements at the root of the document, so we should use replaceChild; // in order to handle multiple nodes, add them to a document fragment and use that to replace the original node if (fallback){ /* baseURI fixups - see http://www.w3.org/TR/xinclude/#base for details. */ XMLUri parentURI(includeParent->getBaseURI()); XMLUri includedURI(fallback->getBaseURI()); if (fallback->hasChildNodes()){ DOMDocumentFragment* frag = parsedDocument->createDocumentFragment(); DOMNode *child = fallback->getFirstChild(); /* add the content of the fallback element, and remove the fallback elem itself */ for ( ; child != NULL ; child=child->getNextSibling()){ if (child->getNodeType() == DOMNode::DOCUMENT_TYPE_NODE){ continue; } DOMNode *newNode = parsedDocument->importNode(child, true); /* if the paths differ we need to add a base attribute */ if (newNode->getNodeType()==DOMNode::ELEMENT_NODE && !XMLString::equals(parentURI.getPath(), includedURI.getPath())){ if (getBaseAttrValue(newNode) == NULL){ /* need to calculate the proper path difference to get the relativePath */ ((DOMElement*)newNode)->setAttribute(fgXIBaseAttrName, getBaseAttrValue(fallback->getParentNode())); } else { /* the included node has base of its own which takes precedence */ XIncludeLocation xil(getBaseAttrValue(newNode)); if (getBaseAttrValue(fallback->getParentNode()) != NULL){ /* prepend any specific base modification of the xinclude node */ xil.prependPath(getBaseAttrValue(fallback->getParentNode())); } ((DOMElement*)newNode)->setAttribute(fgXIBaseAttrName, xil.getLocation()); } } DOMNode *newChild = frag->appendChild(newNode); // don't process the node now, wait until it is placed in the final position delayedProcessing.addElement(newChild); //parseDOMNodeDoingXInclude(newChild, parsedDocument, entityResolver); } includeParent->replaceChild(frag, xincludeNode); frag->release(); for(XMLSize_t i=0;i<delayedProcessing.size();i++) { DOMNode* childNode=delayedProcessing.elementAt(i); parseDOMNodeDoingXInclude(childNode, parsedDocument, entityResolver); } modifiedNode = true; } else { /* empty fallback element - simply remove it! */ includeParent->removeChild(xincludeNode); modifiedNode = true; } } else { XIncludeUtils::reportError(xincludeNode, XMLErrs::XIncludeIncludeFailedNoFallback, parsedDocument->getDocumentURI(), parsedDocument->getDocumentURI()); return false; } } else { if (includedDoc){ /* record the successful include while we process the children */ addDocumentURIToCurrentInclusionHistoryStack(hrefLoc.getLocation()); DOMDocumentFragment* frag = parsedDocument->createDocumentFragment(); /* need to import the document prolog here */ DOMNode *child = includedDoc->getFirstChild(); for (; child != NULL; child = child->getNextSibling()) { if (child->getNodeType() == DOMNode::DOCUMENT_TYPE_NODE) continue; // check for NOTATION or ENTITY clash if(child->getNodeType()==DOMNode::ELEMENT_NODE && includedDoc->getDoctype()!=NULL) { DOMNamedNodeMap *pAttributes = child->getAttributes(); XMLSize_t nSize = pAttributes->getLength(); for(XMLSize_t i=0;i<nSize;++i) { DOMAttr *pAttributeNode = (DOMAttr*) pAttributes->item(i); const DOMTypeInfo * typeInfo=pAttributeNode->getSchemaTypeInfo(); if(typeInfo && XMLString::equals(typeInfo->getTypeNamespace(), XMLUni::fgInfosetURIName)) { if(XMLString::equals(typeInfo->getTypeName(), XMLUni::fgNotationString)) { const XMLCh* notationName=pAttributeNode->getNodeValue(); DOMNotation* notat=(DOMNotation*)includedDoc->getDoctype()->getNotations()->getNamedItem(notationName); // ensure we have a DTD if(parsedDocument->getDoctype()==NULL) parsedDocument->insertBefore(parsedDocument->createDocumentType(parsedDocument->getDocumentElement()->getNodeName(), NULL,NULL), parsedDocument->getFirstChild()); DOMNotation* myNotation=(DOMNotation*)parsedDocument->getDoctype()->getNotations()->getNamedItem(notationName); if(myNotation==NULL) { // it's missing, add it parsedDocument->getDoctype()->getNotations()->setNamedItem(parsedDocument->importNode(notat, true)); } else if(XMLString::equals(myNotation->getPublicId(), notat->getPublicId()) && XMLString::equals(myNotation->getSystemId(), notat->getSystemId()) && XMLString::equals(myNotation->getBaseURI(), notat->getBaseURI())) { // it's duplicate, ignore it } else { // it's a conflict, report it XIncludeUtils::reportError(xincludeNode, XMLErrs::XIncludeConflictingNotation, notationName, parsedDocument->getDocumentURI()); } } else if(XMLString::equals(typeInfo->getTypeName(), XMLUni::fgEntityString)) { const XMLCh* entityName=pAttributeNode->getNodeValue(); DOMEntity* ent=(DOMEntity*)includedDoc->getDoctype()->getEntities()->getNamedItem(entityName); // ensure we have a DTD if(parsedDocument->getDoctype()==NULL) parsedDocument->insertBefore(parsedDocument->createDocumentType(parsedDocument->getDocumentElement()->getNodeName(), NULL,NULL), parsedDocument->getFirstChild()); DOMEntity* myEnt=(DOMEntity*)parsedDocument->getDoctype()->getEntities()->getNamedItem(entityName); if(myEnt==NULL) { // it's missing, add it parsedDocument->getDoctype()->getEntities()->setNamedItem(parsedDocument->importNode(ent, true)); } else if(XMLString::equals(myEnt->getPublicId(), ent->getPublicId()) && XMLString::equals(myEnt->getSystemId(), ent->getSystemId()) && XMLString::equals(myEnt->getBaseURI(), ent->getBaseURI())) { // it's duplicate, ignore it } else { // it's a conflict, report it XIncludeUtils::reportError(xincludeNode, XMLErrs::XIncludeConflictingEntity, entityName, parsedDocument->getDocumentURI()); } } } } } DOMNode *newNode = parsedDocument->importNode(child, true); DOMNode *newChild = frag->appendChild(newNode); // don't process the node now, wait until it is placed in the final position delayedProcessing.addElement(newChild); //parseDOMNodeDoingXInclude(newChild, parsedDocument, entityResolver); } includeParent->replaceChild(frag, xincludeNode); frag->release(); for(XMLSize_t i=0;i<delayedProcessing.size();i++) { DOMNode* childNode=delayedProcessing.elementAt(i); parseDOMNodeDoingXInclude(childNode, parsedDocument, entityResolver); } popFromCurrentInclusionHistoryStack(NULL); modifiedNode = true; } else if (includedText){ includeParent->replaceChild(includedText, xincludeNode); modifiedNode = true; } } if (includedDoc) includedDoc->release(); return modifiedNode; }
void writeInfoFile(Tag2Html::MP3Collection* mp3Collection) { ostringstream convert; XMLPlatformUtils::Initialize(); DOMImplementation* domImplementation = DOMImplementationRegistry::getDOMImplementation(XMLString::transcode("core")); // <html> DOMDocument* doc = domImplementation->createDocument(0, XMLString::transcode("html"), 0); DOMDocumentType* docType = domImplementation->createDocumentType(XMLString::transcode("html"), XMLString::transcode(""), XMLString::transcode("")); doc->insertBefore(docType, doc->getDocumentElement()); // <head> DOMElement* head = doc->createElement(XMLString::transcode("head")); // <link rel="stylesheet" type="text/css" href="./index.css"> DOMElement* headLink = doc->createElement(XMLString::transcode("link")); headLink->setAttribute(XMLString::transcode("rel"), XMLString::transcode("stylesheet")); headLink->setAttribute(XMLString::transcode("type"), XMLString::transcode("text/css")); headLink->setAttribute(XMLString::transcode("href"), XMLString::transcode("index.css")); head->appendChild(headLink); // <title>tag2html info page</title> DOMElement* headTitle = doc->createElement(XMLString::transcode("title")); headTitle->setTextContent(XMLString::transcode("tag2html info page")); head->appendChild(headTitle); // <meta http-equiv="Content-Type" content="text/html" charset="utf-8"> DOMElement* headMeta = doc->createElement(XMLString::transcode("meta")); headMeta->setAttribute(XMLString::transcode("http-equiv"), XMLString::transcode("Content-Type")); headMeta->setAttribute(XMLString::transcode("content"), XMLString::transcode("text/html")); headMeta->setAttribute(XMLString::transcode("charset"), XMLString::transcode("utf-8")); head->appendChild(headMeta); // <body> DOMElement* body = doc->createElement(XMLString::transcode("body")); // <h1>File Info</h1> DOMElement* h1 = doc->createElement(XMLString::transcode("h1")); h1->setTextContent(XMLString::transcode("File Info")); body->appendChild(h1); // <table align="center"> DOMElement* table = doc->createElement(XMLString::transcode("table")); table->setAttribute(XMLString::transcode("align"), XMLString::transcode("center")); // <thead> DOMElement* tHead = doc->createElement(XMLString::transcode("thead")); // <tr bgcolor="#CCCCCC"> DOMElement* tHeadRow = doc->createElement(XMLString::transcode("tr")); tHeadRow->setAttribute(XMLString::transcode("bgcolor"), XMLString::transcode("#CCCCCC")); // <th style="width: 100px; font-weight: bold;">Filename</th> DOMElement* tHeadColumn1 = doc->createElement(XMLString::transcode("th")); tHeadColumn1->setTextContent(XMLString::transcode("Filename")); tHeadRow->appendChild(tHeadColumn1); // <th style="width: 50px; font-weight: bold;">Bitrate</th> DOMElement* tHeadColumn2 = doc->createElement(XMLString::transcode("th")); tHeadColumn2->setTextContent(XMLString::transcode("Bitrate")); tHeadRow->appendChild(tHeadColumn2); // <th style="width: 100px; font-weight: bold;">MPEG Audio Version</th> DOMElement* tHeadColumn3 = doc->createElement(XMLString::transcode("th")); tHeadColumn3->setTextContent(XMLString::transcode("MPEG Audio Version")); tHeadRow->appendChild(tHeadColumn3); // <th style="width: 100px; font-weight: bold;">Layer</th> DOMElement* tHeadColumn4 = doc->createElement(XMLString::transcode("th")); tHeadColumn4->setTextContent(XMLString::transcode("Layer")); tHeadRow->appendChild(tHeadColumn4); // <th style="width: 100px; font-weight: bold;">Error Protection</th> DOMElement* tHeadColumn5 = doc->createElement(XMLString::transcode("th")); tHeadColumn5->setTextContent(XMLString::transcode("Error Protection")); tHeadRow->appendChild(tHeadColumn5); // <th style="width: 100px; font-weight: bold;">Sampling Rate</th> DOMElement* tHeadColumn6 = doc->createElement(XMLString::transcode("th")); tHeadColumn6->setTextContent(XMLString::transcode("Sampling Rate")); tHeadRow->appendChild(tHeadColumn6); // <th style="width: 50px; font-weight: bold;">Private</th> DOMElement* tHeadColumn7 = doc->createElement(XMLString::transcode("th")); tHeadColumn7->setTextContent(XMLString::transcode("Private")); tHeadRow->appendChild(tHeadColumn7); // <th style="width: 100px; font-weight: bold;">Channel Mode</th> DOMElement* tHeadColumn8 = doc->createElement(XMLString::transcode("th")); tHeadColumn8->setTextContent(XMLString::transcode("Channel Mode")); tHeadRow->appendChild(tHeadColumn8); // <th style="width: 100px; font-weight: bold;">Copyright</th> DOMElement* tHeadColumn9 = doc->createElement(XMLString::transcode("th")); tHeadColumn9->setTextContent(XMLString::transcode("Copyright")); tHeadRow->appendChild(tHeadColumn9); // <th style="width: 50px; font-weight: bold;">Original</th> DOMElement* tHeadColumn10 = doc->createElement(XMLString::transcode("th")); tHeadColumn10->setTextContent(XMLString::transcode("Original")); tHeadRow->appendChild(tHeadColumn10); // <th style="width: 100px; font-weight: bold;">Emphasis</th> DOMElement* tHeadColumn11 = doc->createElement(XMLString::transcode("th")); tHeadColumn11->setTextContent(XMLString::transcode("Emphasis")); tHeadRow->appendChild(tHeadColumn11); tHead->appendChild(tHeadRow); table->appendChild(tHead); // <tbody> DOMElement* tBody = doc->createElement(XMLString::transcode("tbody")); list<Tag2Html::MP3Infos*> sortedList = mp3Collection->getSortedList(); for (list<Tag2Html::MP3Infos*>::iterator mp3info = sortedList.begin(); mp3info != sortedList.end(); mp3info++) { // <tr> DOMElement* currentRow = doc->createElement(XMLString::transcode("tr")); // <td>" << mytag->filename << "</td> DOMElement* columnFilename = doc->createElement(XMLString::transcode("td")); columnFilename->setTextContent(XMLString::transcode((*mp3info)->filename.c_str())); currentRow->appendChild(columnFilename); // <td>" << myheader->Bitrate << "</td> DOMElement* columnBitrate = doc->createElement(XMLString::transcode("td")); convert.str(""); convert << (*mp3info)->bitrate << " kbit/s"; columnBitrate->setTextContent(XMLString::transcode(convert.str().c_str())); currentRow->appendChild(columnBitrate); // <td>" << myheader->MPEG_Audio_Version << "</td> DOMElement* columnMPEGAudioVersion = doc->createElement(XMLString::transcode("td")); switch((*mp3info)->version) { case TagLib::MPEG::Header::Version::Version1: columnMPEGAudioVersion->setTextContent(XMLString::transcode("1")); break; case TagLib::MPEG::Header::Version::Version2: columnMPEGAudioVersion->setTextContent(XMLString::transcode("2")); break; case TagLib::MPEG::Header::Version::Version2_5: columnMPEGAudioVersion->setTextContent(XMLString::transcode("2.5")); break; } currentRow->appendChild(columnMPEGAudioVersion); // <td>" << myheader->Layer << "</td> DOMElement* columnLayer = doc->createElement(XMLString::transcode("td")); convert.str(""); convert << (*mp3info)->layer; columnLayer->setTextContent(XMLString::transcode(convert.str().c_str())); currentRow->appendChild(columnLayer); // <td>" << myheader->Error_Protection << "</td> DOMElement* columnErrorProtection = doc->createElement(XMLString::transcode("td")); if ((*mp3info)->protectionEnabled) { columnErrorProtection->setTextContent(XMLString::transcode("yes")); } else { columnErrorProtection->setTextContent(XMLString::transcode("no")); } currentRow->appendChild(columnErrorProtection); // <td>" << myheader->Samplerate << "</td> DOMElement* columnSamplerate = doc->createElement(XMLString::transcode("td")); convert.str(""); convert << (*mp3info)->samplerate << " Hz"; columnSamplerate->setTextContent(XMLString::transcode(convert.str().c_str())); currentRow->appendChild(columnSamplerate); // <td>" << myheader->Private << "</td> DOMElement* columnPrivate = doc->createElement(XMLString::transcode("td")); columnPrivate->setTextContent(XMLString::transcode("")); currentRow->appendChild(columnPrivate); // <td>" << myheader->Channel_Mode << "</td> DOMElement* columnChannelMode = doc->createElement(XMLString::transcode("td")); switch((*mp3info)->channelMode) { case TagLib::MPEG::Header::ChannelMode::DualChannel: columnChannelMode->setTextContent(XMLString::transcode("Dual Channel")); break; case TagLib::MPEG::Header::ChannelMode::JointStereo: columnChannelMode->setTextContent(XMLString::transcode("Joint Stereo")); break; case TagLib::MPEG::Header::ChannelMode::SingleChannel: columnChannelMode->setTextContent(XMLString::transcode("Single Channel")); break; case TagLib::MPEG::Header::ChannelMode::Stereo: columnChannelMode->setTextContent(XMLString::transcode("Stereo")); break; } currentRow->appendChild(columnChannelMode); // <td>" << myheader->Copyright << "</td> DOMElement* columnCopyright = doc->createElement(XMLString::transcode("td")); if ((*mp3info)->isCopyrighted) { columnCopyright->setTextContent(XMLString::transcode("yes")); } else { columnCopyright->setTextContent(XMLString::transcode("no")); } currentRow->appendChild(columnCopyright); // <td>" << myheader->Original << "</td> DOMElement* columnOriginal = doc->createElement(XMLString::transcode("td")); if ((*mp3info)->isOriginal) { columnOriginal->setTextContent(XMLString::transcode("yes")); } else { columnOriginal->setTextContent(XMLString::transcode("no")); } currentRow->appendChild(columnOriginal); // <td>" << myheader->Emphasis << "</td> DOMElement* columnEmphasis = doc->createElement(XMLString::transcode("td")); columnEmphasis->setTextContent(XMLString::transcode("")); currentRow->appendChild(columnEmphasis); tBody->appendChild(currentRow); } table->appendChild(tBody); body->appendChild(table); doc->getDocumentElement()->appendChild(head); doc->getDocumentElement()->appendChild(body); DOMWriter* writer = ((DOMImplementationLS*)domImplementation)->createDOMWriter(); if (writer->canSetFeature(XMLUni::fgDOMWRTFormatPrettyPrint, true)) { writer->setFeature(XMLUni::fgDOMWRTFormatPrettyPrint, true); } if (writer->canSetFeature(XMLUni::fgDOMXMLDeclaration, false)) { writer->setFeature(XMLUni::fgDOMXMLDeclaration, false); } XMLFormatTarget *fileFormatTarget = new LocalFileFormatTarget("info.html"); writer->writeNode(fileFormatTarget, *doc); fileFormatTarget->flush(); writer->release(); doc->release(); XMLPlatformUtils::Terminate(); }
int main() { try { XMLPlatformUtils::Initialize(); } catch (const XMLException& toCatch) { char *pMessage = XMLString::transcode(toCatch.getMessage()); fprintf(stderr, "Error during XMLPlatformUtils::Initialize(). \n" " Message is: %s\n", pMessage); XMLString::release(&pMessage); return -1; } /* Range tests include testing of createRange setStart, setStartBefore. setStartAfter, setEnd, setEndBefore. setEndAfter getStartContainer, getStartOffset getEndContainer, getEndOffset getCommonAncestorContainer selectNode selectNodeContents insertNode deleteContents collapse getCollapsed surroundContents compareBoundaryPoints cloneRange cloneContents extractContents toString detach removeChild */ { XMLCh tempStr[100]; XMLString::transcode("Range",tempStr,99); { DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(tempStr); DOMDocument* doc = impl->createDocument(); //Creating a root element DOMElement* root = doc->createElement(xBody); doc->appendChild(root); //Creating the siblings of root DOMElement* E11 = doc->createElement(xH1); root->appendChild(E11); DOMElement* E12 = doc->createElement(xP); root->appendChild(E12); //Attaching texts to siblings DOMText* textNode1 = doc->createTextNode(xTitle); E11->appendChild(textNode1); DOMText* textNode11 = doc->createTextNode(xAnotherText); E11->appendChild(textNode11); DOMText* textNode2 = doc->createTextNode(xBlahxyz); E12->appendChild(textNode2); DOMText* E210 = doc->createTextNode(xInsertedText); doc->release(); } { //DOM Tree and some usable node creation DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(tempStr); DOMDocument* doc = impl->createDocument(); //Creating a root element DOMElement* root = doc->createElement(xBody); doc->appendChild(root); //Creating the siblings of root DOMElement* E11 = doc->createElement(xH1); root->appendChild(E11); DOMElement* E12 = doc->createElement(xP); root->appendChild(E12); //Attaching texts to siblings DOMText* textNode1 = doc->createTextNode(xTitle); E11->appendChild(textNode1); DOMText* textNode11 = doc->createTextNode(xAnotherText); E11->appendChild(textNode11); DOMText* textNode2 = doc->createTextNode(xBlahxyz); E12->appendChild(textNode2); //experimental nodes DOMElement* E120 = doc->createElement(xElement1); DOMElement* E121 = doc->createElement(xElement2); DOMElement* E122 = doc->createElement(xElement3); DOMElement* E311 = doc->createElement(xSurroundNode1); DOMText* E210 = doc->createTextNode(xInsertedText); DOMNode* rt = doc->getDocumentElement(); DOMRange* range = ((DOMDocumentRange*)doc)->createRange(); //Tests start here // Initial dom tree looks like : // <Body><H1>TitleAnother Text</H1><P>Blah xyz</P></Body> //i.e., Body(rt) // _____________|________________ // | | // ___H1(E11)___ P(E12) // | | | // "Title" "Another Text" "Blah xyz" //test for start and end settings of a range range->setStart(rt->getFirstChild(), 0); TASSERT(range->getStartContainer() == rt->getFirstChild() ); TASSERT(range->getStartOffset() == 0); range->setEnd(rt->getFirstChild(), 1); TASSERT(range->getEndContainer() == rt->getFirstChild() ); TASSERT(range->getEndOffset() == 1); //DOMNode* node = range->getCommonAncestorContainer(); TASSERT(range->getCommonAncestorContainer() == rt->getFirstChild()); //selection related test range->selectNode(rt->getLastChild()); TASSERT(range->getStartContainer() == rt); TASSERT(range->getStartOffset() == 1); TASSERT(range->getEndContainer() == rt); TASSERT(range->getEndOffset() == 2); //insertion related tests range->insertNode(E120); //only end offset moves and new node gets into range as being inserted at boundary point TASSERT(range->getStartContainer() == rt); TASSERT(range->getStartOffset() == 1); TASSERT(range->getEndContainer() == rt); TASSERT(range->getEndOffset() == 3); range->insertNode(E121); //only end offset moves and new node gets into range as being inserted at boundary point TASSERT(range->getStartContainer() == rt); TASSERT(range->getStartOffset() == 1); TASSERT(range->getEndContainer() == rt); TASSERT(range->getEndOffset() == 4); rt->insertBefore(E122, rt->getFirstChild()); //both offsets move as new node is not part of the range TASSERT(range->getStartContainer() == rt); TASSERT(range->getStartOffset() == 2); TASSERT(range->getEndContainer() == rt); TASSERT(range->getEndOffset() == 5); //After above operations, now the tree looks like: // <Body><Element3/><H1>TitleAnother Text</H1><Element2/><Element1/><P>Blah xyz</P></Body> //i.e., Body(rt) // _____________|_______________________________________________________________ // | | | | | // Element3(E122) ___H1(E11)___ Element2(E121) Element1(E120) P(E12) // | | | // "Title" "Another Text" "Blah xyz" // // range has rt as start and end container, and 2 as start offset, 5 as end offset //changing selection range->selectNode(rt->getLastChild()->getPreviousSibling()); TASSERT(range->getStartContainer() == rt); TASSERT(range->getStartOffset() == 3); TASSERT(range->getEndContainer() == rt); TASSERT(range->getEndOffset() == 4); //deleting related tests range->deleteContents(); TASSERT(rt->getLastChild()->getPreviousSibling() == E121); range->setStart(rt->getFirstChild()->getNextSibling()->getFirstChild(), 2); TASSERT(range->getStartContainer() == rt->getFirstChild()->getNextSibling()->getFirstChild()); TASSERT(!XMLString::compareString(range->getStartContainer()->getNodeValue(),xTitle)); TASSERT(range->getStartOffset() == 2); range->setEnd(rt->getFirstChild()->getNextSibling()->getFirstChild(), 4); TASSERT(range->getEndContainer() == rt->getFirstChild()->getNextSibling()->getFirstChild()); TASSERT(!XMLString::compareString(range->getEndContainer()->getNodeValue(),xTitle)); TASSERT(range->getEndOffset() == 4); TASSERT(!XMLString::compareString(range->toString(),xtl)); //inserting text between a text node range->insertNode(E210); //only end offset moves and new node gets into range as being inserted at boundary point TASSERT(range->getStartContainer() == rt->getFirstChild()->getNextSibling()->getFirstChild()); TASSERT(range->getStartOffset() == 2); TASSERT(range->getEndContainer() == rt->getFirstChild()->getNextSibling()->getLastChild()->getPreviousSibling()); TASSERT(range->getEndOffset() == 2); //inserting element node before the selected text node range->insertNode(E120); //only end offset moves and new node gets into range as being inserted at boundary point TASSERT(range->getStartContainer() == rt->getFirstChild()->getNextSibling()->getFirstChild()); TASSERT(!XMLString::compareString(range->getStartContainer()->getNodeValue(),xTi)); TASSERT(range->getStartOffset() == 2); TASSERT(range->getEndContainer() == rt->getFirstChild()->getNextSibling()->getLastChild()->getPreviousSibling()); TASSERT(!XMLString::compareString(range->getEndContainer()->getNodeValue(),xtle)); TASSERT(range->getEndOffset() == 2); TASSERT(E11->getChildNodes()->getLength()==6); //checking the text replacment range->getStartContainer()->setNodeValue(xReplacedText); //only the start offset is impact TASSERT(range->getStartContainer() == rt->getFirstChild()->getNextSibling()->getFirstChild()); TASSERT(!XMLString::compareString(range->getStartContainer()->getNodeValue(),xReplacedText)); TASSERT(range->getStartOffset() == 0); TASSERT(range->getEndContainer() == rt->getFirstChild()->getNextSibling()->getLastChild()->getPreviousSibling()); TASSERT(!XMLString::compareString(range->getEndContainer()->getNodeValue(),xtle)); TASSERT(range->getEndOffset() == 2); //After above operations, now the tree looks like: // <Body><Element3/><H1>ReplacedText<Element1/>InsertedTexttleAnother Text</H1><Element2/><P>Blah xyz</P></Body> //i.e., Body(rt) // _____________|_______________________________________________________________________________________________ // | | | | // Element3(E122) ___H1(E11)___________________________________________________________ Element2(E121) P(E12) // | | | | | | | // "ReplacedText" "" Element1(E120) "InsertedText"(E210) "tle" "Another Text" "Blah xyz" // // range has "ReplacedText" as start container and "tle" as end container // and 0 as start offset, 2 as end offset //changing the selection. Preparing for 'surround' range->setStart(range->getStartContainer()->getParentNode(), 2); range->setEnd(range->getStartContainer(), 5); TASSERT(!XMLString::compareString(range->getStartContainer()->getNodeName(),xH1)); TASSERT(!XMLString::compareString(range->getEndContainer()->getNodeName(),xH1)); TASSERT(!XMLString::compareString(range->toString(),xInsertedTexttle)); range->surroundContents(E311); TASSERT(!XMLString::compareString(range->getStartContainer()->getNodeName(),xH1)); TASSERT(range->getStartOffset() == 2); TASSERT(!XMLString::compareString(range->getEndContainer()->getNodeName(),xH1)); TASSERT(range->getEndOffset() == 3); TASSERT(E11->getChildNodes()->getLength()==4); TASSERT(E311->getChildNodes()->getLength()==3); TASSERT(!XMLString::compareString(range->toString(),xInsertedTexttle)); //After above operations, now the tree looks like: // <Body><Element3/><H1>ReplacedText<SurroundNode1><Element1/>InsertedTexttle</SurroundNode1>Another Text</H1><Element2/><P>Blah xyz</P></Body> //i.e., Body(rt) // _____________|_________________________________________________________________________ // | | | | // Element3(E122) ___H1(E11)___________________________________ Element2(E121) P(E12) // | | | | | // "ReplacedText" "" SurroundNode1(E311) "Another Text" "Blah xyz" // ____________ |_____________________________ // | | | // Element1(E120) "InsertedText"(E210) "tle" // // range has H1 as start and end container and 2 as start offset, 3 as end offset //testing cloning DOMRange* aRange = range->cloneRange(); TASSERT(aRange->getStartContainer() == range->getStartContainer()); TASSERT(aRange->getEndContainer() == range->getEndContainer()); TASSERT(aRange->getStartOffset() == 2); TASSERT(aRange->getEndOffset() == 3); //changing the new ranges start aRange->setStart(aRange->getStartContainer()->getFirstChild(), 1); //comparing the ranges short compVal = range->compareBoundaryPoints(DOMRange::END_TO_END, aRange); TASSERT(compVal == 0); compVal = range->compareBoundaryPoints(DOMRange::START_TO_START, aRange); TASSERT(compVal == 1); compVal = range->compareBoundaryPoints(DOMRange::START_TO_END, aRange); TASSERT(compVal == 1); compVal = range->compareBoundaryPoints(DOMRange::END_TO_START, aRange); TASSERT(compVal == -1); //testing collapse //not collapsed TASSERT(range->getCollapsed() == false); TASSERT(range->getStartOffset() == 2); TASSERT(range->getEndOffset() == 3); //selectNodeContents range->selectNodeContents(rt->getLastChild()->getFirstChild()); TASSERT(range->getStartContainer() == rt->getLastChild()->getFirstChild()); TASSERT(range->getEndContainer() == rt->getLastChild()->getFirstChild()); TASSERT(range->getStartOffset() == 0); TASSERT(range->getEndOffset() == 8); TASSERT(!XMLString::compareString(range->toString(),xBlahxyz)); //testing collapse range->collapse(true); //collapse to start TASSERT(range->getCollapsed() == true); TASSERT(range->getStartOffset() == 0); TASSERT(range->getEndOffset() == 0); TASSERT(!XMLString::compareString(range->toString(),XMLUni::fgZeroLenString)); TASSERT(aRange->getEndOffset() == 3); //other range is unaffected TASSERT(!XMLString::compareString(aRange->toString(),xeplacedTextInsertedTexttle)); //After above operations, now the tree looks like: // <Body><Element3/><H1>ReplacedText<SurroundNode1><Element1/>InsertedTexttle</SurroundNode1>Another Text</H1><Element2/><P>Blah xyz</P></Body> //i.e., Body(rt) // _____________|_________________________________________________________________________ // | | | | // Element3(E122) ___H1(E11)___________________________________ Element2(E121) P(E12) // | | | | | // "ReplacedText" "" SurroundNode1(E311) "Another Text" "Blah xyz" // ____________ |_____________________________ // | | | // Element1(E120) "InsertedText"(E210) "tle" // // range has "Blah xyz" as start and end container and 0 as start and end offset (collapsed) // aRange has "ReplacedText" as start container and H1 as end container // and 1 as start offset and 3 as end offset DOMDocumentFragment* docFrag = aRange->cloneContents(); TASSERT( docFrag != 0); range->selectNode(rt->getFirstChild()); TASSERT(range->getStartContainer() == rt); TASSERT(range->getEndContainer() == rt); TASSERT(range->getStartOffset() == 0); TASSERT(range->getEndOffset() == 1); //Testing toString() const XMLCh* str = aRange->toString(); TASSERT(!XMLString::compareString(str, xeplacedTextInsertedTexttle)); //start and end before and after tests range->setStartBefore(rt->getFirstChild()); TASSERT(range->getStartOffset() == 0); range->setEndBefore(rt->getFirstChild()); TASSERT(range->getEndOffset() == 0); range->setStartAfter(rt->getLastChild()); TASSERT(range->getStartOffset() == 4); range->setStartAfter(rt->getFirstChild()); TASSERT(range->getStartOffset() == 1); range->setEndBefore(rt->getLastChild()); TASSERT(range->getEndOffset() == 3); range->setEndAfter(rt->getLastChild()); TASSERT(range->getEndOffset() == 4); //testing extract() DOMDocumentFragment* frag2 = range->extractContents(); TASSERT( frag2 != 0); //After above operations, now the tree looks like: // <Body><Element3/></Body> //i.e., Body(rt) // | // Element3(E122) // // aRange has rt as start and end container, and 1 as start and end offset (collapsed) // range has rt as start and end container, and 1 as start and end offset (collapsed) // //and frag2 looks: // <Body>ReplacedText<SurroundNode1><Element1/>InsertedTexttle</SurroundNode1>Another Text</H1><Element2/><P>Blah xyz</P></Body> //i.e., Body(rt) // ______________|________________________________________________________ // | | | // ___H1(E11)___________________________________ Element2(E121) P(E12) // | | | | | //"ReplacedText" "" SurroundNode1(E311) "Another Text" "Blah xyz" // ____________ |_____________________________ // | | | // Element1(E120) "InsertedText"(E210) "tle" // //the tree do not have those node anymore after extract //only Element3 left TASSERT(rt->getChildNodes()->getLength()==1); //aRange is collapsed TASSERT(aRange->getCollapsed() == true); TASSERT(aRange->getStartContainer() == rt); TASSERT(aRange->getStartOffset() == 1); TASSERT(aRange->getEndContainer() == rt); TASSERT(aRange->getEndOffset() == 1); //range is collapsed as well TASSERT(range->getCollapsed() == true); TASSERT(range->getStartContainer() == rt); TASSERT(range->getStartOffset() == 1); TASSERT(range->getEndContainer() == rt); TASSERT(range->getEndOffset() == 1); //test the document fragment frag2 TASSERT(frag2->getChildNodes()->getLength()==3); //detaching the other range aRange->detach(); range->detach(); //*************************************************************** //another set of test //TEST createRange, setStart and setEnd, insertnode //*************************************************************** DOMImplementation* impl2 = DOMImplementationRegistry::getDOMImplementation(tempStr); DOMDocument* doc2 = impl2->createDocument(); DOMElement* root2 = doc2->createElement(xroot2); doc2->appendChild(root2); //case 1: simple text node, start==end // <body>text1</body> DOMElement* body = doc2->createElement(xBody); DOMText* text1 = doc2->createTextNode(xtext1); body->appendChild(text1); root2->appendChild(body); //set range DOMRange* range1 = doc2->createRange(); range1->setStart(text1,1); range1->setEnd(text1,3); TASSERT(!XMLString::compareString(range1->toString(),xex)); TASSERT(range1->getStartOffset()==1); TASSERT(!XMLString::compareString(range1->getStartContainer()->getNodeValue(),xtext1)); TASSERT(range1->getEndOffset()==3); TASSERT(!XMLString::compareString(range1->getEndContainer()->getNodeValue(),xtext1)); //now insert a text node //<body>ttext2ext1</body> DOMText* text2 = doc2->createTextNode(xtext2); range1->insertNode(text2); TASSERT(!XMLString::compareString(range1->toString(),xtext2ex)); TASSERT(range1->getStartOffset()==1); TASSERT(!XMLString::compareString(range1->getStartContainer()->getNodeValue(),xt)); TASSERT(range1->getEndOffset()==2); TASSERT(!XMLString::compareString(range1->getEndContainer()->getNodeValue(),xext1)); //now insert a non-text node //<body>t<p1/>text2ext1</body> DOMElement* p1 = doc2->createElement(xp1); range1->insertNode(p1); TASSERT(!XMLString::compareString(range1->toString(),xtext2ex)); TASSERT(range1->getStartOffset()==1); TASSERT(!XMLString::compareString(range1->getStartContainer()->getNodeValue(),xt)); TASSERT(range1->getEndOffset()==2); TASSERT(!XMLString::compareString(range1->getEndContainer()->getNodeValue(),xext1)); //case 2: non-text node, start==end // <head><h1/></head> DOMElement* head = doc2->createElement(xhead); DOMElement* h1 = doc2->createElement(xH1); head->appendChild(h1); root2->appendChild(head); //set range DOMRange* range2 = doc2->createRange(); range2->setStart(head,0); range2->setEnd(head,1); TASSERT(!XMLString::compareString(range2->toString(),XMLUni::fgZeroLenString)); TASSERT(range2->getStartOffset()==0); TASSERT(!XMLString::compareString(range2->getStartContainer()->getNodeName(),xhead)); TASSERT(range2->getEndOffset()==1); TASSERT(!XMLString::compareString(range2->getEndContainer()->getNodeName(),xhead)); //now insert a non-text node //<head><h2/><h1/></head> DOMElement* h2 = doc2->createElement(xh2); range2->insertNode(h2); TASSERT(!XMLString::compareString(range2->toString(),XMLUni::fgZeroLenString)); TASSERT(range2->getStartOffset()==0); TASSERT(!XMLString::compareString(range2->getStartContainer()->getNodeName(),xhead)); TASSERT(range2->getEndOffset()==2); TASSERT(!XMLString::compareString(range2->getEndContainer()->getNodeName(),xhead)); //now insert a text node //<head>text5<h2/><h1/></head> DOMText* text5 = doc2->createTextNode(xtext5); range2->insertNode(text5); TASSERT(!XMLString::compareString(range2->toString(),xtext5)); TASSERT(range2->getStartOffset()==0); TASSERT(!XMLString::compareString(range2->getStartContainer()->getNodeName(),xhead)); TASSERT(range2->getEndOffset()==3); TASSERT(!XMLString::compareString(range2->getEndContainer()->getNodeName(),xhead)); //case 3: simple text node, start!=end // <body2>text3</body2> DOMElement* body2 = doc2->createElement(xbody2); DOMText* text3 = doc2->createTextNode(xtext3); body2->appendChild(text3); root2->appendChild(body2); //set range DOMRange* range3 = ((DOMDocumentRange*)doc2)->createRange(); range3->setStart(text3,1); range3->setEnd(body2,1); TASSERT(!XMLString::compareString(range3->toString(),xext3)); TASSERT(range3->getStartOffset()==1); TASSERT(!XMLString::compareString(range3->getStartContainer()->getNodeValue(),xtext3)); TASSERT(range3->getEndOffset()==1); TASSERT(!XMLString::compareString(range3->getEndContainer()->getNodeName(),xbody2)); //now insert a textnode //<body2>ttext4ext3</body2> DOMText* text4 = doc2->createTextNode(xtext4); range3->insertNode(text4); TASSERT(!XMLString::compareString(range3->toString(),XMLUni::fgZeroLenString)); TASSERT(range3->getStartOffset()==1); TASSERT(!XMLString::compareString(range3->getStartContainer()->getNodeValue(),xt)); TASSERT(range3->getEndOffset()==1); TASSERT(!XMLString::compareString(range3->getEndContainer()->getNodeName(),xbody2)); //now insert a non-text node //<body2>t<p2/>text4ext3</body2> DOMElement* p2 = doc2->createElement(xp2); range3->insertNode(p2); //extra empty node caused by splitting 't' TASSERT(!XMLString::compareString(range3->toString(),XMLUni::fgZeroLenString)); TASSERT(range3->getStartOffset()==1); TASSERT(!XMLString::compareString(range3->getStartContainer()->getNodeValue(),xt)); TASSERT(range3->getEndOffset()==1); TASSERT(!XMLString::compareString(range3->getEndContainer()->getNodeName(),xbody2)); //test toString a bit range3->setStart(body2,1); range3->setEnd(body2,5); TASSERT(!XMLString::compareString(range3->toString(),xtext4ext3)); range3->setStart(body2,0); range3->setEnd(body2,5); TASSERT(!XMLString::compareString(range3->toString(),xttext4ext3)); //case 4: non-text node, start!=end // <head2><h3/></head2> DOMElement* head2 = doc2->createElement(xhead2); DOMElement* h3 = doc2->createElement(xh3); head2->appendChild(h3); root2->appendChild(head2); //set range DOMRange* range4 = doc2->createRange(); range4->setStart(head2,0); range4->setEnd(h3,0); TASSERT(!XMLString::compareString(range4->toString(),XMLUni::fgZeroLenString)); TASSERT(range4->getStartOffset()==0); TASSERT(!XMLString::compareString(range4->getStartContainer()->getNodeName(),xhead2)); TASSERT(range4->getEndOffset()==0); TASSERT(!XMLString::compareString(range4->getEndContainer()->getNodeName(),xh3)); //now insert a non-text node //<head2><h4/><h3/></head2> DOMElement* h4 = doc2->createElement(xh4); range4->insertNode(h4); TASSERT(!XMLString::compareString(range4->toString(),XMLUni::fgZeroLenString)); TASSERT(range4->getStartOffset()==0); TASSERT(!XMLString::compareString(range4->getStartContainer()->getNodeName(),xhead2)); TASSERT(range4->getEndOffset()==0); TASSERT(!XMLString::compareString(range4->getEndContainer()->getNodeName(),xh3)); //now insert a text node //<head2>text6<h4/><h3/></head2> DOMText* text6 = doc2->createTextNode(xtext6); range4->insertNode(text6); TASSERT(!XMLString::compareString(range4->toString(),xtext6)); TASSERT(range4->getStartOffset()==0); TASSERT(!XMLString::compareString(range4->getStartContainer()->getNodeName(),xhead2)); TASSERT(range4->getEndOffset()==0); TASSERT(!XMLString::compareString(range4->getEndContainer()->getNodeName(),xh3)); //*************************************************************** // quick test of updating //*************************************************************** // <upbody>text1</upbody> DOMElement* upbody = doc2->createElement(xupbody); DOMText* uptext1 = doc2->createTextNode(xuptext1); upbody->appendChild(uptext1); root2->appendChild(upbody); DOMRange* uprange = ((DOMDocumentRange*)doc2)->createRange(); uprange->setStart(upbody,0); uprange->setEnd(upbody,1); TASSERT(!XMLString::compareString(uprange->toString(),xuptext1)); TASSERT(uprange->getStartOffset()==0); TASSERT(!XMLString::compareString(uprange->getStartContainer()->getNodeName(),xupbody)); TASSERT(uprange->getEndOffset()==1); TASSERT(!XMLString::compareString(uprange->getEndContainer()->getNodeName(),xupbody)); // split text uptext1->splitText(1); TASSERT(!XMLString::compareString(uprange->toString(),xu)); TASSERT(uprange->getStartOffset()==0); TASSERT(!XMLString::compareString(uprange->getStartContainer()->getNodeName(),xupbody)); TASSERT(uprange->getEndOffset()==1); TASSERT(!XMLString::compareString(uprange->getEndContainer()->getNodeName(),xupbody)); //insert node DOMElement* upbody2 = doc2->createElement(xupbody2); DOMText* uptext2 = doc2->createTextNode(xuptext2); upbody2->appendChild(uptext2); root2->appendChild(upbody2); DOMRange* uprange2 = ((DOMDocumentRange*)doc2)->createRange(); uprange2->setStart(uptext2,1); uprange2->setEnd(upbody2,1); DOMRange* uprange3 = doc2->createRange(); uprange3->setStart(uptext2,1); uprange3->setEnd(upbody2,1); TASSERT(!XMLString::compareString(uprange2->toString(),xptext2)); TASSERT(uprange2->getStartOffset()==1); TASSERT(!XMLString::compareString(uprange2->getStartContainer()->getNodeValue(),xuptext2)); TASSERT(uprange2->getEndOffset()==1); TASSERT(!XMLString::compareString(uprange2->getEndContainer()->getNodeName(),xupbody2)); TASSERT(!XMLString::compareString(uprange3->toString(),xptext2)); TASSERT(uprange3->getStartOffset()==1); TASSERT(!XMLString::compareString(uprange3->getStartContainer()->getNodeValue(),xuptext2)); TASSERT(uprange3->getEndOffset()==1); TASSERT(!XMLString::compareString(uprange3->getEndContainer()->getNodeName(),xupbody2)); DOMElement* upp1 = doc2->createElement(xupp1); uprange2->insertNode(upp1); TASSERT(!XMLString::compareString(uprange2->toString(),XMLUni::fgZeroLenString)); TASSERT(uprange2->getStartOffset()==1); TASSERT(!XMLString::compareString(uprange2->getStartContainer()->getNodeValue(),xu)); TASSERT(uprange2->getEndOffset()==1); TASSERT(!XMLString::compareString(uprange2->getEndContainer()->getNodeName(),xupbody2)); TASSERT(!XMLString::compareString(uprange3->toString(),XMLUni::fgZeroLenString)); TASSERT(uprange3->getStartOffset()==1); TASSERT(!XMLString::compareString(uprange3->getStartContainer()->getNodeValue(),xu)); TASSERT(uprange3->getEndOffset()==1); TASSERT(!XMLString::compareString(uprange3->getEndContainer()->getNodeName(),xupbody2)); //*************************************************************** //another set of test //<foo><c/><moo><b/></moo>ab<a>Hello cd</a><cool>ef</cool></foo> // // ______________________foo_____________________ // | | | | | // c moo "ab" a cool // | | | // b "Hello cd" "ef" // DOMImplementation* impl3 = DOMImplementationRegistry::getDOMImplementation(tempStr); DOMDocument* doc3 = impl3->createDocument(); DOMElement* root3 = doc3->createElement(xroot); doc3->appendChild(root3); DOMElement* foo = doc3->createElement(xfoo); DOMElement* moo = doc3->createElement(xmoo); DOMElement* cool = doc3->createElement(xcool); DOMText* ab = doc3->createTextNode(xab); DOMText* cd = doc3->createTextNode(xHellocd); DOMText* ef = doc3->createTextNode(xef); DOMElement* a = doc3->createElement(xa); DOMElement* b = doc3->createElement(xb); DOMElement* c = doc3->createElement(xc); root3->appendChild(foo); foo->appendChild(c); foo->appendChild(moo); foo->appendChild(ab); foo->appendChild(a); foo->appendChild(cool); moo->appendChild(b); a->appendChild(cd); cool->appendChild(ef); //*************************************************************** //TEST toString //*************************************************************** DOMRange* newtestrange = ((DOMDocumentRange*)doc3)->createRange(); //case 1: //start container is text node // i) end container is also text node // a) start==end // b) start!=end // ii) end container is not text node // a) start==end => impossible // b) start!=end // //case 2: //start container is not text node // i) end container is text node // a) start==end => impossible // b) start!=end // ii) end container is not text node // a) start==end // b) start!=end //case 1, i, a newtestrange->setStart( cd, 1 ); newtestrange->setEnd( cd, 4 ); TASSERT(!XMLString::compareString(newtestrange->toString(),xell)); //case 1, i, b newtestrange->setStart( cd, 1 ); newtestrange->setEnd( ef, 2 ); TASSERT(!XMLString::compareString(newtestrange->toString(),xellocdef)); //case 1, ii, b newtestrange->setStart( cd, 1 ); newtestrange->setEnd( foo, 4 ); TASSERT(!XMLString::compareString(newtestrange->toString(),xellocd)); //case 2, i, b newtestrange->setStart( foo, 1 ); newtestrange->setEnd( cd, 5 ); TASSERT(!XMLString::compareString(newtestrange->toString(),xabHello)); //case 2, ii, a newtestrange->setStart( foo, 1 ); newtestrange->setEnd( foo, 4 ); TASSERT(!XMLString::compareString(newtestrange->toString(),xabHellocd)); //case 2, ii, b newtestrange->setStart( moo, 1 ); newtestrange->setEnd( foo, 4 ); TASSERT(!XMLString::compareString(newtestrange->toString(),xabHellocd)); //*************************************************************** //test removeChild //*************************************************************** DOMRange* newrange = doc3->createRange(); newrange->setStart( moo, 0 ); newrange->setEnd( foo, 4 ); TASSERT(newrange->getStartOffset()==0); TASSERT(!XMLString::compareString(newrange->getStartContainer()->getNodeName(),xmoo)); TASSERT(newrange->getEndOffset()==4); TASSERT(!XMLString::compareString(newrange->getEndContainer()->getNodeName(),xfoo)); TASSERT(!XMLString::compareString(newrange->toString(),xabHellocd)); DOMNode* n = newrange->cloneContents(); DOMNodeList* nol = foo->getChildNodes(); //removing moo DOMNode* rem = foo->removeChild(nol->item(1)); rem->release(); TASSERT(newrange->getStartOffset()==1); TASSERT(!XMLString::compareString(newrange->getStartContainer()->getNodeName(),xfoo)); TASSERT(newrange->getEndOffset()==3); TASSERT(!XMLString::compareString(newrange->getEndContainer()->getNodeName(),xfoo)); TASSERT(!XMLString::compareString(newrange->toString(),xabHellocd)); TASSERT(newtestrange->getStartOffset()==1); TASSERT(!XMLString::compareString(newtestrange->getStartContainer()->getNodeName(),xfoo)); TASSERT(newtestrange->getEndOffset()==3); TASSERT(!XMLString::compareString(newtestrange->getEndContainer()->getNodeName(),xfoo)); TASSERT(!XMLString::compareString(newtestrange->toString(),xabHellocd)); // Now do some exception test newrange->detach(); EXCEPTION_TEST(newrange->setStart( moo, 0 ), DOMException::INVALID_STATE_ERR); EXCEPTION_TEST(newtestrange->setStartBefore(moo), DOMRangeException::INVALID_NODE_TYPE_ERR); doc->release(); doc2->release(); doc3->release(); } } //creating the dom tree and tests // And call the termination method XMLPlatformUtils::Terminate(); if (errorOccurred) { printf("Test Failed\n"); return 4; } printf("Test Run Successfully\n"); return 0; };
void writeHtmlFile(Tag2Html::MP3Collection* mp3Collection) { XMLPlatformUtils::Initialize(); DOMImplementation* domImplementation = DOMImplementationRegistry::getDOMImplementation(XMLString::transcode("core")); // <html> DOMDocument* doc = domImplementation->createDocument(0, XMLString::transcode("html"), 0); DOMDocumentType* docType = domImplementation->createDocumentType(XMLString::transcode("html"), XMLString::transcode(""), XMLString::transcode("")); doc->insertBefore(docType, doc->getDocumentElement()); // <head> DOMElement* head = doc->createElement(XMLString::transcode("head")); // <link rel="stylesheet" type="text/css" href="./index.css"> DOMElement* linkStylesheet = doc->createElement(XMLString::transcode("link")); linkStylesheet->setAttribute(XMLString::transcode("rel"), XMLString::transcode("stylesheet")); linkStylesheet->setAttribute(XMLString::transcode("type"), XMLString::transcode("text/css")); linkStylesheet->setAttribute(XMLString::transcode("href"), XMLString::transcode("index.css")); head->appendChild(linkStylesheet); // <title>MP3-Leser</title> DOMElement* title = doc->createElement(XMLString::transcode("title")); title->setTextContent(XMLString::transcode("MP3-Leser")); head->appendChild(title); // <meta http-equiv="Content-Type" content="text/html" charset="utf-8"> DOMElement* meta = doc->createElement(XMLString::transcode("meta")); meta->setAttribute(XMLString::transcode("http-equiv"), XMLString::transcode("Content-Type")); meta->setAttribute(XMLString::transcode("content"), XMLString::transcode("text/html")); meta->setAttribute(XMLString::transcode("charset"), XMLString::transcode("utf-8")); head->appendChild(meta); // <body> DOMElement* body = doc->createElement(XMLString::transcode("body")); // <h1> DOMElement* h1 = doc->createElement(XMLString::transcode("h1")); // Track List ( view <a href="stats.html">stats</a>, <a href="info.html">info</a> ) h1->appendChild(doc->createTextNode(XMLString::transcode("Track List ( view "))); DOMElement* statsLink = doc->createElement(XMLString::transcode("a")); statsLink->setAttribute(XMLString::transcode("href"), XMLString::transcode("stats.html")); statsLink->setTextContent(XMLString::transcode("stats")); h1->appendChild(statsLink); h1->appendChild(doc->createTextNode(XMLString::transcode(", "))); DOMElement* infoLink = doc->createElement(XMLString::transcode("a")); infoLink->setAttribute(XMLString::transcode("href"), XMLString::transcode("info.html")); infoLink->setTextContent(XMLString::transcode("info")); h1->appendChild(infoLink); h1->appendChild(doc->createTextNode(XMLString::transcode(" )"))); body->appendChild(h1); // <table align="center" width="1000"> DOMElement* table = doc->createElement(XMLString::transcode("table")); table->setAttribute(XMLString::transcode("align"), XMLString::transcode("center")); // <thead> DOMElement* tHead = doc->createElement(XMLString::transcode("thead")); // <tr bgcolor="#CCCCCC"> DOMElement* tHeadRow = doc->createElement(XMLString::transcode("tr")); tHeadRow->setAttribute(XMLString::transcode("bgcolor"), XMLString::transcode("#CCCCCC")); // <th>Track</th> DOMElement* tHeadColumnTrack = doc->createElement(XMLString::transcode("th")); tHeadColumnTrack->setTextContent(XMLString::transcode("Track")); tHeadRow->appendChild(tHeadColumnTrack); // <th>Artist</th> DOMElement* tHeadColumnArtist = doc->createElement(XMLString::transcode("th")); tHeadColumnArtist->setTextContent(XMLString::transcode("Artist")); tHeadRow->appendChild(tHeadColumnArtist); // <th>Title</th> DOMElement* tHeadColumnTitle = doc->createElement(XMLString::transcode("th")); tHeadColumnTitle->setTextContent(XMLString::transcode("Title")); tHeadRow->appendChild(tHeadColumnTitle); // <th>Album</th> DOMElement* tHeadColumnAlbum = doc->createElement(XMLString::transcode("th")); tHeadColumnAlbum->setTextContent(XMLString::transcode("Album")); tHeadRow->appendChild(tHeadColumnAlbum); // <th>Year</th> DOMElement* tHeadColumnYear = doc->createElement(XMLString::transcode("th")); tHeadColumnYear->setTextContent(XMLString::transcode("Year")); tHeadRow->appendChild(tHeadColumnYear); // <th>Genre</th> DOMElement* tHeadColumnGenre = doc->createElement(XMLString::transcode("th")); tHeadColumnGenre->setTextContent(XMLString::transcode("Genre")); tHeadRow->appendChild(tHeadColumnGenre); // <th>Comment</th> DOMElement* tHeadColumnComment = doc->createElement(XMLString::transcode("th")); tHeadColumnComment->setTextContent(XMLString::transcode("Comment")); tHeadRow->appendChild(tHeadColumnComment); // <th>Length</th> DOMElement* tHeadColumnLength = doc->createElement(XMLString::transcode("th")); tHeadColumnLength->setTextContent(XMLString::transcode("Length")); tHeadRow->appendChild(tHeadColumnLength); // <th>Filename</th> DOMElement* tHeadColumnFilename = doc->createElement(XMLString::transcode("th")); tHeadColumnFilename->setTextContent(XMLString::transcode("Filename")); tHeadRow->appendChild(tHeadColumnFilename); tHead->appendChild(tHeadRow); table->appendChild(tHead); // <tbody> DOMElement* tBody = doc->createElement(XMLString::transcode("tbody")); ostringstream convert; list<Tag2Html::MP3Infos*> sortedList = mp3Collection->getSortedList(); for (list<Tag2Html::MP3Infos*>::iterator mp3info = sortedList.begin(); mp3info != sortedList.end(); mp3info++) { DOMElement* row = doc->createElement(XMLString::transcode("tr")); convert.str(""); convert << (*mp3info)->track; DOMElement* trackColumn = doc->createElement(XMLString::transcode("td")); trackColumn->setTextContent(XMLString::transcode(convert.str().c_str())); row->appendChild(trackColumn); DOMElement* artistColumn = doc->createElement(XMLString::transcode("td")); artistColumn->setTextContent(XMLString::transcode((*mp3info)->artist.c_str())); row->appendChild(artistColumn); DOMElement* titleColumn = doc->createElement(XMLString::transcode("td")); titleColumn->setTextContent(XMLString::transcode((*mp3info)->title.c_str())); row->appendChild(titleColumn); DOMElement* albumColumn = doc->createElement(XMLString::transcode("td")); albumColumn->setTextContent(XMLString::transcode((*mp3info)->album.c_str())); row->appendChild(albumColumn); convert.str(""); convert << (*mp3info)->year; DOMElement* yearColumn = doc->createElement(XMLString::transcode("td")); yearColumn->setTextContent(XMLString::transcode(convert.str().c_str())); row->appendChild(yearColumn); DOMElement* genreColumn = doc->createElement(XMLString::transcode("td")); genreColumn->setTextContent(XMLString::transcode((*mp3info)->genre.c_str())); row->appendChild(genreColumn); DOMElement* commentColumn = doc->createElement(XMLString::transcode("td")); commentColumn->setTextContent(XMLString::transcode((*mp3info)->comment.c_str())); row->appendChild(commentColumn); DOMElement* lengthColumn = doc->createElement(XMLString::transcode("td")); if ((*mp3info)->length < 3600) { char trackLength[12]; struct tm* timeinfo = new tm(); int seconds = (*mp3info)->length; if (seconds >= 60) { int minutes = seconds / 60; if (minutes >= 60) { timeinfo->tm_hour = minutes / 60; timeinfo->tm_min = minutes / 60; } else { timeinfo->tm_min = seconds / 60; } } timeinfo->tm_sec = seconds % 60; strftime(trackLength, 12, "%H:%M:%S", timeinfo); lengthColumn->setTextContent(XMLString::transcode(trackLength)); } row->appendChild(lengthColumn); DOMElement* filenameColumn = doc->createElement(XMLString::transcode("td")); filenameColumn->setTextContent(XMLString::transcode((*mp3info)->filename.c_str())); row->appendChild(filenameColumn); tBody->appendChild(row); } table->appendChild(tBody); body->appendChild(table); doc->getDocumentElement()->appendChild(head); doc->getDocumentElement()->appendChild(body); DOMWriter* writer = ((DOMImplementationLS*)domImplementation)->createDOMWriter(); if (writer->canSetFeature(XMLUni::fgDOMWRTFormatPrettyPrint, true)) { writer->setFeature(XMLUni::fgDOMWRTFormatPrettyPrint, true); } if (writer->canSetFeature(XMLUni::fgDOMXMLDeclaration, false)) { writer->setFeature(XMLUni::fgDOMXMLDeclaration, false); } XMLFormatTarget *fileFormatTarget = new LocalFileFormatTarget("index.html"); writer->writeNode(fileFormatTarget, *doc); fileFormatTarget->flush(); writer->release(); doc->release(); XMLPlatformUtils::Terminate(); writeCssFile(); writeStatFile(mp3Collection); writeInfoFile(mp3Collection); }