<!DOCUMENT HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">

<html>

<head>
<meta http-equiv="Content-Language" content="ja">
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<link rel="stylesheet" type="text/css" href="../../default.css">
<title>MSXML SAX</title>
</head>

<body>
<!--#include virtual="../../menu2.html"-->
<div class="contents">
<h4>contents</h4>
	<ol>
		<li><a href="#SAX">MSXML-SAXを使う</a></li>
		<li><a href="#sample">例：XMLリソースローダー</a></li>
	</ol>
</div>

<h1>MSXML SAX</h1>

<!--- Summary --->
<div>
	<p>簡単な構造のXMLを読み込むだけならば、DOMよりもSAXのほうが楽なくらいです。</p>
</div>

<h2 id="SAX">SAX</h2>
<div>
	<h3>とりあえず最初は</h3>
	<p>
		Microsoftの<a href="http://msdn.microsoft.com/code/default.asp?URL=/code/sample.asp?url=/MSDN-FILES/026/001/407/msdncompositedoc.xml">SAX2 Jumpstart</a>を参考にするのがよいかと。
		MSXMLの特徴は、SAXのイベントハンドラがCOMインタフェイスであることです。
		サンプルを見る限りは、単純なC++クラスとして実装しています。
		自分のアプリケーション内部のみで使うならば、COMとしての実装はいい加減で良いようです。
	</p>
	<h3>エレメントより属性が楽</h3>
	<p>
		SAXを使う限りは、テキストエレメントよりも属性にしたほうが手間を省けるようです。
		エレメントはコールバックで処理するため、内部状態の遷移を考えなくてはなりませんが、
		属性は「名前−属性値」の連想配列として扱えるためです。
		末端ノードの情報は属性にしてしまいましょう。
<pre><code>&lt;character&gt;
  &lt;name&gt;はにゃーん&lt;/name&gt;
&lt;/character&gt;</code></pre>
		より、
<pre><code>&lt;character name=&quot;はにゃーん&quot;/&gt;</code></pre>
		のほうが楽です。
	</p>
	<h3>データ構造</h3>
	<p>
		SAXは、木構造のXMLを深さ優先で順にコールバックしてくれます。
		そのため、内部状態の保持にはスタックを使うと簡単なようです。
	</p>
	<h3>MSXML3 ⇒ MSXML4 での変更点</h3>
	<p>
		MSXML3では、ハンドラに渡される文字列がヌル終端でしたが、MSXML4ではヌル終端でなくなったことに注意が必要です。
		同時に渡される文字数を参照する必要があります。
		C++からは激しく使いづらくなってしまいました。
	</p>
</div>

<h2 id="sample">例：XMLリソースローダー</h2>
<div>
	<a href="msxmlResource.zip">ソース＋プロジェクト</a>
	<p>
		外部XMLからメニュバーとキーボードアクセラレータを読み込むサンプル。
		エディタなどの「カスタマイズができてなんぼ」なアプリケーションに使うと、
		簡単に編集できて便利なんじゃないかと。
	</p>
</div>

<hr>
<!--#config timefmt="%Y/%m/%d"-->
<p align="right"><!--#echo var='LAST_MODIFIED'--></p>

</body>
</html>
