Skip to content

Instantly share code, notes, and snippets.

@jimmywim
Last active June 3, 2024 08:47
Show Gist options
  • Save jimmywim/450d6e29d86101b3760d3d51a7dcf5b0 to your computer and use it in GitHub Desktop.
Save jimmywim/450d6e29d86101b3760d3d51a7dcf5b0 to your computer and use it in GitHub Desktop.
.net core code to read a SharePoint SPPKG file
using System;
using System.Collections.Generic;
using System.Linq;
using MSPackage = System.IO.Packaging;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
namespace Jimmywim.SharePoint.Packaging
{
public class SPFxComponent
{
public string Name { get; set; } = string.Empty;
public string Type { get; set; } = string.Empty;
public string Id { get; set; } = string.Empty;
}
public class SPFxPackage
{
public string Name { get; set; }
public Version Version { get; set; }
public string ProductId { get; set; }
public List<SPFxComponent> Components { get; set; } = new List<SPFxComponent>();
public static SPFxPackage LoadPackage(string path)
{
using var package = System.IO.Packaging.Package.Open(path);
return ParsePackage(package);
}
public static SPFxPackage LoadPackage(byte[] packageBytes)
{
using var memorystream = new System.IO.MemoryStream(packageBytes);
using var package = MSPackage.Package.Open(memorystream);
return ParsePackage(package);
}
private static SPFxPackage ParsePackage(MSPackage.Package package)
{
XNamespace spNs = "http://schemas.microsoft.com/sharepoint/";
SPFxPackage spfxPackage = new SPFxPackage();
var rels = package.GetRelationshipsByType("http://schemas.microsoft.com/sharepoint/2012/app/relationships/package-manifest");
if (rels.Any())
{
var manifestRel = rels.First();
var packagePart = package.GetPart(manifestRel.TargetUri);
using var partStream = packagePart.GetStream();
XDocument xDoc = XDocument.Load(partStream);
var appElem = xDoc.Root;
var packageName = appElem.Attribute("Name").Value;
var packageId = appElem.Attribute("ProductID").Value;
var packageVersion = appElem.Attribute("Version").Value;
var packageRelationships = packagePart.GetRelationships();
foreach(var packageRel in packageRelationships)
{
var relPart = package.GetPart(packageRel.TargetUri);
using var relPartStream = relPart.GetStream();
XDocument relxDoc = XDocument.Load(relPartStream);
var features = relPart.GetRelationshipsByType("http://schemas.microsoft.com/sharepoint/2012/app/relationships/feature-elementmanifest");
foreach(var feature in features)
{
var featurePart = package.GetPart(feature.TargetUri);
using var featureStream = featurePart.GetStream();
XDocument featureXDoc = XDocument.Load(featureStream);
var componentXml = featureXDoc.Root.Element(spNs + "ClientSideComponent");
if (componentXml != null)
{
var componetName = componentXml.Attribute("Name").Value;
var componentId = componentXml.Attribute("Id").Value;
var componentType = componentXml.Attribute("Type").Value;
spfxPackage.Components.Add(new SPFxComponent
{
Name = componetName,
Id = componentId,
Type = componentType,
});
}
}
}
spfxPackage.Name = packageName;
spfxPackage.Version = new Version(packageVersion);
spfxPackage.ProductId = packageId;
return spfxPackage;
}
else
{
throw new ArgumentOutOfRangeException($"Package appears not to be an SPFx package");
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment