您的位置:首页 > 其它

遍历XML树的递归和非递归算法

2010-11-01 09:25 127 查看
int ContentCompare::printChildrenNames(xmlNodePtr cur)
{
//使用非递归遍历
list<xmlNodePtr> listXMLNodePtr;
xmlNodePtr tempNodePtr;

listXMLNodePtr.push_back(cur);
cout << cur->name << " >> " << endl;

while (!listXMLNodePtr.empty())
{
tempNodePtr = listXMLNodePtr.front();
listXMLNodePtr.pop_front();

if ( tempNodePtr == NULL )
{
cout << "作为参数的节点指针为NULL" << endl;
return _FAILURE_;
}

const xmlChar* szTemp = tempNodePtr->name;
//遍历temp的子节点,包含元素子节点和文本子节点
for ( tempNodePtr = tempNodePtr->xmlChildrenNode; tempNodePtr != NULL; tempNodePtr = tempNodePtr->next )
{
if ( tempNodePtr->type == XML_COMMENT_NODE ) //注释节点
continue;

cout << szTemp << " >> " << tempNodePtr ->name << " = "
<< xmlNodeGetContent( tempNodePtr ) << endl << endl;

if ( tempNodePtr->xmlChildrenNode != NULL ) //文本节点或没有子节点的元素节点
listXMLNodePtr.push_back(tempNodePtr);
}
}

return _SUCCESS_;
}

int ContentCompare::printChildrenNames(xmlNodePtr cur)
{
//使用递归遍历

if (cur == NULL || cur->xmlChildrenNode == NULL )
return;
xmlNodePtr tempNodePtr;
const xmlChar* szTemp = cur->name;

for ( cur = cur->xmlChildrenNode; cur != NULL; cur = cur->next )
{
cout << szTemp << ">>" << cur ->name << " = " << xmlNodeGetContent( cur ) << endl;

//文本节点
if ( cur ->type == 3 ) //cur ->xmlChildrenNode == NULL没有子节点的节点
continue;

tempNodePtr = cur;
printChildrenNames(cur);
cur = tempNodePtr;
}

return _SUCCESS_;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: