user513164
user513164

Reputation: 1858

c++ xml parser function not working

I am using xerces c++ to manipulate an xml file? but getNodeValue() and setNodeValue() are not working but getNodeName() is working. Do anyone has any suggestions?

 if( currentNode->getNodeType() &&  currentNode->getNodeType() == DOMNode::ELEMENT_NODE ) 
         {
        // Found node which is an Element. Re-cast node as element
            DOMElement* currentElement= dynamic_cast< xercesc::DOMElement* >( currentNode );
            if( XMLString::equals(currentElement->getTagName(), TAG_ApplicationSettings))
            {
               // Already tested node as type element and of name "ApplicationSettings".
               // Read attributes of element "ApplicationSettings".
               const XMLCh* xmlch_OptionA = currentElement->getAttribute(ATTR_OptionA);
               m_OptionA = XMLString::transcode(xmlch_OptionA);
                   XMLCh* t,*s;
        //s= XMLString::transcode("manish");
        //currentNode->setElementText(s);
                  t=(XMLCh*)currentNode->getNodeName();
               s=(XMLCh*)currentNode->getNodeValue();

cout<getNodeValue()) << "\n";

Upvotes: 1

Views: 1846

Answers (2)

Gaurav Mall
Gaurav Mall

Reputation: 11

getNodeValue() will always return an empty string, because the "value" of an element node is in its child. In our case it is text node child. Either way is to iterate through child nodes or use getTextContent. First check for child nodes in a node using hasChildNodes() then use methods like getFirstChild() etc. . Afterwards use getNodeValue().

DOMNode* ptrDomNode = SomeNode;

if(ptrDomNode->hasChildNodes())
{
    DOMNode* dTextNode =  ptrDomNode->getFirstChild();         
    char* string = XMLString::transcode(dTextNode->getNodeValue());
}

Upvotes: 1

Sandipan Karmakar
Sandipan Karmakar

Reputation: 41

A DOMElement may contain a collection of other DOMElements or a DOMText. To get the text value of an element you need to call the method getTextContent(), getNodeValue will always return NULL. The is another better way conceptually, as the DOMText is a child of the DOMElement we can traverse through the child node and get the value.

Below is the logic in the form of a method:

string getElementValue(const DOMElement& parent)
{    
 DOMNode *child;   

 string strVal;

 for (child = parent.getFirstChild();child != NULL ; child = child->getNextSibling())    
 {    
    if(DOMNode::TEXT_NODE == child->getNodeType())    
    {    
     DOMText* data = dynamic_cast<DOMText*>(child);    
     const XMLCh* val = data->getWholeText();    
     strVal += XMLString::transcode(val);    
    }    
    else    
    {    
        throw "ERROR : Non Text Node";    
    }    
 }    
 return strVal;   
}

Hope this helps :)

Upvotes: 1

Related Questions