以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 XML源码及示例(仅原创和转载) 』  (http://bbs.xml.org.cn/list.asp?boardid=32)
----  请问,各位大侠有没有C或者C++解析XML文件的源程序啊?急用,谢谢。  (http://bbs.xml.org.cn/dispbbs.asp?boardid=32&rootid=&id=72526)


--  作者: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;
}
谢谢


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
62.500ms