Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 基本XML解析器_C_Xml_Parsing_Xml Parsing - Fatal编程技术网

C 基本XML解析器

C 基本XML解析器,c,xml,parsing,xml-parsing,C,Xml,Parsing,Xml Parsing,我正在尝试用C编写一个基本的XML解析器,不使用任何非标准库,它将能够: 检测几个不同的标签 检测空标记 检测标记不匹配 我遇到的主要问题是如何区分哪一个:标签的开头、内容和结尾 我的想法是在读取文件时实现一个有限状态机,以便了解我正在读取的内容 请告诉我你的想法,如果我被指错了方向,请纠正我 编辑:添加一段检测元素和内容的代码 char tmp, buff = -1; char *content = (char*) malloc(sizeof(char) * (size + 1)); in

我正在尝试用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++;
    }
}
chartmp,buff=-1;
char*content=(char*)malloc(sizeof(char)*(size+1));
int stage=-1;
int i=0;
而((tmp=fgetc(文件))!=EOF){
如果(tmp=''){
printf(“内容:”);
printCont(内容,i);
}
阶段=1;
buff=tmp;
i=0;
继续;
}else if(tmp=='/'&&buff==''){
如果(阶段==1){
printf(“tag_start:”);
}否则如果(阶段==3){
printf(“tag_end:”);
}否则如果(阶段==2){
printf(“内容:”);
}
buff=tmp;
printCont(content,i);//读取contnet
阶段=2;
i=0;
继续;
}
if(tmp!='&&tmp!='\n'&&tmp!='\t'){//简单筛选器
内容[i]=tmp;
buff=tmp;
i++;
}
}
如果你能评论我上面的代码并告诉我如何改进,我将非常感激。
到目前为止,它检测到标签和内容,这是我首先真正需要的。

一个FSM本身是不够的。您将需要一种方法来将文本分解为由指定的标记,但您需要使用其他技术来实际识别有效的XML(或拒绝无效的XML)

然后,您需要编写一个basic,它将接受这些标记并使用它们来识别有效的XML


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

查看现有的XML解析器以获得指导。我建议您也仔细阅读
数据结构。“请告诉我你的想法”好的。除非你有一个非常令人信服的理由去做,否则,在重新发明轮子之前。作为一名计算机科学专业的学生,我被要求制作自己的解析器,这是我关于C语言编程的主题的一部分。我已经读过很多关于stackoverflow的相关文章,所有这些文章都指向使用库,但正如我在问题中所写的,我需要在没有标准库和非标准库的情况下自己完成这项工作。我诚恳地征求你的意见,所以如果你愿意,请帮助我,如果你不想帮助我,那么请为其他真正愿意帮助的人留出一些空间。听起来你要找的是一本语法分析方面的教科书,例如。这并不便宜,但你的图书馆应该有一本。@Mark,你的思路是对的;在问问题时。不幸的是,在SO要求讨论(想法等)显然是禁忌。我以C代码为职业;(已经30年没上学了)。我经常遇到“ElementryXML解析器”实现;可能是由于许多XML解析器带来的过重负担。例如,一些应用程序使用XML实现配置文件;但它不是应用程序的焦点。对于这些,通常更容易编写一个足以读取配置文件的小型XML解析器。一点也不稀奇。+1这确实是准确的,而且可能是OP针对如此广泛的问题得到的最有用的建议。如果我有什么建设性的东西要添加,那就是尽可能地开发C++标准的LIB。它提供的算法,序列或其他,都非常棒,作为标准的一部分,您可以可靠地使用它们,而不会因为跳出框框而失去分数。感谢您提供的有用建议!我刚刚添加了一段代码,你想看一下吗?