2009-03-04 32 views
0

これは簡単な質問のようです。XMLパーサーとは何ですか? Expatの使用

しかし、Linuxで動作しているアプリケーションで使用するXMLパーサーを探していました。

私はExpatを使用していますが、私のXMLファイルを1インチで読むと解析しました。しかし、出力は入力と同じです。私はこれに合格した後、私は正確に出力と同じ取得し、

<?xml version="1.0" encoding="utf-8"?> 
    <books> 
     <book> 
       <id>1</id> 
       <name>Hello, world!</name> 
     </book> 
    </books> 

しかし:

この

は私が読んでいる私のファイルです。パーサーが何のためになっているのだろうか?

もう1つだけです。私はExpatを使用しています。それは使いにくいようです。私のコードは以下の通りです:これはファイルを読み込みます。しかし、私のアプリケーションは、ファイルではなく、ソケットで受信されるバッファを解析する必要があります。誰もが持っているサンプルがありますか?

int parse_xml(char *buff) 
{ 
    FILE *fp; 
    fp = fopen("mybook.xml", "r"); 
    if(fp == NULL) 
    { 
     printf("Failed to open file\n"); 
     return 1; 
    } 

    /* Obtain the file size. */ 
    fseek (fp, 0, SEEK_END); 
    size_t file_size = ftell(fp); 
    rewind(fp); 

    XML_Parser parser = XML_ParserCreate(NULL); 
    int done; 
    memset(buff, 0, sizeof(buff)); 

    do 
    { 
     size_t len = fread(buff, 1, file_size, fp); 
     done = len < sizeof(buff); 

     if(XML_Parse(parser, buff, len, done) == XML_STATUS_ERROR) 
     { 
      printf("%s at line %d\n", XML_ErrorString(XML_GetErrorCode(parser)), 
             XML_GetCurrentLineNumber(parser)); 
      return 1; 
     } 
    } 
    while(!done); 

    fclose(fp); 
    XML_ParserFree(parser); 

    return 0; 
} 

答えて

2

XML解析(私はPerlではCではありませんが)の周りに頭を抱えるのに時間がかかりました。基本的には、コールバック関数を登録します。パーサーは、各ノードのコールバックにpingを行い、あらゆる種類のジューシーなビット(プレーンテキスト、属性、子ノードなど)を含むデータ構造を渡します。何らかの種類の状態情報を維持する必要があります。たとえば、ハッシュツリーを埋め込むか、すべての勇気を含んだ文字列などですが、XMLはありません。

XMLは線形ではなく、長文のテキストのように解析するのはあまり意味がないことを覚えておいてください。代わりに、木のように解析します。がんばろう。

3

Expatは偶数主導のパーサーです。タグや属性などを扱うコードを記述してから、コードをパーサーに登録する必要があります。これを行う方法を説明する記事hereがあります。

ソケットから読み取る場合、プラットフォームによっては、ファイルハンドルのようにソケットを扱うことができます。それ以外の場合は、ソケットから独自の読み取りを行い、明示的にexpatにデータを渡す必要があります。これを行うためのAPIがあります。しかし、私はそれが通常のファイルで最初に動作するようにしようとします。

2

expatの代わりに、おそらくあなたのディストリビューションに既に含まれているlibxml2を見たいかもしれません。 expatよりもはるかに強力で、DOM(ツリーモード)、SAX(ストリーミングモード)、XPath(XML IMHOと何か複雑なことをするために不可欠な機能)など、あらゆる種類の機能を提供します。これはexpatほど軽量ではありませんが、使用するのがずっと簡単です。

0

さて、最も複雑なXMLパーサー(イベント駆動型パーサーは扱いが難しい)を選択しました。なぜexpatではなくlibxml

関連する問題