使用MetaData-Extractor-Dotnet,我很难获得 Adobe 产品保存到 XMP 配置文件中的所有信息。
我需要将此元数据转换为标准 JSON 格式,以便在我的应用程序中使用,其中项目将始终位于不同版本的 Adobe 产品保存的不同 XMP 版本中的预期位置。例如,我需要知道 imageCreator 将始终是名称和类型的对象数组;或者 PersonInImage 将永远只是一个字符串数组。
因此,仅迭代所有属性并转换为普通的平面 json 对象并没有多大用处,因为名称(包括索引)将非常随机且无法被 json 的最终使用者使用。
我正在使用来自 Wiki 的代码:
foreach (var xmpDirectory in directories.OfType<XmpDirectory>())
{
foreach (var property in xmpDirectory.XmpMeta.Properties)
{
Console.WriteLine($"{property.Path}: {property.Value}");
}
}
然而,它没有返回一些元素,这些元素是信息的“属性”的“数组”(我认为 XMP 将这些称为复合属性)。
下面是 XMP RDF 配置文件中信息数组的示例:
<plus:ImageCreator>
<rdf:Seq>
<rdf:li plus:ImageCreatorName="Guy NoName" plus:ImageCreatorID="Producer" />
<rdf:li plus:ImageCreatorName="John SillyMan" plus:ImageCreatorID="Cameraman" />
</rdf:Seq>
</plus:ImageCreator>
到目前为止,这是我的代码:
foreach (var xmpDirectory in directories.OfType<XmpDirectory>())
{
foreach (var property in xmpDirectory.XmpMeta.Properties)
{
if( property.Options.IsArray )
{
int count = xmpDirectory.XmpMeta.CountArrayItems( property.Namespace, property.Path );
for( var p = 0; p < count; p++ )
{
var item = xmpDirectory.XmpMeta.GetArrayItem( property.Namespace, property.Path, p + 1 );
if( item.Options.IsCompositeProperty )
{
// THIS IS WHERE I AM STUCK
}
else
{
Console.WriteLine( $"Item {p}: {item.Value}" );
}
}
}
else
{
Console.WriteLine($"{property.Path}: {property.Value}");
}
}
}
有人可以告诉我是否可能吗?