/// <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"); } }