-- 作者:sanron
-- 发布时间:3/2/2009 11:18:00 PM
-- 请问,各位大侠有没有C或者C++解析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"); 这个地方应该是要解析的XML文件的路径吗? 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; } 谢谢
|