
Я занимаюсь определением типов файлов и хотел бы более надежно обрабатывать определение XML.
Я добавил поддержку необязательного начального Unicode BOM (Byte Order Mark), за которым следует <
символ в 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
все начинаются с " <
".