2011-04-04 55 views
1

我使用xerces C++來處理xml文件嗎?但getNodeValue()和setNodeValue()不工作,但getNodeName()正在工作。有沒有人有任何建議?C++ xml解析器函數不能正常工作

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」 個;

+0

有沒有錯誤,它只是不工作 – user513164 2011-04-04 11:45:04

+0

所以你解析的節點是什麼,你在期待什麼,你在得到什麼? – 2011-04-04 14:13:07

回答

1

A DOMElement可能包含其他DOMElementsDOMText的集合。要獲得元素的文本值,您需要調用方法getTextContent()getNodeValue將始終返回NULL。 從概念上講,這是另一種更好的方式,因爲DOMTextDOMElement的孩子,我們可以遍歷子節點並獲取值。

下面是一個方法的形式邏輯:

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; 
} 

希望這有助於:)

1

getNodeValue()總是會返回一個空字符串,因爲該元素節點的「值」是它的孩子。在我們的例子中,它是文本節點子節點。無論哪種方式是遍歷子節點 或使用getTextContent。 首先使用hasChildNodes()檢查節點中的子節點,然後使用類似getFirstChild()等的方法。之後使用getNodeValue()

DOMNode* ptrDomNode = SomeNode; 

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