
私はファイルタイプの検出をいくつか行っており、XML 検出をより堅牢に処理したいと考えていました。
オプションの最初の Unicode BOM (バイト オーダー マーク) とそれに続く<
8 ビットまたは UTF-16 エンコードの文字のサポートを追加しました。
(これは単なる初期テストです。このテストに合格したら、XML として解析してみますが、リソースを大量に消費するため、XML のように見えない限りは解析しません。)
XML 標準を調べましたが、専門用語がかなり複雑になってきていて、特に XML のより難解な機能については、すべての文法規則に適切に従っているかどうかわかりません。ただし、標準では、どの文字で始まることができるかについては何も具体的には示されていませんでした。
特に、XMLファイルやストリームの最初の行に空白文字を置くことが合法かどうかはわかりません。<
答え1
ドキュメント エンティティは常に "<" で始まる必要がありますが、XML 宣言がない場合は、その前に空白文字を置くことができます。
外部解析エンティティには、先頭の「<」は必要ありません。外部解析エンティティは通常、単独では解析されず、ドキュメント エンティティ内のエンティティ参照から直接または間接的に参照される場合にのみ解析されます。
仕様は実際にはそれほど複雑ではありません。
[1] document ::= prolog element Misc*
[22] prolog ::= XMLDecl? Misc* (doctypedecl Misc*)?
[23] XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>'
[27] Misc ::= Comment | PI | S
[3] S ::= (#x20 | #x9 | #xD | #xA)+
XMLDecl が存在しない場合は、ドキュメントが Misc で始まる可能性があり、これには空白のオプションが含まれることが明確に示されています。ただし、、、、、XMLDecl
およびdoctypedecl
はelement
すべてComment
" "PI
で始まります<
。