public static Node ParseXmlDocument(Lexer lexer)
{
Node document = lexer.NewNode();
document.Type = Node.ROOT_NODE;
Node doctype = null;
lexer.Options.XmlTags = true;
while (true)
{
Node node = lexer.GetToken(Lexer.IGNORE_WHITESPACE);
if (node == null)
{
break;
}
/* discard unexpected end tags */
if (node.Type == Node.END_TAG)
{
Report.Warning(lexer, null, node, Report.UNEXPECTED_ENDTAG);
continue;
}
/* deal with comments etc. */
if (Node.InsertMisc(document, node))
{
continue;
}
if (node.Type == Node.DOC_TYPE_TAG)
{
if (doctype == null)
{
Node.InsertNodeAtEnd(document, node);
doctype = node;
}
else
{
Report.Warning(lexer, document, node, Report.DISCARDING_UNEXPECTED);
}
// TODO
continue;
}
/* if start tag then parse element's content */
if (node.Type == Node.START_TAG)
{
Node.InsertNodeAtEnd(document, node);
ParseXmlElement(lexer, node, Lexer.IGNORE_WHITESPACE);
}
}
if (doctype != null && !lexer.CheckDocTypeKeyWords(doctype))
{
Report.Warning(lexer, doctype, null, Report.DTYPE_NOT_UPPER_CASE);
}
/* ensure presence of initial <?XML version="1.0"?> */
if (lexer.Options.XmlPi)
{
lexer.FixXmlPi(document);
}
return document;
}