in src/Model/DomLoader.cs [73:194]
private void LoadDocument()
{
bool preserveWhitespace = false;
XmlReader r = this._reader;
XmlNode parent = this._doc;
XmlElement element;
while (r.Read())
{
XmlNode node = null;
switch (r.NodeType)
{
case XmlNodeType.Element:
bool fEmptyElement = r.IsEmptyElement;
element = _doc.CreateElement(r.Prefix, r.LocalName, r.NamespaceURI);
AddToTable(element);
element.IsEmpty = fEmptyElement;
ReadAttributes(r, element);
if (!fEmptyElement)
{
parent.AppendChild(element);
parent = element;
continue;
}
node = element;
break;
case XmlNodeType.EndElement:
if (parent.ParentNode == null)
{
// syntax error in document.
IXmlLineInfo li = (IXmlLineInfo)r;
throw new XmlException(string.Format(Strings.UnexpectedToken,
"</" + r.LocalName + ">", li.LineNumber, li.LinePosition), null, li.LineNumber, li.LinePosition);
}
parent = parent.ParentNode;
continue;
case XmlNodeType.EntityReference:
if (r.CanResolveEntity)
{
r.ResolveEntity();
}
continue;
case XmlNodeType.EndEntity:
continue;
case XmlNodeType.Attribute:
node = LoadAttributeNode();
break;
case XmlNodeType.Text:
node = _doc.CreateTextNode(r.Value);
AddToTable(node);
break;
case XmlNodeType.SignificantWhitespace:
node = _doc.CreateSignificantWhitespace(r.Value);
AddToTable(node);
break;
case XmlNodeType.Whitespace:
if (preserveWhitespace)
{
node = _doc.CreateWhitespace(r.Value);
AddToTable(node);
break;
}
else
{
continue;
}
case XmlNodeType.CDATA:
node = _doc.CreateCDataSection(r.Value);
AddToTable(node);
break;
case XmlNodeType.XmlDeclaration:
node = LoadDeclarationNode();
break;
case XmlNodeType.ProcessingInstruction:
node = _doc.CreateProcessingInstruction(r.Name, r.Value);
AddToTable(node);
if (string.IsNullOrEmpty(this.xsltFileName) && r.Name == "xml-stylesheet")
{
this.xsltFileName = ParseXsltArgs(((XmlProcessingInstruction)node).Data);
}
else if (string.IsNullOrEmpty(this.xsltDefaultOutput) && r.Name == "xsl-output")
{
this.xsltDefaultOutput = ParseXsltOutputArgs(((XmlProcessingInstruction)node).Data);
}
break;
case XmlNodeType.Comment:
node = _doc.CreateComment(r.Value);
AddToTable(node);
break;
case XmlNodeType.DocumentType:
{
string pubid = r.GetAttribute("PUBLIC");
string sysid = r.GetAttribute("SYSTEM");
node = _doc.CreateDocumentType(r.Name, pubid, sysid, r.Value);
break;
}
default:
UnexpectedNodeType(r.NodeType);
break;
}
Debug.Assert(node != null);
Debug.Assert(parent != null);
if (parent != null)
{
parent.AppendChild(node);
}
}
}