std::string XercesParserXml::get(const std::string& srcBytes, const std::string& node) const
{
// init
try {
XMLPlatformUtils::Initialize();
}
catch (const XMLException& toCatch) {
char* message = XMLString::transcode(toCatch.getMessage());
std::cout << "Error during initialization! :\n"
<< message << "\n";
XMLString::release(&message);
return "";
}
// 1. load the right xml bytes from signal tree
XercesDOMParser* parser = new XercesDOMParser();
if (NULL == parser) {
return "";
}
parser->setValidationScheme(XercesDOMParser::Val_Always);
parser->setDoNamespaces(true); // optional
ErrorHandler* errHandler = (ErrorHandler*) new HandlerBase();
parser->setErrorHandler(errHandler);
InputSource* pInputSource = new MemBufInputSource((XMLByte *)srcBytes.c_str(), srcBytes.size(), X("GUID"));
if (NULL == pInputSource) {
delete parser;
delete errHandler;
return "";
}
// 2. parser the xml bytes to a DOM tree
parser->parse(*pInputSource);
DOMDocument* doc = parser->getDocument();
if (NULL == doc) {
delete parser;
delete errHandler;
delete pInputSource;
return "";
}
// 3. find node of parameter in DOM tree
DOMElement* rootElem = NULL;
rootElem = doc->getDocumentElement();
DOMNode* testNode = NULL;
testNode = getNode(rootElem, node.c_str());
// get content
std::string result;
char* nodeValue = NULL;
if (testNode) {
nodeValue = XMLString::transcode(testNode->getTextContent());
result = nodeValue;
XMLString::release(&nodeValue);
}
// release source
delete parser;
delete errHandler;
delete pInputSource;
//doc->release();
return result;
}
bool XercesParserXml::set(std::string& srcBytes, const std::string& node, const std::string& value)
{
// init
try {
XMLPlatformUtils::Initialize();
}
catch (const XMLException& toCatch) {
char* message = XMLString::transcode(toCatch.getMessage());
std::cout << "Error during initialization! :\n"
<< message << "\n";
XMLString::release(&message);
return false;
}
// 1. load the right xml bytes from signal tree
XercesDOMParser* parser = new XercesDOMParser();
if (NULL == parser) {
return false;
}
parser->setValidationScheme(XercesDOMParser::Val_Always);
parser->setDoNamespaces(true); // optional
ErrorHandler* errHandler = (ErrorHandler*) new HandlerBase();
parser->setErrorHandler(errHandler);
InputSource* pInputSource = new MemBufInputSource((XMLByte *)srcBytes.c_str(), srcBytes.size(), X("GUID"));
if (NULL == pInputSource) {
delete parser;
delete errHandler;
return false;
}
// 2. parser the xml bytes to a DOM tree
parser->parse(*pInputSource);
DOMDocument* doc = parser->getDocument();
if (NULL == doc) {
delete parser;
delete errHandler;
delete pInputSource;
return false;
}
// 3. find node of parameter in DOM tree
DOMElement* rootElem = NULL;
rootElem = doc->getDocumentElement();
DOMNode* testNode = NULL;
testNode = getNode(rootElem, node.c_str());
// 4. set new content
if (testNode) {
testNode->setTextContent(X(value.c_str()));
}
// 5. serialize DOM tree and save it
char* result;
DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(X("Core"));
if (NULL == impl) {
XERCES_STD_QUALIFIER cerr << "Requested implementation is not supported" << XERCES_STD_QUALIFIER endl;
XMLPlatformUtils::Terminate();
delete parser;
delete errHandler;
delete pInputSource;
return false;
}
DOMWriter* theSerializer = ((DOMImplementationLS*)impl)->createDOMWriter();
if (NULL == theSerializer) {
delete parser;
delete errHandler;
delete pInputSource;
return false;
}
if (theSerializer->canSetFeature(XMLUni::fgDOMWRTDiscardDefaultContent, true))
theSerializer->setFeature(XMLUni::fgDOMWRTDiscardDefaultContent, true);
if (theSerializer->canSetFeature(XMLUni::fgDOMWRTFormatPrettyPrint, true))
theSerializer->setFeature(XMLUni::fgDOMWRTFormatPrettyPrint, true);
XMLCh* unicodeStr = theSerializer->writeToString(*rootElem);
result = XMLString::transcode(unicodeStr);
srcBytes = result;
//printf("result: %s\n", result);
XMLString::release(&unicodeStr);
XMLString::release(&result);
// release source
theSerializer->release();
delete parser;
delete errHandler;
delete pInputSource;
return true;
}





