Todo arquivo/stream/etc XML deve começar com um caractere "

Todo arquivo/stream/etc XML deve começar com um caractere "

Estou fazendo algumas coisas de detecção de tipo de arquivo e queria lidar com a detecção de XML de forma mais robusta.

Adicionei suporte para um Unicode BOM (Byte Order Mark) inicial opcional seguido por um <caractere na codificação de 8 bits ou UTF-16.

(Este é apenas um teste inicial. Se o teste for aprovado, continuo tentando analisá-lo como XML, mas não faço isso a menos que se pareça com XML, pois consome mais recursos.)

Eu olhei para o padrão XML, mas o jargão estava ficando bastante complicado e não tenho certeza se segui todas as regras gramaticais corretamente, especialmente para os recursos mais esotéricos do XML. Não vi nada específico no padrão sobre com quais caracteres ele pode começar.

Em particular, não tenho certeza se é legal ou não que arquivos ou fluxos XML comecem com espaços em branco antes do primeiro<

Responder1

Uma entidade de documento deve sempre começar com "<", mas se não houver declaração XML, isso poderá ser precedido por um espaço em branco.

Uma entidade analisada externa não requer um "<" inicial. As entidades externas analisadas normalmente não são analisadas por si só, apenas quando referenciadas direta ou indiretamente a partir de uma referência de entidade em uma entidade de documento.

A especificação não é tão complicada.

[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)+

deixa bem claro que se o XMLDecl estiver ausente, o documento poderá começar com Misc, que inclui a opção de espaço em branco. No entanto, XMLDecl, doctypedecl, element, Commente PItodos começam com " <".

informação relacionada