Thursday, December 30, 2010

Large Xml, Sharepoint Export file Manifest.xml

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