Search code examples
c++xmlxerces

xerces: how to take xml node with a particular tag?


with Qt library I can take a node with a particular tag name with:

QDomElement tmp = root.firstChildElement("A");
QDomElement tt = tmp.firstChildElement("C");

with a xml file with this structure:

<A>
<B></B>
<C></C>
</A>

With xerces, how can I do this?


Solution

  • 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("/doc/document/childL1/childL2/Node_to_change"), // "A/B" in the provided xml sample for change B text node value
        root,
        NULL,
        xercesc_3_2::DOMXPathResult::ORDERED_NODE_SNAPSHOT_TYPE,
        NULL);
    

    And also change the value:

    if (result->getNodeValue() == NULL)
    {
        cout << "There is no result for the provided XPath " << endl;
    }
    else
    {
    
        result->getNodeValue()->getFirstChild()->setNodeValue(xercesc_3_2::XMLString::transcode("3000"));
        const XMLCh* a = result->getNodeValue()->getFirstChild()->getNodeValue();
        char* tttt = (char*)a;
        cout << "Node value: " << tttt << endl;
        
    }