使用递归函数对XML树进行预序遍历
Preorder traversal of an XML tree with a recursive function?
我有一个XML文件,如下所示:
<?xml version="1.0"? encoding="UTF-8" standalone="no"?>
<dir name="mint">
<dir name="pepper">
<dir name="shauninman">
<dir name="geomint">
<file name="readme.txt"/ token="3">
<file name="blank.gif"/ token="2">
<file name="class.php"/ token="7">
<dir/>
<dir/>
<dir/>
<dir name="test1">
<dir name="test2">
<dir name="test3">
<file name="foo1.txt"/ token="3">
<file name="foo2.gif"/ token="5">
<file name="foo3.php"/ token="5">
<dir/>
<dir name="test4">
<file name="foo4.txt"/ token="3">
<file name="foo5.gif"/ token="5">
<file name="foo6.php"/ token="5">
<dir/>
<dir/>
<dir/>
<dir/>
我曾经在C++中写过一个函数,它对树结构进行前缀遍历,如下所示:
int traverseTree( Item* node, int id )
{
cout << id;
id = id+1;
vector<Item*>* children = node->getChildren();
for( int i = 0; i < children->size(); ++i )
id = traverseTree( children->at(i), id );
return id;
}
现在,我想做同样的事情,但从XML文件开始。换句话说,我想解析XML,然后将根发送到函数"traverseTree"。然后,在每次递归调用时,我都可以检索当前节点的子节点。
我如何使用xerces这样的工具来实现这一点?新功能是什么?
谢谢你的帮助!
#include <xercesc/parsers/XercesDOMParser.hpp>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/sax/HandlerBase.hpp>
#include <xercesc/util/XMLString.hpp>
#include <xercesc/util/PlatformUtils.hpp>
#if defined(XERCES_NEW_IOSTREAMS)
#include <iostream>
#else
#include <iostream.h>
#endif
XERCES_CPP_NAMESPACE_USE
int main (int argc, char* args[]) {
try {
XMLPlatformUtils::Initialize();
}
catch (const XMLException& toCatch) {
char* message = XMLString::transcode(toCatch.getMessage());
cout << "Error during initialization!"<< message << "n";
XMLString::release(&message);
return 1;
}
XercesDOMParser* parser = new XercesDOMParser();
parser->setValidationScheme(XercesDOMParser::Val_Always);
parser->setDoNamespaces(true); // optional
ErrorHandler* errHandler = (ErrorHandler*) new HandlerBase();
parser->setErrorHandler(errHandler);
char* xmlFile = "file.xml";
//解析----
try {
parser->parse(xmlFile);
}
catch (const DOMException& toCatch) {
char* message = XMLString::transcode(toCatch.msg);
cout << "Exception message is: n"
<< message << "n";
XMLString::release(&message);
return -1;
}
//获取文档
DOMDocument* inDoc = parser->getDocument();
/* from the document get the pointer to the root */
DOMNode* inRoot = inDoc->getDocumentElement();
//遍历
int traverseTree( DOMNode* node, int id )
{
cout << id;
id = id+1;
DOMNodeList* ch_list = node->getChildNodes();
for( int i = 0; i < ch_list->getLength(); ++i )
id = traverseTree( ch_list->item(i), id );
return id;
}
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 如何在Elixir中调用递归函数并行
- 递归函数有效,但无法记忆
- 为什么我的递归函数按降序打印,然后按升序打印?
- 为什么递归函数的最终输出是 5?
- 有没有办法使用递归函数找到数组中最小值的 INDEX?C++
- 如何将记忆应用于此递归函数?
- 如何从递归函数中完全返回,该函数给出了每个函数结果的累积相加?
- 无穷大而循环时具有递归函数
- 即使没有调用这个递归函数,它是如何工作的?
- 如何使此递归函数从给定的起始位置返回最小的整数?
- 此递归函数的每次迭代的值存储在哪里?
- 可以清除递归函数中的变量吗?
- 如何在递归函数调用中返回当前函数值
- 递归函数 c++ 的复杂性
- 这个递归函数有什么作用?运行时的复杂性是多少?
- 使用后序遍历递归的深度优先搜索会产生意外输出
- 如何遍历递归模板类
- 使用递归函数对XML树进行预序遍历
- 在c++中使用递归函数循环遍历deque