继我之前关于创建地址簿的问题之后(非常感谢Peter!),我有一个小小的丢弃控制台应用程序就是这样做并且工作得很好 - 但另外我正在尝试更新关键字的元数据使用创建的地址簿的项目ID。
略有缩短的片段......
StaticAddressBook ab = new StaticAddressBook();
ab.Title = title;
ab.Key = key;
ab.Save();
// id is a correct Keyword TCM ID
Keyword k = tdse.GetObject(id, EnumOpenMode.OpenModeEdit);
if (k != null)
{
k.MetadataFields["addressbookid"].value[0] = ab.Id.ItemId;
k.Save(true);
}
我在Save()上一直收到以下错误:
XML验证错误。原因:名称空间中的元素“元数据” 'uuid:2065d525-a365-4b45-b68e-bf45f0fba188'包含无效的子元素 命名空间中的'addressbookid' 'UUID:2065d525-a365-4b45-b68e-bf45f0fba188'。可能的元素列表 预期:名称空间中的“contact_us_email” 'UUID:2065d525-a365-4b45-b68e-bf45f0fba188'
但我知道Keyword分配了正确的元数据(这就是为什么我不打扰检查!)。从当前关键字中缩短Tridion XML:
<tcm:Keyword>
<tcm:Data>
<tcm:MetadataSchemaxlink:type="simple"xlink:title="IP.Location.Metadata" xlink:href="tcm:49-2142-8" />
<tcm:Metadata>
<Metadata xmlns="uuid:2065d525-a365-4b45-b68e-bf45f0fba188">
<email>...</email>
<addressbookid>3</addressbookid>
<contact_us_email>...</contact_us_email>
<request_a_sample_email>...</request_a_sample_email>
<webinar_feedback_email>....</webinar_feedback_email>
</Metadata>
</tcm:Metadata>
<tcm:IsRoot>true</tcm:IsRoot>
</tcm:Data>
</tcm:Keyword>
我错过了什么可以通过这种方式更新关键字元数据吗?
我想我可以查看核心服务来更新关键字,但在此应用程序中执行所有操作似乎都有意义。
更新
订单在这里很关键,奇怪! 以下代码有效:
ItemFields fields = k.MetadataFields;
System.Diagnostics.Debug.WriteLine(fields.Count);
string email = fields[1].value[1];
string contact = fields[3].value[1];
string request = fields[4].value[1];
string webinar = fields[5].value[1];
fields[1].value[1] = email;
fields[2].value[1] = ab.Id.ItemId;
fields[3].value[1] = contact;
fields[4].value[1] = request;
fields[5].value[1] = webinar;
k.Save(true);
获取/设置值时,非基于0的索引被捕获,并且必须按顺序重新分配现有字段。
干杯
答案 0 :(得分:2)
由于创建了Component,因此Schema中的字段顺序似乎已更改。至少Schema期望contact_us_email
位于您当前拥有addressbookid
的位置。
可能还有其他更改,因此我会在您运行工具之前验证架构中字段的顺序并确保组件匹配。