c++cxmlxerces-c

Change tag value on file XML Xerces C++ Parser


I created an XML file and I don't know how can i change the tag text value on this file. also i can get the node text value and I can change it, but how can i write this modification on a file?

    xercesc_3_2::XMLPlatformUtils::Initialize();

    parser = new xercesc_3_2::XercesDOMParser();

    parser->parse(xmlFile);

    xercesc_3_2::DOMDocument* doc = parser->getDocument();

    xercesc_3_2::DOMNodeList* child = doc-getElementsByTagName(xercesc_3_2::XMLString::transcode("A")); 

   xercesc_3_2::DOMNode* currentNode = child->item(i);
   if (currentNode->getNodeType() && currentNode->getNodeType() == xercesc_3_2::DOMNode::ELEMENT_NODE) {
                currentNode->setTextContent(xercesc_3_2::XMLString::transcode("3000"));

Solution

  • void changeXMLNodevalue(std::string fileName, std::string node, std::string value) {
    
    xercesc_3_2::XMLPlatformUtils::Initialize();
    
    // create the DOM parser
    xercesc_3_2::XercesDOMParser* parser = new xercesc_3_2::XercesDOMParser;
    
    parser->setValidationScheme(xercesc_3_2::XercesDOMParser::Val_Never);
    parser->parse(fileName.c_str());
    
    // get the DOM representation
    xercesc_3_2::DOMDocument* doc = parser->getDocument();
    
    // get the root element
    xercesc_3_2::DOMElement* root = doc->getDocumentElement();
    
    // evaluate the xpath
    xercesc_3_2::DOMXPathResult* result = doc->evaluate(
        xercesc_3_2::XMLString::transcode(node.c_str()),//"/dgml/document/head/zoom/maximum"),
        root,
        NULL,
        xercesc_3_2::DOMXPathResult::ORDERED_NODE_SNAPSHOT_TYPE,
        NULL);
    
    if (result->getNodeValue() == NULL)
    {
        cout << "There is no result for the provided XPath " << endl;
    }
    else
    {
            result->getNodeValue()->getFirstChild()->setNodeValue(xercesc_3_2::XMLString::transcode(value.c_str()));// "3000"));
            const XMLCh* a = result->getNodeValue()->getFirstChild()->getNodeValue();
            char* tttt = (char*)a;
            cout << "Node value: " << tttt << endl;
        
    }
    
    xercesc_3_2::XMLPlatformUtils::Terminate();
    return;
    }