我正在尝试用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++;
}
}
如果你能对上面的代码发表评论并告诉我如何改进它,我会非常感激。 到目前为止,它检测标签和内容,这是我真正需要的。
答案 0 :(得分:1)
FSM本身并不足够。根据{{3}}的规定,您需要将文本分解为标记,但是您需要使用其他技术来实际识别有效的XML(或拒绝无效的XML) 。
然后,您需要编写一个基本XML spec来获取这些令牌并使用它们来识别有效的XML。
这听起来像是一项足够基本的任务,您不必担心XML规范中80%的内容,但请确保您了解开始标记和结束标记。即便如此,这将是一项非常重要的工作。