我想知道哪些因素使XML解析器成为一个完整的解析器?我编写了一个从XML文件中获取数据的简单代码,所以我可以将其称为解析器吗?或者如果我想让它成为一个完整的解析器,那么我应该期望它应该执行哪种操作? 这是我的代码:
void main()
{
clock_t start,end;
double cpu_time_used;
start=clock(); FILE *fp, *fp1;
char text[300],c,stk[5][5],tempTag[10],value[20],closeTag,flag,fClose,sStart,tagNo=1;
int i,j,n,top=-1;
fp=fopen("data1.txt","r");
fp1=fopen("cpyInput.txt","w");
while(strlen(fgets(text,300,fp))!=0)
{
closeTag=0; flag=0;
for(i=0;i<strlen(text);i++)
{
if(text[i]=='>')
{
closeTag++;
if(flag==0)
{
fClose=i;
flag=1;
}
}
if(flag==1 && text[i]=='<')
{
sStart=i;
}
}
if(closeTag==2)
{j=0;
for(i=(fClose+1);i<sStart;i++)
{
value[j]=text[i];
j++;
}
value[j]='\0';
switch(tagNo){
case 1:fputs("\nAuthor:",fp1);
fputs(value,fp1);
tagNo++;break;
case 2:fputs("\tTitle:",fp1);
fputs(value,fp1);
tagNo++;break;
case 3:fputs("\tGenre:",fp1);
fputs(value,fp1);
tagNo++;break;
case 4:fputs("\tprice:",fp1);
fputs(value,fp1);
tagNo++;break;
case 5:fputs("\tPub.Date:",fp1);
fputs(value,fp1);
tagNo++;break;
case 6:
fputs(value,fp1);
tagNo=1;
//printf("\n\n");break;
}
}
}
}
这是我的XML文件:
<book>
<author>Gambardella, Matthew</author>
<title>XML Developer's Guide</title>
<genre>Computer</genre>
<price>44.95</price>
<publish_date>2000-10-01</publish_date>
<description>An in-depth look at creating applications with XML</description>
</book>
答案 0 :(得分:1)
解析器读取数据流并将其转换为其他通常更高级别的构造:对象,事件,过程调用等。您的代码执行此操作,因此符合 a 的条件解析器。
它是否有资格成为 XML 解析器?它的意思是读取XML流并将其转换为另一种形式。
但是,更严格的意义是您的代码不能成为XML解析器:通常是 XML解析器 意味着成为conformant XML processor,为了conformant,解析器必须报告违反W3C XML Recommendation中指定的规则的情况。您的解析器不会这样做,因此不是一致的XML处理器;它不是XML解析器,因为XML解析器通常被认为是一致的XML处理器。
理论上,您可以通过official conformance tasks扩展您的代码以成为完全一致的XML处理器,但几乎没有开发人员这样做。这是一项复杂的工作和已经解决的问题。相反,他们使用现有的XML解析库;你也应该。
答案 1 :(得分:0)
条款&#34;解析&#34;和&#34;解析器&#34;在XML世界中被广泛滥用。 XML解析器(称为&#34; XML处理器&#34;在W3C规范中)是一个程序,它通常从文件中读取字符或八位字节流,分析其结构,检查错误并报告它找到的内容申请。因此,解析器正在寻找特殊字符,例如尖括号和等号,并有效地将字符流转换为元素和属性的嵌套结构。结果是应用程序可以在更高级别(作为元素和属性)查看XML,并且它也知道输入格式正确。
不幸的是,很多人已经开始调用带有元素和属性的应用程序&#34;解析器&#34;。这种用法非常不正确。
您提供给我们的程序确实是一个解析器,因为它读取原始输入并尝试识别其结构。一些人似乎只是试图处理一小部分XML,具有固定的词汇表,并且它几乎没有错误检查,所以它实际上不能被称为真正的XML解析器:相反,它是一些解析器您尚未定义的XML子集或方言。当然,它不是符合W3C意义的XML解析器或处理器。
您可以使用这种方法处理一些XML消息,但它根本不可维护。关于XML的全部观点是&#34; X&#34; - 可扩展。消息格式随时间而变化,XML旨在使您能够编写对此类更改具有弹性的应用程序。像这样的本地解析器只能处理一种特定的消息格式,每次消息格式改变时都必须重写,这使整个事情变得非常糟糕。