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