Iwao Dev

気付いたことをメモしています.

この画面は、簡易表示です

2012/03/08

XML の読込テスト – 3

BOOL ReadElement(
		MSXML::IXMLDOMElementPtr pElement,
		long indent
		) {
	CString tab = _T("\t\t\t\t\t\t\t\t\t\t\t\t\t") ;
	CString lsp = tab.Left(indent) ;
	if (pElement == NULL) { return FALSE ; }
	MSXML::IXMLDOMNodeListPtr pNode = pElement->GetchildNodes() ;
	{
		CString node = LPCTSTR(pElement->GetnodeName()) ;
		CString tagN = LPCTSTR(pElement->GettagName()) ;
		CString text ;
	// 	if (pNode->Getlength() == 0) {
			text = LPCTSTR(pElement->Gettext()) ;
	// 		}
		MSXML::IXMLDOMNamedNodeMapPtr aMap = pElement->Getattributes() ;
		CString str ;
		if (aMap != NULL) {
			str = ::ToString(aMap->Getlength()) ;
			for (int aIndex=0 ; aIndex<aMap->Getlength() ; aIndex++) {
				MSXML::IXMLDOMAttributePtr attr = aMap->Getitem(aIndex) ;
				if (attr == NULL) { continue ; }
				str += CString(_T("\t")) + LPCTSTR(attr->Getname()) ;
				str += CString(_T(" ")) + ::ToStringTC(LPCWSTR(attr->Getvalue().bstrVal)) ;
				}
			}
		cout << LPCTSTR(lsp) << LPCTSTR(node) << _T("\t") << LPCTSTR(text)
			<< _T("\t") << LPCTSTR(str)
			<< endl ;
		for (int index=0 ; index<pNode->Getlength() ; index++) {
			MSXML::IXMLDOMElementPtr child = pNode->Getitem(index) ;
			ReadElement(child,indent+1) ;
			}
		}
	return TRUE ;
	}

attr->value が,VARIANT で,VT_BSTR
これを LPCTSTR とすることは出来ず,::ToStringTC をしている.
 ::ToStringTC は引数とコンパイルオプションにより char* ⇔ wchar* が可能
 今回の場合,内部では ::WideCharToMultiByte で変換している.


要素の内容の取得はこんな感じか?

//	text = LPCTSTR(pElement->Gettext()) ;
	if (pNode->Getlength() > 0) {
		MSXML::IXMLDOMNodePtr	pText = pNode->Getitem(0) ;
		if (pText != NULL) {
			text = LPCTSTR(pText->text) ;
			}
		}

http://mish.work/joomla/cpp/xml.html

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。

  にほんブログ村 IT技術ブログへ



    top

    %d人のブロガーが「いいね」をつけました。