Today I’m dealing with task to copy Sharepoint Web and SubWebs to the same server with selective data where SubWebs contains no ListItems.
After exporting a Web and Subwebs with option FileCompression = false, it created a 282MB large Manifest.xml.
I have tried to open it using Notepad++ It was so slow that I had to kill process to continue work, next opened with VS2010 that was much better, but to manually remove lines would take ages.
So I googled for another solution and found few programs that could manage large xml. 010Editor, XMLSpy, didn’t try any of them.
After 2 hours of searching for solution I wrote program in .NET that did it very well and took only 4 minutes to complete.
public static void StreamCustomerItem(string uri)
{ using (XmlReader reader = XmlReader.Create(uri)) { XmlWriterSettings xws = new XmlWriterSettings(); xws.OmitXmlDeclaration = true; xws.Indent = true; xws.CheckCharacters = false;using (XmlWriter xw = XmlWriter.Create("Manifest.xml", xws))
{ XElement name = null; while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element:if (reader.Name == "SPObject")
{ name = XElement.ReadFrom(reader) as XElement;if (name.Attribute(XName.Get("ObjectType")).Value == "SPListItem")
{//Excluding unwanted content
if (name.Attribute(XName.Get("ParentWebUrl")).Value.StartsWith("/SubwebUrl/")) continue;
}
name.WriteTo(xw);
break;}
xw.WriteStartElement(reader.Prefix, reader.LocalName, reader.NamespaceURI);
xw.WriteAttributes(reader, true); if (reader.IsEmptyElement) {xw.WriteEndElement();
}
break; case XmlNodeType.Text:xw.WriteString(reader.Value);
break; case XmlNodeType.Whitespace: case XmlNodeType.SignificantWhitespace:xw.WriteWhitespace(reader.Value);
break; case XmlNodeType.CDATA:xw.WriteCData(reader.Value);
break; case XmlNodeType.EntityReference:xw.WriteEntityRef(reader.Name);
break; case XmlNodeType.XmlDeclaration: case XmlNodeType.ProcessingInstruction:xw.WriteProcessingInstruction(reader.Name, reader.Value);
break; case XmlNodeType.DocumentType:xw.WriteDocType(reader.Name, reader.GetAttribute("PUBLIC"), reader.GetAttribute("SYSTEM"), reader.Value);
break; case XmlNodeType.Comment:xw.WriteComment(reader.Value);
break; case XmlNodeType.EndElement:xw.WriteFullEndElement();
break;}
}
}
}
}
Thanks to:
MSDN
MSDN Mark Fussell's WebLog
No comments:
Post a Comment