- PR -

Xerces C++でDTD定義ファイルの参照先変更について

投稿者投稿内容
chack
常連さん
会議室デビュー日: 2002/11/18
投稿数: 48
お住まい・勤務地: 埼玉県
投稿日時: 2004-06-07 16:56
当方のツリーのコピー部分では、属性値を書き換えたりと、ただコピーだけを
行っているコードではなく、やや複雑だったので、あえて書きませんでした。

一応問題ないレベルでコンパクトに抽出してみましたのでご参考までに。
※未デバッグのため間違いがあったらすみません。

コード:
// [ここでsaveDoc へ srcDoc のツリーをコピー]の部分
{
  // saveDocには既にrootNameのルート要素が作られているので
  // コピーの簡素化のためにルート要素を削除
  DOMNode* saveRoot = saveDoc->getDocumentElement();
  if (saveRoot != NULL)
  {
    DOMNode* removedNode = saveDoc->removeChild(saveRoot);
    removedNode->release();
  }

  WalkTreeOnCopy(saveDoc, (DOMNode*)saveDoc, srcDoc->getDocumentElement(), 0);
}


void WalkTreeOnCopy(DOMDocument* owner, DOMNode* destNode, DOMNode* srcNode, unsigned int depth)
{
  // importNode(srcNode, true)でも良いとは思いますが
  // 属性値を書き換える必要があったため、
  // importNode(srcNode, false)で要素毎コピーを行い
  // 再帰的に WalkTreeOnCopy を呼び出しています。

  DOMNode* reaf = owner->importNode(srcNode, false);
  DOMNode* newNode = destNode->appendChild(reaf);

  // Set the linked attribute value.
  DOMNamedNodeMap* attrList = newNode->getAttributes();
  if (attrList)
  {
    // ...
  }

  DOMNodeList* nodeList = srcNode->getChildNodes();
  size_t childNodeCount = nodeList->getLength();
  for (size_t index = 0; index < childNodeCount; index++)
  {
    DOMNode* childNode = nodeList->item(index);
    WalkTreeOnCopy(owner, newNode, childNode, depth + 1); // 再帰呼び出し
  }
}

りた
会議室デビュー日: 2004/06/03
投稿数: 5
投稿日時: 2004-06-24 15:33
MMXさま、CHACKさま。

ちょっと忙しくて、やっと本日修正に入れまして、結果は良好! 
無事関門を突破できました。
本日は暑いですね。
最高にハッピーでして、ビールでもご馳走したい気分です。(冗談ですけど。)

本当にありがとうございました!
また、何かの機会がありましたら、よろしくお願いいたします!

スキルアップ/キャリアアップ(JOB@IT)