今天碰到了一个要用XML文件存储文件夹目录的问题。XML,大名鼎鼎,很早就听说过了。学起来也很容易,但是却一直没有怎么用过,更别说要自己写程序来解析了。碰到这个问题,我就马上想到《C++ Cook Book》书中有介绍使用开源的XML解析类库的用法。于是马上查看此书电子版,读了读,虽然英文不是问题,但是感觉一下子要用来也是不容易的。就算会那些个库了,代码中都要包含一陀头文件的,而我写代码是要集成进系统的。再想想自己的XML的文件也是超级简单,也不需要动用那么重量级的工具了。自己尝试写代码解析一下,还能提高自己的编程能力。说干就干,花了不少时间,终于把的那个超级简单的XML文件解析成功。
下面是我要解析的XML文件。
<Root Name="d:/">
<DirectoryList Name="djfkjdk">
<DirectoryList Name="afjkdjf">
<Directory Name="111"></Directory>
<Directory Name="222"></Directory>
</DirectoryList>
<Directory Name="333"></Directory>
<Directory Name="444"></Directory>
</DirectoryList>
<DirectoryList Name="djfkjdk">
<DirectoryList Name="afjkdjf">
<Directory Name="111"></Directory>
<Directory Name="222"></Directory>
</DirectoryList>
<Directory Name="333"></Directory>
<Directory Name="444"></Directory>
</DirectoryList>
</Root>
<DirectoryList Name="djfkjdk">
<DirectoryList Name="afjkdjf">
<Directory Name="111"></Directory>
<Directory Name="222"></Directory>
</DirectoryList>
<Directory Name="333"></Directory>
<Directory Name="444"></Directory>
</DirectoryList>
<DirectoryList Name="djfkjdk">
<DirectoryList Name="afjkdjf">
<Directory Name="111"></Directory>
<Directory Name="222"></Directory>
</DirectoryList>
<Directory Name="333"></Directory>
<Directory Name="444"></Directory>
</DirectoryList>
</Root>
下面是我的代码。因为XML文件很简单,所以代码也很简单。
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <stack>
using namespace std; string getNextTagStr(ifstream& cin);
string getDirectoryName(const string& tagStr);
string tagStr; int main()
{
stack<string> tagStk;
string tagStr, curTag;
ifstream cin("Directories");
int tabCnt = 0;
tagStr = getNextTagStr(cin);
curTag = tagStr.substr(1, tagStr.find_first_of(' '));
tagStk.push(curTag);
while (tagStr != "") {
if (tagStr[1] == '/') {
curTag = tagStr.substr(2, tagStr.length() - 3);
if (curTag == tagStk.top()) {
if (strncmp(tagStk.top().c_str(), "DirectoryList", 13) == 0)
--tabCnt;
tagStk.pop();
}
} else {
curTag = tagStr.substr(1, tagStr.find_first_of(' ') - 1);
if (strncmp(curTag.c_str(), "DirectoryList", 13) == 0) {
++tabCnt;
for (int i = 0; i != tabCnt; ++i)
cout << '/t ';
} else if (strncmp(curTag.c_str(), "Directory", 9) == 0) {
for (int i = 0; i != tabCnt; ++i)
cout << '/t ';
}
cout << getDirectoryName(tagStr) << endl;
tagStk.push(curTag);
}
tagStr = getNextTagStr(cin);
}
return 0;
} string getDirectoryName(const string& tagStr)
{
size_t start = tagStr.find_first_of('"');
size_t end = tagStr.find_last_of('"');
return tagStr.substr(start + 1, end - start - 1);
} string getNextTagStr(ifstream& cin)
{
tagStr.clear();
char curChar = 0;
bool inTagStr = false;
while (cin.get(curChar)) {
if (!inTagStr && (curChar == ' ' || curChar == ' ' || curChar == ' '))
continue;
if (curChar == '<') {
inTagStr = true;
tagStr += '<';
} else if (inTagStr && curChar != '>') {
tagStr += curChar;
} else if (curChar == '>') {
tagStr += '>';
break;
}
}
return tagStr;
}
#include <fstream>
#include <vector>
#include <string>
#include <stack>
using namespace std; string getNextTagStr(ifstream& cin);
string getDirectoryName(const string& tagStr);
string tagStr; int main()
{
stack<string> tagStk;
string tagStr, curTag;
ifstream cin("Directories");
int tabCnt = 0;
tagStr = getNextTagStr(cin);
curTag = tagStr.substr(1, tagStr.find_first_of(' '));
tagStk.push(curTag);
while (tagStr != "") {
if (tagStr[1] == '/') {
curTag = tagStr.substr(2, tagStr.length() - 3);
if (curTag == tagStk.top()) {
if (strncmp(tagStk.top().c_str(), "DirectoryList", 13) == 0)
--tabCnt;
tagStk.pop();
}
} else {
curTag = tagStr.substr(1, tagStr.find_first_of(' ') - 1);
if (strncmp(curTag.c_str(), "DirectoryList", 13) == 0) {
++tabCnt;
for (int i = 0; i != tabCnt; ++i)
cout << '/t ';
} else if (strncmp(curTag.c_str(), "Directory", 9) == 0) {
for (int i = 0; i != tabCnt; ++i)
cout << '/t ';
}
cout << getDirectoryName(tagStr) << endl;
tagStk.push(curTag);
}
tagStr = getNextTagStr(cin);
}
return 0;
} string getDirectoryName(const string& tagStr)
{
size_t start = tagStr.find_first_of('"');
size_t end = tagStr.find_last_of('"');
return tagStr.substr(start + 1, end - start - 1);
} string getNextTagStr(ifstream& cin)
{
tagStr.clear();
char curChar = 0;
bool inTagStr = false;
while (cin.get(curChar)) {
if (!inTagStr && (curChar == ' ' || curChar == ' ' || curChar == ' '))
continue;
if (curChar == '<') {
inTagStr = true;
tagStr += '<';
} else if (inTagStr && curChar != '>') {
tagStr += curChar;
} else if (curChar == '>') {
tagStr += '>';
break;
}
}
return tagStr;
}
运行截图: