我正在做一些文件類型檢測工作,並且希望更可靠地處理 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
<