Esempio n. 1
0
        /// <summary>
        /// WriteRaw writes out the given string "unescaped", in other words it better be well formed XML markup.
        /// So for the XmlNodeWriter we parse this string and build the resulting tree, so it maps to setting the
        /// InnerXml property.
        /// </summary>
        /// <param name="data"></param>
        public override void WriteRaw(string data)
        {
            if (data.IndexOf("<") < 0)
            {
                WriteString(data);
                return;
            }

            switch (state)
            {
            case WriteState.Start:
                goto case WriteState.Content;

            case WriteState.Prolog:
                goto case WriteState.Content;

            case WriteState.Element:
                state = WriteState.Content;
                goto case WriteState.Content;

            case WriteState.Attribute:
            {
                ArrayList saved = new ArrayList();
                if (ca.HasChildNodes)
                {
                    while (ca.FirstChild != null)
                    {
                        saved.Add(ca.FirstChild);
                        ca.RemoveChild(ca.FirstChild);
                    }
                }
                ca.InnerXml = data;
                for (int i = saved.Count - 1; i >= 0; i--)
                {
                    ca.PrependChild((XmlNode)saved[i]);
                }
            }
            break;

            case WriteState.Content:
            {
                ArrayList saved = new ArrayList();
                if (current.HasChildNodes)
                {
                    while (current.FirstChild != null)
                    {
                        saved.Add(current.FirstChild);
                        current.RemoveChild(current.FirstChild);
                    }
                }
                current.InnerXml = data;
                for (int i = saved.Count - 1; i >= 0; i--)
                {
                    current.PrependChild((XmlNode)saved[i]);
                }
                state = WriteState.Content;
            }
            break;

            case WriteState.Closed:
                throw new InvalidOperationException("Writer is closed");
            }
        }