この文書では、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"); // 入力ファイルのオープン |
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
