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;
                }
            }
        }
Exemplo n.º 2
0
        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();
            }
        }