public static Node parseXMLDocument(Lexer lexer) { Node node, document, doctype; document = lexer.NewNode(); document.Type = Node.RootNode; doctype = null; lexer.Options.XmlTags = true; while (true) { node = lexer.GetToken(Lexer.IgnoreWhitespace); if (node == null) { break; } /* discard unexpected end tags */ if (node.Type == Node.EndTag) { Report.Warning(lexer, null, node, Report.UNEXPECTED_ENDTAG); continue; } /* deal with comments etc. */ if (Node.InsertMisc(document, node)) { continue; } if (node.Type == Node.DocTypeTag) { 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.StartTag) { Node.InsertNodeAtEnd(document, node); parseXMLElement(lexer, node, Lexer.IgnoreWhitespace); } } 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; }