是否有任何已知的算法可以检测并从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");
}
}
}
}
}
我也试图避免使用第三方库。
答案 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>
如果没有第三方库这样做是一项智力练习,那么它将是一个非常有益的,并且是一个雄心勃勃的第一个解析器项目。如果没有,那么建议您充分利用已经进入现有库的大量工作。