2

標準ライブラリのみを使用して、スタンドアロン C で xml を解析するプロセスの概要を教えてください。

これは実際に役立つプロジェクトなので、練習として取り組みたいと思っています。

私が目にするほとんどの例では、ポインターと構造体の配列を多用しているようです。そのため、ヒントや概要をいただければ幸いです。

4

4 に答える 4

5

さて、あなたは2つの異なるものを見ているでしょう. 1 つ目は、これを達成するための高レベルの戦略です。2 つ目は、データ構造と、それを行うために使用するその他の言語固有の実装の詳細です。

高レベルの部分については、まず有限オートマトンを学習することをお勧めします。これらは、解析やその他の状態に大きく依存するジョブを計画するための非常に強力な概念的ツールであり、コードに容易に変換されます。

実装の詳細については...まあ、誰かがすでにツリー構造を指摘しています。XML は基本的にはツリーです。

于 2012-11-28T00:29:43.997 に答える
1

テキストを読み込んで、それをオブジェクト ツリーに組み込むだけです。

次の単純な 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」という名前のすべてのルート オブジェクトを取得するコードを追加して、常に手動でループする必要がないようにすることもできます。

これにより、どこから始めればよいかがわかります。それは本当に難しいことではありません。

于 2012-11-28T02:18:09.563 に答える
0

xml ファイルをスキャンして ('>' および !='\n') までチェックし、'<' までの値の保存を開始します。

于 2012-11-28T04:25:34.473 に答える
0

既存のライブラリを使用したくない場合は、XML パーサーを自分で構築する必要があります。XML を手動で効率的に解析する方法はありません。

以下の基本的な概念を理解することをお勧めします。

  1. 正規表現
  2. DFA/NFA
  3. レクサー/スキャナー
  4. 文法の種類 (少なくとも通常の文法と文脈自由文法を学ぶ)
  5. BNF、EBNF
  6. 再帰降下解析

この素晴らしいコースを無料で受講してください: https://www.coursera.org/course/compilers

時間に制約されていない場合は、これを学習の機会と考えてください。

幸運を!

于 2012-11-28T03:14:42.210 に答える