XML データをサーバー プログラムに送信するクライアント プログラムがあります。サーバーは XML データを解析する必要があります。LinuxでC言語を使用しています。
ソケットから XML を直接解析できる API はありますか? それ以外の場合、XML 転送が完了したかどうかをどのように知ることができますか?
上で説明しようとしたように、「生のソケット」を使用する場合、一度に最大で 1 つのバッファーを読み取ることになります。1 回のソケット読み取りでドキュメント全体を読み取る必要はありません。完全な行を取得することさえできない場合があります。必要なすべてのテキストを取得するまで、ループ内で一度にバッファごとにデータをコピーする必要があります。これは解析を複雑にします:)
Expat はストリーム指向のパーサーです。これはおそらく役立つでしょう。
SAX は「イベント駆動型」のパーサーです。Expat の周りに SAX ラッパーを使用できます。libXML や Xerces など、他の多くの選択肢を使用することもできます。
要点は、1) データを (ネットワークから) 読み取ることと、2) データを解析することは、2 つの別個のアクティビティであるということです。
ソケットの学習については、Beej の最も優れた「ネットワーク プログラミング ガイド」を強くお勧めします。
Expat を学習するには、ここに良いチュートリアルがあります。
「それが役立つことを願っています..
ソケットのデータを解析しません。read(2)またはrecv(2)は、読み取りまたは受信後に解析または処理できるデータです (これらのルーチンは、たとえば 0 バイトを読み取ることによって EOF を通知します) 。
C 用の XML 解析ライブラリがいくつか存在します。この回答を参照してください。
特に、それらの多く (expat、libxml2など) は、プルされたデータのチャンクを処理できます。具体的には、特定の XML イベント (または一部の XML 要素が完全に解析されたとき) で呼び出されるルーチンを指定し、チャンク読み取りルーチンを指定し、インストールして解析を開始すると、最終的に XML イベントまたは要素登録ルーチンの一部が実行されます。呼ばれます。