private void LoadReader(Sgml.SgmlReader reader) { while (reader.Read()) { switch (reader.NodeType) { case System.Xml.XmlNodeType.Element: HandleElementStart(reader); break; case System.Xml.XmlNodeType.EndElement: HandleElementEnd(reader); break; case System.Xml.XmlNodeType.Text: HandleText(reader); break; } } }
private XmlDocument XmlFromSgml(TextReader textReader) { Stack <string> stack = new Stack <string>(); TextWriter logWriter = new StringWriter(); try { Sgml.SgmlReader reader = new Sgml.SgmlReader(); reader.DocType = "HTML"; reader.WhitespaceHandling = WhitespaceHandling.All; reader.CaseFolding = Sgml.CaseFolding.ToLower; reader.InputStream = textReader; reader.ErrorLog = logWriter; StringWriter writer = new StringWriter(); XmlWriter xmlWriter = null; try { xmlWriter = new XmlTextWriter(writer); bool rootElement = true; string lastElementName = ""; while ((reader.Read()) && !reader.EOF) { switch (reader.NodeType) { case XmlNodeType.Element: try { xmlWriter.WriteStartElement(reader.LocalName); xmlWriter.WriteAttributes(reader, true); if (reader.IsEmptyElement) { xmlWriter.WriteEndElement(); lastElementName = ""; } else { lastElementName = reader.LocalName; } } catch (Exception exc) { logger.LogError(exc, lastElementName); } break; case XmlNodeType.Text: if (string.IsNullOrEmpty(lastElementName)) { string text = reader.Value; xmlWriter.WriteString(text); } else { if (rootElement) { rootElement = false; stack.Push("."); } else { xmlWriter.WriteElementString("value", reader.Value); xmlWriter.WriteEndElement(); stack.Push(lastElementName); } lastElementName = ""; } break; case XmlNodeType.EndElement: if (stack.Peek() == reader.LocalName) { stack.Pop(); break; } logger.LogTrace(reader.LocalName); try { xmlWriter.WriteEndElement(); lastElementName = ""; } catch (Exception exc) { logger.LogError(exc, lastElementName); } break; } } } finally { if (xmlWriter != null) { xmlWriter.Close(); } } string xml = writer.ToString(); XmlDocument doc = new XmlDocument(); doc.PreserveWhitespace = true; doc.LoadXml(xml); return(doc); } finally { string str = logWriter.ToString(); if (string.IsNullOrEmpty(str)) { logger.LogError(str); } logWriter.Dispose(); } }