iPEX(アイペックス)コラム:【基礎】iPEXクラスの利用 [Part_03]

この文書では、iPEXクラスを利用するための基礎を解説します。解説にはWindows版C++用ライブラリ形式のiPEXを用います。

DOMオブジェクトの作成

次にXMLで表現した書籍リストのデータを格納するDOMツリーを作成し、その内容をXML文書として標準出力にダンプするアプリケーションxmlgenerator.exeのコードを示します。

int main(int argc, char* argv[])
{
  // iPEXの初期化
  Init init;
  iconv::CP932ConverterFactory fCP932(L"shift_jis");

  // ドキュメントツリーの作成
  Document* pDoc = makedom();
  if (0 == pDoc) {
    cerr << "Could not create document" << endl;
    return 1;
  }

  // 出力ストリームのオープン
  Stream::OutputStreamByFile ofs(Stream::OutputStreamByFile::STDOUT, L"shift_jis");
  if (!ofs) {
    cerr << "Could not open stdout" << endl;
    return 1;
  }
  // XMLデータの書き出し
  XMLWriter writer(&ofs);
  if (!writer.write(pDoc)) {
    cerr << "Could not write to stdout" << endl;
    return 1;
  }
  return 0;
}

このプログラムは関数makedom()にてドキュメントツリーを作成します。
次にmakedom()にて用いる基本的な処理について、順に解説していきます。

Documentクラスの作成

Document* pDoc = IPEXDocument::createDocumentObject();

ドキュメントノードは、1つのXMLインスタンスを表します。ドキュメントノードは、最大で1つのエレメントノードを子ノードとして持ちます。このエレメントノードをドキュメントエレメントノードと呼びます。

Elementクラスの作成

Element* createAndAddElement(Document* pDoc, Node* pNode, const char* tagName)
{
  if (0 == pNode) return 0;

  try {
    Element* pElement = pDoc->createElement(WSTR(tagName));
    if (0 != pElement) {
      pNode->appendChild(pElement);
    }
    return pElement;
  }
  catch (...) {
    cerr << "Could not create element: " << tagName << endl;
    return 0;
  }
}

エレメントノードとは、1つのエレメント要素を表し、エレメントとはXML文書内でタグで囲まれた部分です。エレメントノードは、任意の数の、エレメントノード、テキストノード、などを子ノードにすることができます。CreateAndAddElement関数は、指定したノードの子要素として1つのエレメントを作成します。作成された子要素には、値は含まれておりません。この要素はXML文書における、内容が空のタグに相当します。

この要素に内容をもたせるには、テキストノードや子要素などを追加する処理を行う必要があります。

テキストデータを持つElementクラスの作成

Element* createAndAddTextElement(Document* pDoc, Node* pNode,
const char* tagName, const char* text)
{
if (0 == pNode) return 0;

  try {
  std::auto_ptr<Element> pElement(createAndAddElement(pDoc, pNode, tagName));
    if (0 != pElement.get()) {
      Text* textNode = pDoc->createTextNode(WSTR(text));
      if (0 != textNode) {
        pElement->appendChild(textNode);
      }
    }
    return pElement.release();
  }
  catch (...) {
    cerr << "Could not create text element: " << tagName << endl;
    return 0;
  }
}

この関数は、指定したノードの子要素として1つのエレメントを作成します。関数CreateAndAddElement()との違いは、作成するエレメントに文字列を指定して、1つのテキストノードを作成し、追加することです。XML文書では文字列データを持ち、下位にタグを含まない要素に相当します。ただし、この関数で作成したエレメントに、後から子エレメントを追加することもできます。

xmldump.exeの実行

属性値の追加は、次のようにElement::setAttribute()メソッドを用いて行います。

book->setAttribute(WSTR("binding"), WSTR("hard cover"));

このようにエレメントクラスのインスタンスbookに属性をセットすることは、XML文書において、<book binding="hard cover"/>タグを生成することに相当します。

xmlgenerator.exeの実行

xmlgenerator.exeはコマンドプロンプトにて次のコマンドを用いることにより、XMLファイルbooklist1.xmlを生成します。

C:\> xmlgenerator booklist1.xml

© 2001 Infoteria Corporation

基礎:iPEXクラスの利用 [Part_01]/[Part_02]/ [Part_03]

このページのトップ