XML 要素の値の取得について – プログラミング – Home

XML 要素の値の取得について
 
通知
すべてクリア

[解決済] XML 要素の値の取得について


cg
 cg
(@cg)
ゲスト
結合: 15年前
投稿: 3
Topic starter  

開発環境: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の使い方が悪いのでしょうか。
(またはこれでは値を取得できない?)

ご指摘の程宜しくお願いいたします。


引用未解決
トピックタグ
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

ノードタイプがNODE_TEXTであればテキストの内容が取れます。
nodeAttrItem のノードから get_firstChild で
最初の子を取得できるのでそれに対して get_nodeValue になるかも。


返信引用
cg
 cg
(@cg)
ゲスト
結合: 15年前
投稿: 3
Topic starter  

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という事でしょうか。)


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

>重ねて質問したいのですが、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 するという手順にな
ります。


返信引用
cg
 cg
(@cg)
ゲスト
結合: 15年前
投稿: 3
Topic starter  

subaruさん丁重に答えていただき有難うございました。

get_nodeValue()の使い方、またノードタイプについて大変勉強になりました。
また書き込み処理についてはこれから勉強するところですので、
subaruさんの教えを参考に調べたいと思います。

今回はどうも有難うございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました