■ XMLで要素内の要素を列挙

[Visual C++ Q & A 掲示板] [過去ログの一覧]


はむ 2007/12/27(木) 22:15:41 <中級者>
お世話になります。

只今、VC++.net+MSXML4にてXMLを読み込むプログラムを作成しています。
現在は要素名を指定して任意の要素や属性を取得することができたのですが、
ある要素内に記述された要素を、記述された順に取得する必要が出てきました。

具体的には、

<element index="0">
  <a1 attr="0">
  <a2 attr="0 0">
  <a3 attr="0 0 0">
  <a2 attr="0 0">
  :
</element>
<element index="1">
  :
</element>

のように、<element>という要素の中に複数の要素が順不同で記述されています。

現在は以下の方法で要素の名前までは列挙できるようにはなりましたが、
属性を取得するのに手が詰まっています。

MSXML2::IXMLDOMElementPtr peElement; // <=既に入っているとします

MSXML2::IXMLDOMNodePtr p = peElement->GetfirstChild();
do
{
  std::string Name = (_bstr_t)p->GetnodeName();
  p = p->GetnextSibling();
} while ( p != NULL );

XMLの扱いが間もないので、検討違いの質問かも知れませんが
ご存知の方が居られましたら手助けして頂けませんでしょうか。

よろしくお願いします。

シャノン 2007/12/28(金) 01:42:47 <常連>
peElement->attribute で属性のコレクションが IXMLDOMNamedNodeMap で取れるので、IXMLDOMNamedNodeMap::length の数だけループして、IXMLDOMNamedNodeMap::item で各属性が取得できるんじゃねぇですか?

はむ 2007/12/28(金) 11:28:38 <中級者>
[[解決]]

シャノンさん、どうも有り難う御座いました。
以下の方法で取得できるようになりました。

do
{
  MSXML2::IXMLDOMNamedNodeMapPtr pMap = p->Getattributes();
  int Len = (int)pMap->Getlength();
  for ( int i = 0; i < Len; Len ++ )
  {
    MSXML2::IXMLDOMNodePtr pNode = pMap->Getitem( i );
    pNode->GetnodeName();   // 属性名
    pNode->GetnodeValue();  // 属性内容
  }
  p = p->GetnextSibling();
} while( p != NULL );

以上で解決とさせて頂きます。
どうも有難う御座いました。

シャノン 2007/12/28(金) 12:24:49 <常連>
そかそか。attributesとかはプロパティなので、C++で使うときはGetがつくのか。
Getに続くのが小文字って、なんか間抜けだね。

毎週金曜日はポイント最大3倍!さらに4倍のチャンスも!

Programming Library