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

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

2013年01月23日 ⁄ 综合 ⁄ 共 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;
}

运行截图:

抱歉!评论已关闭.