【问题标题】:Algorithm for parsing XML in CC语言解析XML的算法
【发布时间】:2015-07-20 07:29:43
【问题描述】:

是否有任何已知的算法可以检测并从 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");
                }   
            }
        }
    }
}

我也在尽量避免使用第 3 方库。

【问题讨论】:

  • 尝试在不工作的情况下发布案例。
  • 正确解析 HTML 并非易事。您可以使用状态机一次查看几个字符,状态数是可控的。依赖strstr() 或正则表达式匹配的蛮力方法是近似的,并且在许多琐碎的情况下都失败了。

标签: html c parsing


【解决方案1】:

您的问题涉及 XML,但您已将其标记为 HTML – 请注意,这些是完全不同的野兽。

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

也就是说,您将使用诸如flex 之类的词法分析器来识别诸如&lt;&lt;/=、字符串、引号等标记流,然后使用诸如bison 写下句法规则,并在此基础上编写代码以将格式正确的句法转换为有用的数据结构(也就是说,当您的程序发现元素开始时,它实际上 做什么 -标签,例如&lt;a href='urn:foo'&gt;?)。这是完全可行的,但这是一个不平凡的项目。

作为其中的一部分,您将获得与XML spec非常密切关系,并且建议您组装大量测试用例,越病态越好.该规范中有很多精细的细节和许多微妙之处。

几个月前,我正在从事一个旨在提取 XML 文件内容子集的项目。它不是对文件的完整解析,但我和你一样,希望保持简单并避免使用第三方库。经过大约一周的扎实工作,并在之前使用基于 yacc/bison 的解析器的大量经验的基础上,我意识到我实际上最终实现了大部分通用 XML 解析器,这显然会变得相当健壮和功能,但它仍然缺少几个解析极端情况,并且将是乏味的润色。我认为使用 expat 毕竟不是一个坏主意,所以扔掉了我的代码,并在这项工作的基础上取得了更快的进展。

请注意,解析格式良好的 XML 与解析(通常非常格式错误的)HTML 是完全不同的命题。因为 HTML 几乎完全不符合语法,所以它的解析器必须更加特别;野牛生成的解析器可能会遇到相当大的困难,除非您在智能错误恢复方面付出了一些努力。您可能想查看基于 C 的 Markdown 或 Wiki 解析器以获取想法。或者尝试使用谷歌搜索 tagsoup c 以获取库建议(有一个著名的用于野生 HTML 的 Java 解析器称为 TagSoup,其他语言中的类似内容往往会大喊大叫)。

如果在没有第三方库的情况下执行此操作是一项智力练习,那么这将是一个非常有启发性的练习,也是一个雄心勃勃的第一个解析器项目。如果没有,那么建议您充分利用现有库所付出的巨大努力。

【讨论】:

    猜你喜欢
    • 2010-12-03
    • 2011-09-13
    • 2015-04-02
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    相关资源
    最近更新 更多