// Before we do anything we try to save the metadata information
using (Metadata metadata = new Metadata("input.zip"))
{
// Fetch all metadata properties from the file
var properties = metadata.FindProperties(p => true);
using(var writer = new XmlTextWriter("importedmetadata.xml", null))
{
writer.Formatting = Formatting.Indented;
writer.WriteStartDocument();
writer.WriteStartElement("Metadata");
foreach (var property in properties)
{
switch (property.Value.Type)
{
case MetadataPropertyType.Metadata:
// some way to export these
break;
case MetadataPropertyType.String:
case MetadataPropertyType.TimeSpan:
case MetadataPropertyType.Boolean:
case MetadataPropertyType.DateTime:
case MetadataPropertyType.Double:
case MetadataPropertyType.Empty:
case MetadataPropertyType.Guid:
case MetadataPropertyType.Integer:
case MetadataPropertyType.Long:
writer.WriteStartElement("Property");
writer.WriteAttributeString("Name", property.Name.ToString());
writer.WriteAttributeString("Type", property.Value.Type.ToString());
writer.WriteAttributeString("Value", property.Value.ToString());
writer.WriteEndElement();
break;
case MetadataPropertyType.MetadataArray:
// some way to export these
break;
case MetadataPropertyType.PropertyValueArray:
// some way to export these
break;
case MetadataPropertyType.ByteArray:
case MetadataPropertyType.DoubleArray:
case MetadataPropertyType.IntegerArray:
case MetadataPropertyType.LongArray:
case MetadataPropertyType.StringArray:
writer.WriteStartElement("Property");
writer.WriteAttributeString("Name", property.Name.ToString());
writer.WriteAttributeString("Type", property.Value.Type.ToString());
IEnumerable enumerable2 = property.Value.RawValue as IEnumerable;
foreach (var value in enumerable2)
{
writer.WriteStartElement("Value");
writer.WriteAttributeString("Value", value.ToString());
writer.WriteEndElement();
}
writer.WriteEndElement();
break;
}
}
writer.WriteEndElement();
}
}
// Work on files in zip
// Zip again
using (Metadata metadata = new Metadata(zipPath))
{
// Fetch all metadata properties from the file
var properties = metadata.FindProperties(p => true);
// Remove properties
foreach (var property in properties.ToList())
{
metadata.RemoveProperties(p => p.Name == property.Name);
}
// Process the xml above
using (var reader = new XmlTextReader("importedmetadata.xml"))
{
while (reader.Read())
{
if (reader.LocalName == "Property")
{
var name = reader.GetAttribute("Name");
var type = reader.GetAttribute("Type");
if (reader.IsEmptyElement)
{
var value = reader.GetAttribute("Value");
AddMetadataWithType(metadata, value, type, name);
}
else
{
reader.Read();
var list = new List<string>();
while (reader.NodeType != XmlNodeType.EndElement)
{
if (reader.LocalName == "Value")
{
var value = reader.GetAttribute("Value");
list.Add(value);
}
reader.Read();
}
AddMetadataListWithType(metadata, list, type, name);
}
}
}
}
metadata.Save("output.zip");
}
For further understandability: there are certain zip types like Adobe’s .xd, where some specific metadata is added. I want to export this information(without knowing what these properties actually are or mean) so the exported .xd(for example) can be opened with Adobe. The method above I tried might be wrong, my main question is: Is there a way to save all the metadata information as it is, do some work then compress and add them back again as they were?