#?SuikaWiki/0.9 [[#comment]] * 実体値についての MSXML の挙動 [1] > なぜ実際に amp や lt を参照したわけでもないのにエラーになったのか、ということ。「ライン 1、位置 2」という表示もしっくりこないものがありますし、もしかすると MSXML は内部的に何らかの XML を利用していて、その中で amp への参照が現れてエラーになったのかなぁ…などと思ったり。 ([[マーク付けノート]] ― M12N のバグと MSXML ) という話が気になったので、 [[MSXML]] の挙動を調べてみました。 環境は [[WinXP]] + [[WinIE]] 6.0 です。 WinIE に XML 文書を与えると、 = [[前書き]]を構文解析 = [[一般実体]]の実体値を[[内容]]として構文解析 = [[文書実現値]]以降を構文解析 という順序で処理を進めるようです。 前書きと文書実現値の境目は、最初に [CODE(SGML)[[[stago]]]] の文字に遭遇する手前のようです。 ([CODE(SGML)[stago]] の文字の直後が[[名前開始文字]]でなくてもその時点では何も言われません。ただし、 [CODE(char)[!]] や [CODE(char)[?]] や [CODE(char)[/]] が直後に来ると文句を言われます。) 実体値の構文解析の段階では、 参照の有無にかかわらず (そもそも文書実現値はまだ処理していない)、 重複していないすべての一般実体宣言を処理しています。 [WEAK[(たぶんこの時点で[[グローブ]]を作ってしまうのでしょう。)]] [[名前]]の重複により無視される一般実体宣言は無視されますが、 [[定義済み文字実体]]は特別扱いされません。また、[[内部実体]]と[[外部実体]]も扱いに違いはありません。 ですから、一般実体の実体値 [WEAK[(同じ名前の宣言が複数ある時は、最初のもの。)]] を内容として構文解析した時に不適当な文字列が含まれていると、誤りが発生します。 このとき、 > 無効な文字で名前が始まりました。リソース 'http://www.satoshii.org/markup/samp/2003/xhtml11-msxml-m12n' の実行エラーです。ライン 1、位置 2 > && のようなメッセージがブラウザに表示されますが、 - [[URI]] は必ず[[文書実体]]のものとなる - 文字の位置が実体値の先頭を起点としたものであることが示されていない という間抜けな仕様になっている模様です。 このメッセージの場合は、元凶が XHTML m12n の[[実体集合]]中にある [PRE[ ]PRE] という記述なのですが、 この実体宣言を解釈して得られる実体値は [CODE[&&]] です。 これを構文解析すると、 [CODE(char)[&]] の直後 (つまり[Q[ライン 1、位置 2]]) には名前開始文字が要求されるというわけです。 [WEAK[([[著者]]に直接見えるソース上の位置ではなく、構文解析結果である実体値上の位置なんて示されても困るのですけど、手抜きしたい気持ちはよくわかります。。。)]] - [2] で、参照してもいない実体の中身を勝手に構文解析しちゃうのってどうなんでしょう。