1

使用MetaData-Extractor-Dotnet,我很难获得 Adob​​e 产品保存到 XMP 配置文件中的所有信息。

我需要将此元数据转换为标准 JSON 格式,以便在我的应用程序中使用,其中项目将始终位于不同版本的 Adob​​e 产品保存的不同 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}");
        }
    }
}

有人可以告诉我是否可能吗?

4

0 回答 0