Iwao Dev

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

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

2012年3月8日

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) ;
}
}

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

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



    top

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