在C

时间:2015-05-09 12:16:41

标签: html c parsing

是否有任何已知的算法可以检测并从xml txt文件中分离标记,并将内容存储到具有匹配标记详细信息的另一个文件中?

我尝试对其进行硬编码,但它并不适用于所有代码。 标签如" t" ......" / t"工作,但标签像" a href =" http://example.com"" " / A"不工作。

void get_output(){

    int i=0;
    int j=0;
    int k=0;
    int l=0;
    int m=0;
    int n=0;

    printf("\n");

    for(i=0; i<1024; i++){
        k=0;
        for(j=0; j<strlen(tags[i]); j++){

            if(tags[i][j] == '<'||tags[i][j]=='>'){
                k++;
                if(k == 4){
                    for(l = 0; tags[i][l+1] != '>'; l++){
                        printf("%c",tolower(tags[i][l+1]));
                    }

                    printf(": ");

                    for(; tags[i][l+2] != '<'; l++){
                        printf("%c", tags[i][l+2]);
                    }

                    printf("\n");
                }   
            }
        }
    }
}

我也试图避免使用第三方库。

1 个答案:

答案 0 :(得分:0)

您的问题询问了XML,但您已将其标记为HTML - 请注意这些是相当不同的野兽。

就其语法而言,XML并没有什么特别之处,你可以像解析任何其他语法一样解析它;没有特殊的算法。

您可以使用flex之类的词法分析器来识别令牌流,例如<</=,字符串,引号和依此类推,然后是一个解析器生成器,例如bison来记下语法规则,并在其上面编写代码,将正确形成的语法转换为有用的数据结构(也就是说,你的程序实际上是什么在发现元素开始标记(例如<a href='urn:foo'>?)时。这是完全可行的,但它是一个非平凡的项目。

作为其中的一部分,您将获得与XML spec非常密切关系,并且建议您组建大量测试用例,病理越多越好。在那个规范中,有很多细节,并且有很多细微之处。

几个月前,我正在开展一个旨在提取XML文件内容子集的项目。它不是文件的完整解析,但我和你一样,希望保持简单并避免使用第三方库。经过大约一周的扎实工作,以及基于yacc / bison的解析器的大量先前经验,我意识到我实际上最终实现了大多数通用XML解析器,这显然最终会变得相当稳健和功能,但仍然缺少几个解析角落案件,并且将是乏味的抛光。我决定使用expat毕竟不是一个糟糕的主意,所以抛弃了我的代码,并在这项工作上取得了明显更快的进展。

请注意,解析格式良好的XML与解析(通常是非常格式错误的)HTML是一个非常不同的命题。因为HTML根本不符合语法,所以它的解析器必须更加特别;除非你为智能错误恢复付出了一些努力,否则生成bison的解析器可能会遇到相当大的困难。您可能希望查看基于C的Markdown或Wiki解析器以获取想法。或者尝试用谷歌搜索tagsoup c来获取库建议(那里有一个着名的Java解析器,用于称为TagSoup的野生HTML,而其他语言中的类似的东西往往会给它一个喊叫声。) / p>

如果没有第三方库这样做是一项智力练习,那么它将是一个非常有益的,并且是一个雄心勃勃的第一个解析器项目。如果没有,那么建议您充分利用已经进入现有库的大量工作。