一个XML解析器应该完成哪些任务?

时间:2017-06-26 11:29:29

标签: xml parsing

我想知道哪些因素使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>

2 个答案:

答案 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旨在使您能够编写对此类更改具有弹性的应用程序。像这样的本地解析器只能处理一种特定的消息格式,每次消息格式改变时都必须重写,这使整个事情变得非常糟糕。