public virtual void WriteNode (XmlReader reader, bool defattr)
{
if (reader == null)
throw new ArgumentException ();
if (reader.ReadState == ReadState.Initial) {
reader.Read ();
do {
WriteNode (reader, defattr);
} while (!reader.EOF);
return;
}
switch (reader.NodeType) {
case XmlNodeType.Element:
WriteStartElement (reader.Prefix, reader.LocalName, reader.NamespaceURI);
#if false
WriteAttributes (reader, defattr);
reader.MoveToElement ();
#else
// Well, I found that MS.NET took this way, since
// there was a error-prone SgmlReader that fails
// MoveToNextAttribute().
if (reader.HasAttributes) {
for (int i = 0; i < reader.AttributeCount; i++) {
reader.MoveToAttribute (i);
WriteAttribute (reader, defattr);
}
reader.MoveToElement ();
}
#endif
if (reader.IsEmptyElement)
WriteEndElement ();
else {
int depth = reader.Depth;
reader.Read ();
if (reader.NodeType != XmlNodeType.EndElement) {
do {
WriteNode (reader, defattr);
} while (depth < reader.Depth);
}
WriteFullEndElement ();
}
break;
// In case of XmlAttribute, don't proceed reader, and it will never be written.
case XmlNodeType.Attribute:
return;
case XmlNodeType.Text:
WriteString (reader.Value);
break;
case XmlNodeType.CDATA:
WriteCData (reader.Value);
break;
case XmlNodeType.EntityReference:
WriteEntityRef (reader.Name);
break;
case XmlNodeType.XmlDeclaration:
// LAMESPEC: It means that XmlWriter implementation _must not_ check
// whether PI name is "xml" (it is XML error) or not.
case XmlNodeType.ProcessingInstruction:
WriteProcessingInstruction (reader.Name, reader.Value);
break;
case XmlNodeType.Comment:
WriteComment (reader.Value);
break;
case XmlNodeType.DocumentType:
WriteDocType (reader.Name,
reader ["PUBLIC"], reader ["SYSTEM"], reader.Value);
break;
case XmlNodeType.SignificantWhitespace:
goto case XmlNodeType.Whitespace;
case XmlNodeType.Whitespace:
WriteWhitespace (reader.Value);
break;
case XmlNodeType.EndElement:
WriteFullEndElement ();
break;
case XmlNodeType.EndEntity:
break;
case XmlNodeType.None:
break; // Do nothing, nor reporting errors.
default:
throw new XmlException ("Unexpected node " + reader.Name + " of type " + reader.NodeType);
}
reader.Read ();
}