XMLDOMを使用してXMLの情報を読み込む


【概要】

IXMLDOMDocument : XML文章を操作するための最上位オブジェクト
          これは、XMLのRootを示します。

IXMLDOMNodeList : XML階層のポインタが格納され、その階層に含まれる
          全ノードの情報を持ちます。

これらに含まれるCOMインターフェイスに付いては、OLE/COM Object Viewer
でMSXML4を参照して下さい。

【サンプル】

以下のコードは、添付されているサンプルです。
これは、このサンプルのzipに含まれる "sample.xml" を読み込みます。

//Microsoft.XMLDOMを使用するためのタイプライブラリを取り込む
#import "C:\WINDOWS\SYSTEM32\msxml4.dll" 

//実行用コード
void CXmlsapDlg::OnButton1() 
{
	long cnt1, cnt2;
	int i, j;
	_bstr_t root, child1, child2, buf;
	COleVariant oleBuf;
	CStringArray arryBuf;
	CString strBuf;
	char buffer[64];

	//------------------------------
	using namespace MSXML2;		 //名前空間の定義
	IXMLDOMDocumentPtr  pXML;

	//-----------------------------------------
	//エディット・ボックスからXMLファイル名を取得
	CEdit* myEdit1 = (CEdit*)GetDlgItem(IDC_EDIT1);
	myEdit1->GetWindowText(strBuf);

	//------------------
 	//XMLの読み込み
	pXML.CreateInstance(L"Microsoft.XMLDOM");
	oleBuf.SetString(strBuf, VT_BSTR);
	pXML->load(oleBuf);

	//----------------------------
	//XMLのノードと内容の取り込み

	//Rootノード(タグ)名の取得
	root = pXML->documentElement->nodeName;
	strcpy(buffer, root);
	arryBuf.Add(buffer);
	TRACE("%s\n",buffer);

	//RootのChild Node@を取得
	IXMLDOMNodeListPtr pChildNod1Lst1 = pXML->documentElement->childNodes;
        //同一階層のノード数を取得
	cnt1 = pChildNod1Lst1->length;
	for(i = 0; i < cnt1; i++){

		//Child Node@のノード名を取得
		child1 = pChildNod1Lst1->item[i]->nodeName;
		strcpy(buffer, child1);
		arryBuf.Add(buffer);
		TRACE("%s\n",buffer);

		//Child Node@のChild NodeAを取得
		IXMLDOMNodeListPtr pChildNod1Lst2 = pChildNod1Lst1->item[i]->childNodes;
		cnt2 = pChildNod1Lst2->length;
		for(j = 0; j < cnt2; j++){

			//Child NodeAのノード名を取得
			child2 = pChildNod1Lst2->item[j]->nodeName;
			strcpy(buffer, child2);
			arryBuf.Add(buffer);
			TRACE("%s\n",buffer);

			//Child NodeAで記述されている内容を取得
			buf = pChildNod1Lst2->item[j]->text;
			strcpy(buffer, buf);
			arryBuf.Add(buffer);
			TRACE("%s\n",buffer);
		}
	}

	//MessageBoxへ取得結果を出力
	strBuf = arryBuf.GetAt(0);
	for(i = 1; i < arryBuf.GetSize(); i++){
		strBuf += "\n" + arryBuf.GetAt(i);
	}

	AfxMessageBox(strBuf);
}