0

これは簡単な質問のように思えるかもしれません。

しかし、Linux で実行しているアプリケーションの 1 つで使用する XML パーサーを探していました。

私はExpatを使用しており、XML ファイルを読み取って解析しました。ただし、出力は入力と同じです。

これは私が読んでいる私のファイルです:

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

ただし、これを通過した後は、出力とまったく同じになります。パーサーは何のためにあるのだろうか?

あともう一つだけ。エクスパットを使用しています。これはかなり使いにくそうです。私のコードは次のとおりです。これはファイルを読み取ります。しかし、私のアプリケーションは、ファイルからではなく、ソケットによって受信されるバッファを解析する必要があります。誰かが持っているこれのサンプルはありますか?

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;
}
4

4 に答える 4

3

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

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

于 2009-03-04T03:08:14.793 に答える
2

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

XMLは線形ではなく、長いテキストの塊のように解析することはあまり意味がないことを覚えておいてください。代わりに、ツリーのように解析します。幸運を。

于 2009-03-04T03:16:22.357 に答える
2

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

于 2009-03-04T08:24:06.813 に答える
0

さて、あなたは最も複雑な XML パーサーを選択しました (イベント ドリブン パーサーは扱いがより困難です)。なぜlibxml ではなく Expat なのですか?

于 2009-03-04T08:46:00.583 に答える