
저는 파일 형식 감지 작업을 수행 중이며 XML 감지를 보다 강력하게 처리하고 싶었습니다.
<
선택적 초기 유니코드 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
모두 " <
"로 시작합니다.