基本的XML解析器

时间:2014-05-16 18:17:24

标签: c xml parsing xml-parsing

我正在尝试用C编写一个基本的XML解析器,而不使用任何非标准的库,它们将能够:

  • 检测多个不同的标签
  • 检测空标记
  • 检测标签不匹配

我遇到的主要问题是如何区分:标签的开头,标签的内容和结尾。

我的想法是在阅读文件时实现有限状态机,以便知道我在读什么。

如果指向错误的方向,请告诉我你的想法并纠正我。

编辑:添加了一大块检测元素和内容的代码

char tmp, buff = -1;
char *content = (char*) malloc(sizeof(char) * (size + 1));
int stage = -1;
int i = 0;
while((tmp = fgetc(file)) != EOF) {
    if(tmp == '<') {
        if(stage == 2 && buff != '>'){
            printf("content: ");
            printCont(content,i);
        }
        stage = 1;
        buff = tmp;
        i = 0;
        continue;
    }else if(tmp == '/' && buff == '<') {
        stage = 3;
        buff = tmp;
        i = 0;
        continue;
    } else if(tmp == '>') {
        if (stage == 1) {
            printf("tag_start: ");
        } else if (stage == 3) {
            printf("tag_end: ");
        } else if (stage == 2) {
            printf("content: ");
        }
        buff = tmp;
        printCont(content,i);//reads the contnet
        stage = 2;
        i = 0;
        continue;
    }
    if(tmp != ' ' && tmp != '\n' && tmp != '\t') {//simple filter
        content[i] = tmp;
        buff = tmp;
        i++;
    }
}

如果你能对上面的代码发表评论并告诉我如何改进它,我会非常感激。 到目前为止,它检测标签和内容,这是我真正需要的。

1 个答案:

答案 0 :(得分:1)

FSM本身并不足够。根据{{​​3}}的规定,您需要将文本分解为标记,但是您需要使用其他技术来实际识别有效的XML(或拒绝无效的XML) 。

然后,您需要编写一个基本XML spec来获取这些令牌并使用它们来识别有效的XML。

这听起来像是一项足够基本的任务,您不必担心XML规范中80%的内容,但请确保您了解开始标记和结束标记。即便如此,这将是一项非常重要的工作。