现在的位置: 首页 > 综合 > 正文

初次使用C++解析XML文件

2013年10月13日 ⁄ 综合 ⁄ 共 2962字 ⁄ 字号 评论关闭

今天碰到了一个要用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>

下面是我的代码。因为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;
}

运行截图:

抱歉!评论已关闭.