標準ライブラリのみを使用して、スタンドアロン C で xml を解析するプロセスの概要を教えてください。
これは実際に役立つプロジェクトなので、練習として取り組みたいと思っています。
私が目にするほとんどの例では、ポインターと構造体の配列を多用しているようです。そのため、ヒントや概要をいただければ幸いです。
さて、あなたは2つの異なるものを見ているでしょう. 1 つ目は、これを達成するための高レベルの戦略です。2 つ目は、データ構造と、それを行うために使用するその他の言語固有の実装の詳細です。
高レベルの部分については、まず有限オートマトンを学習することをお勧めします。これらは、解析やその他の状態に大きく依存するジョブを計画するための非常に強力な概念的ツールであり、コードに容易に変換されます。
実装の詳細については...まあ、誰かがすでにツリー構造を指摘しています。XML は基本的にはツリーです。
テキストを読み込んで、それをオブジェクト ツリーに組み込むだけです。
次の単純な XML があるとします。
<A>Hello<B x="1">World</B></A>
<A>Another Object A</A>
次のようなものを構築できます。
Obj_1
Name = "A"
Text = "Hello"
--> Obj_2
Name = "B"
Text = "World"
Param_1 (Name = "x", Value = "1")
Obj_3
Name = "A"
Text = "Another Object A"
このような単純なクラス オブジェクトを使用すると、ツリーを構築できます (通常の C での解析について質問されたことは承知していますが、C++ のタグも付けられているため、私の例は C++ です)。
class Obj
{
public:
struct Param{
std::string name;
std::string value;
};
std::string text;
std::string name;
std::list<Param> params;
std::list<Obj *> children;
};
次に、値の文字列 (XML とは) を整数、倍精度、ブール値などに変換し、余分な空白をクリーンアップするためのヘルパーを追加する必要があります。「XYZ」という名前のすべてのルート オブジェクトを取得するコードを追加して、常に手動でループする必要がないようにすることもできます。
これにより、どこから始めればよいかがわかります。それは本当に難しいことではありません。
xml ファイルをスキャンして ('>' および !='\n') までチェックし、'<' までの値の保存を開始します。
既存のライブラリを使用したくない場合は、XML パーサーを自分で構築する必要があります。XML を手動で効率的に解析する方法はありません。
以下の基本的な概念を理解することをお勧めします。
この素晴らしいコースを無料で受講してください: https://www.coursera.org/course/compilers
時間に制約されていない場合は、これを学習の機会と考えてください。
幸運を!