C言語でxmlを読み込む

C言語xmlを読み込む方法についてメモ.ライブラリはlibxml2 を使った.

xmlをパースするAPIには,大きくわけてSAXとDOMの2種類ある.両者を比較すると以下のようになる.

SAX (Simple API for xml) DOM (Document Object Model)
メモリ消費量 少ない 多い
xml中の各要素へのアクセス方法 シーケンシャル・アクセス ランダム・アクセス

libxml2のSAX型のAPIとしては xmlReader がある.xmlReaderの使い方は,http://xmlsoft.org/examples/index.html#xmlReaderにあるサンプルコードを見ると良い.

大まかな使い方は以下の通り

  xmlTextReaderPtr reader;
  reader = xmlNewTextReaderFilename("hogehoge.xml");
  while (xmlTextReaderRead(reader) == 1) {
     各要素の処理
  }
  xmlFreeTextReader(reader);

xmlTextReaderRead(reader)は各要素を切り出す関数.切り出した要素に関する情報を取得するAPIはだいたい以下の関数だけ知っておけば良さげ.

  • xmlTextReaderNodeType(reader)

要素の種別を返す.libxml/xmlrader.h にて定義されているが,だいたい以下の値のみ気にすれば何とかなるみたい.

XML_READER_TYPE_ELEMENT 要素の開始タグ
XML_READER_TYPE_TEXT タグに囲まれた要素
XML_READER_TYPE_SIGNIFICANT_WHITESPACE 改行など
XML_READER_TYPE_END_ELEMENT 要素の終了タグ
  • xmlTextReaderConstName(reader);

要素の名前を得る.要素がタグであればその文字列となる.参照を返すだけなので解放は不要.

  • xmlTextReaderConstValue(reader);

要素の値を得る.要素が参照を返すだけなので解放は不要.

  • xmlTextReaderDepth(reader)

要素のdepthを返す.depth は タグの入れ子の段数で,最上位は0.

とりあえず以上の情報だけでなんとかパーサは書ける.


C++によるXML開発技法
C++によるXML開発技法
posted with amazlet at 09.04.05
ファビオ アルシニェガス
ピアソンエデュケーション
売り上げランキング: 265745
おすすめ度の平均: 3.5
3 あまりオススメしません。。。
4 実装方法に的を絞ったもの
4 C++での実装に的をしぼっている