XMLで要素内の要素を列挙

解決


はむ  2007-12-28 07:15:41  No: 67265

お世話になります。

只今、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 10:42:47  No: 67266

peElement->attribute で属性のコレクションが IXMLDOMNamedNodeMap で取れるので、IXMLDOMNamedNodeMap::length の数だけループして、IXMLDOMNamedNodeMap::item で各属性が取得できるんじゃねぇですか?


はむ  2007-12-28 20:28:38  No: 67267

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

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 21:24:49  No: 67268

そかそか。attributesとかはプロパティなので、C++で使うときはGetがつくのか。
Getに続くのが小文字って、なんか間抜けだね。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加