XML Grammar

document → prolog element (misc)*
char → [\t\n\r -\xd7ff\xe000-\xfffd\x10000-\x10ffff]
s → [ \t\r\n]+
name‑start‑char → [:A-Z_a-z\xc0-\xd6\xd8-\xf6\xf8-\x2ff\x370-\x37d\x37f-\x1fff\x200c-\x200d\x2070-\x218f\x2c00-\x2fef\x3001-\xd7ff\xf900-\xfdcf\xfdf0-\xfffd\x10000-\xeffff]
name‑char → name‑start‑char | [-.0-9\xb7\x300-\x36f\x203f-\x2040]
name → name‑start‑char name‑char*
names → name ( name)*
nm‑token → name‑char+
nm‑tokens → nm‑token ( nm‑token)*
prolog → xml‑decl? misc* (doc‑type‑decl misc*)?
xml‑decl → <?xml version‑info encoding‑decl? sd‑decl? s? ?>
version‑info → s version eq version‑number
version‑num → 1 . [0-9]+
version‑num‑dq → \" version‑num \"
version‑num‑sq → \' version‑num \'
version‑number → version‑num‑dq | version‑num‑sq
encoding‑decl → s encoding eq enc‑name
encoding‑name → [A-Za-z] [A-Za-z0-9._-]*
enc‑name‑dq → \" encoding‑name \"
enc‑name‑sq → \' encoding‑name \'
enc‑name → enc‑name‑dq | enc‑name‑sq
sd‑decl → s standalone eq yes‑no
doc‑type‑decl → <!DOCTYPE s name (s external‑id)? s? ([ int‑subset ] s?)? >
external‑id → (SYSTEM s system‑literal) | (PUBLIC s pub‑id‑literal s system‑literal)
system‑literal → (\" ([^\"]*) \") | (\' ([^\']*) \')
pub‑id‑literal → \" (pub‑id‑char*) \" | \' ((pub‑id‑char − \')*) \'
pub‑id‑char → [ \r\n] | [a-zA-Z0-9] | [-\'()+,./:=?;!*#@$_%]
int‑subset → (markup‑decl | decl‑sep)*
markup‑decl → element‑decl | attlist‑decl | entity‑decl | notation‑decl | pi | comment
decl‑sep → pe‑reference | s
element‑decl → <!ELEMENT s name s content‑spec s? >
content‑spec → EMPTY | ANY | mixed | children
children → (choice | seq) (? | * | +)?
cp → (name | choice | seq) (? | * | +)?
choice → ( s? cp (s? | s? cp)+ s? )
seq → ( s? cp (s? , s? cp)* s? )
mixed → ( s? #PCDATA (s? | s? name)* s? )* | ( s? #PCDATA s? )
attlist‑decl → <!ATTLIST s name att‑def* s? >
att‑def → s name s att‑type s default‑decl
att‑type → string‑type | tokenized‑type | enumerated‑type
string‑type → CDATA
tokenized‑type → ID | IDREF | IDREFS | ENTITY | ENTITIES | NMTOKEN | NMTOKENS
enumerated‑type → notation‑type | enumeration
notation‑type → NOTATION s ( s? name (s? | s? name)* s? )
enumeration → ( s? nm‑token (s? | s? nm‑token)* s? )
default‑decl → #REQUIRED | #IMPLIED | ((#FIXED s)? att‑value)
entity‑decl → ge‑decl | pe‑decl
ge‑decl → <!ENTITY s name s entity‑def s? >
pe‑decl → <!ENTITY s % s name s pe‑def s? >
entity‑def → entity‑value | (external‑id ndata‑decl?)
pe‑def → entity‑value | external‑id
entity‑value → \" ([^%&\"] | pe‑reference | reference)* \" | \' ([^%&\'] | pe‑reference | reference)* \'
ndata‑decl → s NDATA s name
pe‑reference → % name ;
notation‑decl → <!NOTATION s name s (external‑id | public‑id) s? >
public‑id → PUBLIC s pub‑id‑literal
element → < name (s attribute)* s? (/> | > content etag)
etag → </ name s? >
content → char‑data? ((element | reference | cd‑sect | pi | comment) char‑data?)*
char‑data‑char → [^<&]
char‑data → char‑data‑char* − ([^<&]* ]]> [^<&]*)
cd‑sect → <![CDATA[ char − ]]>* ]]>
attribute → name eq att‑value
att‑value‑dq → \" ([^<&\"] | reference)* \"
att‑value‑sq → \' ([^<&\'] | reference)* \'
att‑value → att‑value‑dq | att‑value‑sq
entity‑ref → & name ;
dec‑code‑point → [0-9]+
hex‑code‑point → [0-9a-fA-F]+
char‑ref → &# dec‑code‑point ; | &#x hex‑code‑point ;
reference → entity‑ref | char‑ref
misc → comment | pi | s
comment → <!-- (char − - | - char − -)* -->
pi → <? pi‑target s char − ?>* ?>
pi‑target → name − xml
xml → [xX] [mM] [lL]
eq → s? = s?
yes‑no → \"yes\" | \"no\"