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

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

DOMオブジェクトへのアクセス

次にXML文書を読み込んでDOMオブジェクトに展開し、DOMツリーを辿ってその内容を標準出力にダンプするアプリケーションxmldump.exeのメイン関数のコードを示します。

int main(int argc, char* argv[])
{
  if (argc != 2) {
    cerr << "Usage: XMLDump filename" << endl;
    return 1;
  }
  try {
    // iPEXの初期化
    Init init;
    iconv::CP932ConverterFactory fCP932(L"shift_jis");

    // 入力ファイルのオープン
    DOMString pathname = WSTR(argv[1]);
    Stream::InputStreamByFile ifs(pathname.c_str());
    if (!ifs) {
      cerr << "Could not open file: " << MBSTR(pathname) << endl;
      return 1;
    }
    // XMLデータの読み込み
    XMLReader reader(&ifs);
    Document* pDoc = IPEXDocument::createDocumentObject();
    if (0 == pDoc) {
      cerr << "Could not create document object" << endl;
      return 1;
    }
    if (!reader.read(pDoc)) {
      cerr << "Could not read xml: " << MBSTR(pathname) << endl;
      return 1;
    }
    // XMLデータのダンプ
    printDocument(pDoc);
    return 0;
  }
  catch (...) {
    cerr << "Somewhat error occured" << endl;
      return 1;
  }
}

XMLファイルからDOMオブジェクトツリーへの展開は、先のサンプルxmlecho.exeにて示したものと同様です。このプログラムは関数printDocument()にて、ドキュメントツリーの内容を標準出力にダンプします。

Documentへのアクセス

次に関数printDocument()のコードを示します。

void printDocument(Document* pDoc)
{
    cout << "Document start: " << endl;
    Element* pElement = pDoc->getDocumentElement();
    printNode(pElement);
    cout << "Document end:" << endl;
}

ドキュメントツリーにアクセスするためには、まずDocument::getDocument()にてドキュメントエレメントノードを取得する必要があります。ドキュメントエレメントノードは、ドキュメントツリーのルートノードであり、ドキュメントノードの子ノードのうち、唯一のエレメントノードです。ドキュメントツリーの要素にアクセスするためには、ドキュメントエレメントノードを取得する必要があります。

Nodeへのアクセス

取得したエレメントノードは、関数printNode ()に渡します。関数printNode ()は、クラスNodeの派生クラスを受け取り各処理を振り分けます。

void printNode(Node* pNode)
{
  // ノードの種類別に処理を振り分ける
  switch (pNode->getNodeType()) {
  case Node::DOCUMENT_NODE:
    break;
  case Node::ELEMENT_NODE:
    printElementNode(pNode);
    break;
  case Node::TEXT_NODE:
    printTextNode(pNode);
    break;
  }
}

Elementノード、NodeListへのアクセス

次の関数printElementNode ()は、エレメントノードの内容をダンプします。

void printElementNode(Node* pElement)
{
  cout << "Element start: " << MBSTR(pElement->getNodeName()) << endl;
  // 属性データのダンプ
  NamedNodeMap* attrs = pElement->getAttributes();
  if (0 != attrs) {
    for (int i=0; i<attrs->getLength(); i++) {
      Node* attr = attrs->item(i);
      cout << " " << MBSTR(attr->getNodeName())
        << "=\"" << MBSTR(attr->getNodeValue()) << '"' << endl;
    }
  }
  // 子ノードのダンプ
  NodeList* children = pElement->getChildNodes();
  if (0 != children) {
    for (int i=0; i<children->getLength(); i++) {
      printNode(children->item(i));
    }
  }
  cout << "Element end: " << MBSTR(pElement->getNodeName()) << endl;
}

属性はエレメントにNamedNodeMapとして保持されています。まずNode::getAttributes()を用いてNamedNodeMapへの参照を取得し、そのエレメントに属する属性の一覧を取り出します。

次に、Node::getChildNodes()にて取得したNodeListへの参照を用いて子ノードにアクセスします。取得した子ノードは、再度printNode()に渡して再帰的にダンプ処理を行います。

xmldump.exeの実行

xmldump.exeはコマンドプロンプトにて次のコマンドを用いることにより、XMLファイルbooklist.xmlの内容を表示します。

C:\> xmldump booklist.xml

© 2001 Infoteria Corporation

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

このページのトップ