我使用xerces c ++来操作xml文件?但getNodeValue()和setNodeValue()不起作用,但getNodeName()正在工作。有人有什么建议吗?
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&lt; getNodeValue())&lt;&lt; “\ n” 个;
答案 0 :(得分:1)
DOMElement
可能包含其他DOMElements
或DOMText
的集合。要获取需要调用方法getTextContent()
的元素的文本值,getNodeValue
将始终返回NULL
。
这是概念上另一种更好的方法,因为DOMText
是DOMElement
的子节点,我们可以遍历子节点并获取值。
以下是方法形式的逻辑:
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 :(得分:1)
getNodeValue()
将始终返回一个空字符串,因为元素节点的“值”位于其子节点中。在我们的例子中,它是文本节点子。无论哪种方式都是遍历子节点
或使用getTextContent
。
首先使用hasChildNodes()
检查节点中的子节点,然后使用getFirstChild()
等方法。然后使用getNodeValue()
。
DOMNode* ptrDomNode = SomeNode;
if(ptrDomNode->hasChildNodes())
{
DOMNode* dTextNode = ptrDomNode->getFirstChild();
char* string = XMLString::transcode(dTextNode->getNodeValue());
}