gpt4 book ai didi

c++ - 使用递归函数对 XML 树进行预序遍历?

转载 作者:行者123 更新时间:2023-11-28 08:10:48 25 4
gpt4 key购买 nike

我有一个如下所示的 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;
}

关于c++ - 使用递归函数对 XML 树进行预序遍历?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9123693/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com