開発環境:XP VC++ 6.0 MFC
XMLファイルの要素の値の取得について質問させてください。
XMLファイルの要素
<AAA>aaa</AAA>
から値aaaを取得したいのですがうまくいきません。
以下がその部分のソースになります。
//---------------------------------------------//
IXMLDOMElementPtr pElemRoot;
pDoc->get_documentElement(&pElemRoot);
IXMLDOMNodeListPtr nodeList;
pElemRoot->get_childNodes(&nodeList);
LONG lLen;
IXMLDOMNodePtr nodeAttrItem;
CComBSTR bstrText;
_variant_t varText;
CString cstr;
nodeList->get_length(&lLen);
for(int i = 0; i < lLen; i++){
nodeList->get_item(i, &nodeAttrItem);
nodeAttrItem->get_nodeName(&bstrText); // 1
nodeAttrItem->get_nodeValue(&varText); // 2
cstr = varText.bstrVal;
}
//---------------------------------------------//
上記ソース内の1の部分では要素の名前AAAを取得することが
できるのですが、2の部分で値aaaで取得されません。
varTextは{VT_NULL}でcstrもNULLとなります。
get_nodeValueの使い方が悪いのでしょうか。
(またはこれでは値を取得できない?)
ご指摘の程宜しくお願いいたします。
ノードタイプがNODE_TEXTであればテキストの内容が取れます。
nodeAttrItem のノードから get_firstChild で
最初の子を取得できるのでそれに対して get_nodeValue になるかも。
subaruさん、質問に答えていただき有難うございます。
>>nodeAttrItem のノードから get_firstChild で
>>最初の子を取得できるのでそれに対して get_nodeValue になるかも。
つまりこういうことでしょうか。
//---------------------------------------------//
IXMLDOMElementPtr pElemRoot;
pDoc->get_documentElement(&pElemRoot);
IXMLDOMNodeListPtr nodeList;
pElemRoot->get_childNodes(&nodeList);
LONG lLen;
IXMLDOMNodePtr nodeAttrItem;
// 追加 -->
IXMLDOMNodePtr pNode;
// 追加 <--
CComBSTR bstrText;
_variant_t varText;
CString cstr;
nodeList->get_length(&lLen);
for(int i = 0; i < lLen; i++){
nodeList->get_item(i, &nodeAttrItem);
nodeAttrItem->get_nodeName(&bstrText); // 1
// 修正 -->
//nodeAttrItem->get_nodeValue(&varText); // 2
//cstr = varText.bstrVal;
nodeAttrItem->get_firstChild(&pNode);
pNode->get_nodeValue(&varText);
// 修正 <--
}
//---------------------------------------------//
上記の場合だと要素の値aaaを取得することができました。
重ねて質問したいのですが、get_firstChild()をしなければ
ならないのはなぜでしょうか?
>>ノードタイプがNODE_TEXTであればテキストの内容が取れます。
このことが関係しているのでしょうか。
(ノードタイプについて調べてみましたがよくわかりませんでした。
nodeList->get_item(i, &nodeAttrItem)時ではnodeAttrItemが
ノードタイプ:NODE_TEXTでは無いからダメで、
nodeAttrItem->get_firstChild(&pNode)ではpNodeが
ノードタイプ:NODE_TEXTとなるからOKという事でしょうか。)
>重ねて質問したいのですが、get_firstChild()をしなければ
>ならないのはなぜでしょうか?
>>>ノードタイプがNODE_TEXTであればテキストの内容が取れます。
>このことが関係しているのでしょうか。
>(ノードタイプについて調べてみましたがよくわかりませんでした。
スマートポインタを使用しているようなので NODE_TEXT という値は
生成されたtlhファイルに定義されていることが確認できると思います。
ノードタイプはノードの型で get_nodeType メソッドで確認できます。
IXMLDOMNode 型から派生するさまざまな型があり
実体がなんなのかを調べるのに使います。
> nodeList->get_item(i, &nodeAttrItem)時ではnodeAttrItemが
> ノードタイプ:NODE_TEXTでは無いからダメで、
> nodeAttrItem->get_firstChild(&pNode)ではpNodeが
> ノードタイプ:NODE_TEXTとなるからOKという事でしょうか。)
改めて確認してみましたが、そうなってました。
(nodeAttrItem のノードタイプは NODE_ELEMENT になっていて
テキスト部分はその子ノードになる)
逆にXMLを作成する場合も createElement で作成したものを appendChild した後に、
その要素に対して createTextNode で作成したものを appendChild するという手順にな
ります。
subaruさん丁重に答えていただき有難うございました。
get_nodeValue()の使い方、またノードタイプについて大変勉強になりました。
また書き込み処理についてはこれから勉強するところですので、
subaruさんの教えを参考に調べたいと思います。
今回はどうも有難うございました。