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)」を使う方法を多く見受けたのですが、
実際に使ってみてもエラー(メンバがありません等)になってしまいます。
どうかご教授をお願いいたします。
自己レスです。
↑に書いたコードのうち、アトリビュートを付加する対象をノードではなく、
要素にすることでアトリビュートを付加することができました。
コード的には
// ルートエレメントを生成する。
IXMLDOMNodePtr root = doc->createElement("root");
doc->appendChild(root);
ここを、
// ルートエレメントを生成する。
IXMLDOMElementPtr root = doc->createElement("root");
doc->appendChild(root);
としました。
そこで更に質問なのですが、
ツリー構造を考えた時、そのツリーにおける分岐をノードと言いますが、
ツリー構造における要素とは一体何を示すのでしょうか。
もしくは、XMLで言うノードと要素の違いは何なのでしょうか?
(いろいろ調べてみましたが、ノードと言う表現をする資料が見付かりませんでした)
プログラム的技術に直接関わる部分ではありませんが、
おわかりになる方がいましたら、是非ともご教授をお願いいたします。
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 を作って、その中にいれていかなければならないのでは?
doc->save( filename );
で出力したファイルの中身を確認してますか?
エラーが出なくても、失敗してるかもしれませんよ。
残念ながらSGMLに関しては全くの無知なので、
せっかくのSGMLサンプルですが、全てを理解することはできません。
また、上記に記載したソースにおいて、Comの初期化、ドキュメント生成等は省略しています。
未だ要素とノードの明確な区別が出来ていない状態ですが、
更に疑問が・・・、XML(XMLデータ)における改行はどういったタイミングで挿入するべきなのか。
XMLでは改行もデータとして扱われると言うことなので、改行を含まないXML(XMLデータ)
において、テキストデータとしての見栄えのためにだけ改行を挿入するとした場合、
その部分もデータフォーマットとして仕様を取り決めるべきなのでしょうか。
謎だらけです。
HTML にしても XML にしても
基礎は SGML なんで、
まずは概要だけでも把握しておかれるとよいかと。
# SGML を知らなくても HTML のホームページが作れるという話はおいといて。
>> XMLでは改行もデータとして
DTDでそう定義してあるということなんでしょうね。