public static void SetPersonalizationFromXml(HttpContext context, Page pageNode, XmlDocument xml, out string errorMessage) { string error = String.Empty; string virtualPath = CreateVirtualPath(pageNode.Path); PageBase page = InstantiatePage(context, virtualPath, pageNode); page.PreLoad += delegate { WebPartManager wpm = WebPartManager.GetCurrentWebPartManager(page); WebPartZoneCollection webPartZones = wpm.Zones; foreach (WebPartZone zone in webPartZones) { foreach (WebPart part in zone.WebParts) { if (!part.IsStatic) { wpm.DeleteWebPart(part); } } XmlNode zoneDescriptionNode = xml.SelectNodes(@"//*[@id='" + zone.ID + "']")[0]; XmlElement zoneDescription = zoneDescriptionNode as XmlElement; if (zoneDescription != null) { foreach (XmlElement webPartDescription in zoneDescription.GetElementsByTagName("webPart")) { string webPartXml = String.Empty; using (StringWriter sw = new StringWriter()) { using (XmlWriter writer = new XmlTextWriter(sw)) { writer.WriteStartElement("webParts"); webPartDescription.WriteTo(writer); writer.WriteEndElement(); writer.Flush(); } webPartXml = sw.ToString(); } using (StringReader sr = new StringReader(webPartXml)) { using (XmlReader reader = new XmlTextReader(sr)) { WebPart part = wpm.ImportWebPart(reader, out error); wpm.AddWebPart(part, zone, zone.WebParts.Count); } } } } } }; //TODO: Clever exception handling ExecutePage(context, virtualPath, page, pageNode, true); errorMessage = error; }