internal bool ParseReaderNode()
{
if (reader.Depth > markupDepth)
{
if (writer != null) // ProcessMarkup
{
switch (reader.NodeType)
{
case XmlNodeType.Element:
writer.WriteStartElement(reader.Prefix, reader.LocalName, reader.NamespaceURI);
writer.WriteAttributes(reader, false);
if (reader.IsEmptyElement)
{
writer.WriteEndElement();
}
break;
case XmlNodeType.Text:
writer.WriteString(reader.Value);
break;
case XmlNodeType.SignificantWhitespace:
writer.WriteWhitespace(reader.Value);
break;
case XmlNodeType.CDATA:
writer.WriteCData(reader.Value);
break;
case XmlNodeType.EntityReference:
writer.WriteEntityRef(reader.Name);
break;
case XmlNodeType.Comment:
writer.WriteComment(reader.Value);
break;
case XmlNodeType.EndElement:
writer.WriteFullEndElement();
break;
}
}
return(true);
}
if (reader.NodeType == XmlNodeType.Element)
{
if (builder.ProcessElement(reader.Prefix, reader.LocalName, reader.NamespaceURI))
{
namespaceManager.PushScope();
if (reader.MoveToFirstAttribute())
{
do
{
builder.ProcessAttribute(reader.Prefix, reader.LocalName, reader.NamespaceURI, reader.Value);
if (Ref.Equal(reader.NamespaceURI, schemaNames.NsXmlNs) && isProcessNamespaces)
{
namespaceManager.AddNamespace(reader.Prefix == string.Empty ? string.Empty : reader.LocalName, reader.Value);
}
}while (reader.MoveToNextAttribute());
reader.MoveToElement(); // get back to the element
}
builder.StartChildren();
if (reader.IsEmptyElement)
{
namespaceManager.PopScope();
builder.EndChildren();
}
else if (!builder.IsContentParsed())
{
markupDepth = reader.Depth;
stringWriter = new StringWriter();
writer = new XmlTextWriter(stringWriter);
writer.WriteStartElement(reader.LocalName);
}
}
else if (!reader.IsEmptyElement)
{
markupDepth = reader.Depth;
writer = null;
}
}
else if (reader.NodeType == XmlNodeType.Text ||
reader.NodeType == XmlNodeType.EntityReference ||
reader.NodeType == XmlNodeType.SignificantWhitespace ||
reader.NodeType == XmlNodeType.CDATA)
{
builder.ProcessCData(reader.Value);
}
else if (reader.NodeType == XmlNodeType.EndElement)
{
if (reader.Depth == markupDepth)
{
if (writer != null) // processUnparsedContent
{
writer.WriteEndElement();
writer.Close();
writer = null;
XmlDocument doc = new XmlDocument();
doc.Load(new XmlTextReader(new StringReader(stringWriter.ToString())));
XmlNodeList list = doc.DocumentElement.ChildNodes;
XmlNode[] markup = new XmlNode[list.Count];
for (int i = 0; i < list.Count; i++)
{
markup[i] = list[i];
}
builder.ProcessMarkup(markup);
namespaceManager.PopScope();
builder.EndChildren();
}
markupDepth = int.MaxValue;
}
else
{
namespaceManager.PopScope();
builder.EndChildren();
}
if (reader.Depth == schemaXmlDepth)
{
return(false); // done
}
}
return(true);
}