【VC6.0 MSXML】新規に作成した要素に、属性を追加するには?


ken  2003-12-08 10:39:21  No: 52796  IP: [192.*.*.*]

VC6.0、Windows2000、パーサーはMSXMLを用いて
XMLデータを出力するプログラムを作成中です。

さて、掲題の件ですが、

    // 空のドキュメントを生成する
    IXMLDOMDocumentPtr doc("MSXML.DOMDocument");

    // ルートエレメントを生成する。
    IXMLDOMNodePtr root = doc->createElement("root");
    doc->appendChild(root);

    // 属性を作成する
    IXMLDOMAttributePtr attr = doc->createAttribute("TestAttr");
    attr->text = "テスト属性値";

ここまではOKとして、作成した属性(attr)を、要素(root)に関連付けする方法がわかりません。
独自に調べたところ、「SetAttributeNode(root->SetAttributeNode)」を使う方法を多く見受けたのですが、
実際に使ってみてもエラー(メンバがありません等)になってしまいます。

どうかご教授をお願いいたします。

編集 削除
ken  2003-12-09 10:33:13  No: 52797  IP: [192.*.*.*]

自己レスです。

↑に書いたコードのうち、アトリビュートを付加する対象をノードではなく、
要素にすることでアトリビュートを付加することができました。
コード的には

    // ルートエレメントを生成する。
    IXMLDOMNodePtr root = doc->createElement("root");
    doc->appendChild(root);

ここを、

    // ルートエレメントを生成する。
    IXMLDOMElementPtr root = doc->createElement("root");
    doc->appendChild(root);

としました。

そこで更に質問なのですが、
ツリー構造を考えた時、そのツリーにおける分岐をノードと言いますが、
ツリー構造における要素とは一体何を示すのでしょうか。
もしくは、XMLで言うノードと要素の違いは何なのでしょうか?
(いろいろ調べてみましたが、ノードと言う表現をする資料が見付かりませんでした)

プログラム的技術に直接関わる部分ではありませんが、
おわかりになる方がいましたら、是非ともご教授をお願いいたします。

編集 削除
なーめ  2003-12-11 05:21:04  No: 52798  IP: [192.*.*.*]

SGMLでさ、
<!ELEMENT ... >
ってなかったかな。
<!DOCTYPE ...>
<!ENTITY ...>
もその仲間だよね。
ある意味、特殊なノード。
DTD を構成するもの。
http://www.w3.org/MarkUp/SGML/
http://www.w3.org/MarkUp/SGML/sgml-lex/sgml-lex
から、
<!doctype Memo [
<!element Memo         - - (Salutation, P*, Closing?)>
<!element Salutation   O O (Date & To & Address?)>
<!element (P|Closing|To|Address) - O (#PCDATA)>
<!element Date - O EMPTY>
<!attlist Date
  numeric CDATA #REQUIRED
]>
DOCTYPE を作って、その中にいれていかなければならないのでは?

編集 削除
なーめ  2003-12-11 05:27:06  No: 52799  IP: [192.*.*.*]

doc->save( filename );

で出力したファイルの中身を確認してますか?
エラーが出なくても、失敗してるかもしれませんよ。

編集 削除
ken  2003-12-11 17:23:59  No: 52800  IP: [192.*.*.*]

残念ながらSGMLに関しては全くの無知なので、
せっかくのSGMLサンプルですが、全てを理解することはできません。

また、上記に記載したソースにおいて、Comの初期化、ドキュメント生成等は省略しています。

未だ要素とノードの明確な区別が出来ていない状態ですが、
更に疑問が・・・、XML(XMLデータ)における改行はどういったタイミングで挿入するべきなのか。
XMLでは改行もデータとして扱われると言うことなので、改行を含まないXML(XMLデータ)
において、テキストデータとしての見栄えのためにだけ改行を挿入するとした場合、
その部分もデータフォーマットとして仕様を取り決めるべきなのでしょうか。

謎だらけです。

編集 削除
なーめ  2003-12-11 21:44:38  No: 52801  IP: [192.*.*.*]

HTML にしても XML にしても
基礎は SGML なんで、
まずは概要だけでも把握しておかれるとよいかと。
# SGML を知らなくても HTML のホームページが作れるという話はおいといて。
>> XMLでは改行もデータとして
DTDでそう定義してあるということなんでしょうね。

編集 削除