【发布时间】:2012-06-13 07:56:08
【问题描述】:
继我之前关于创建地址簿的问题(非常感谢彼得!)之后,我有一个小型的一次性控制台应用程序可以做到这一点并且运行良好 - 但此外我正在尝试更新关键字的元数据使用创建的通讯簿的项目 ID。
稍微缩短的 sn-p ...
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' 具有无效的子元素 命名空间中的“地址簿ID” 'uuid:2065d525-a365-4b45-b68e-bf45f0fba188'。可能的元素列表 预期:命名空间中的“contact_us_email” 'uuid:2065d525-a365-4b45-b68e-bf45f0fba188'
但我知道关键字分配了正确的元数据,(这就是我不费心检查的原因!)。从当前有问题的关键字缩短 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 的索引发现,不得不按顺序重新分配现有字段。
干杯
【问题讨论】:
-
几乎回复“使用 ItemFields,它会为你处理”...然后注意到您正在使用 TDSE...尝试打开/保存和关闭关键字,然后再试一次?跨度>
标签: tridion