2

继我之前关于创建地址簿的问题(非常感谢彼得!)之后,我有一个小型的一次性控制台应用程序可以做到这一点并且工作得很好 - 但此外我正在尝试使用项目更新关键字的元数据创建的通讯簿的 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”中的元素“元数据”在命名空间“uuid:2065d525-a365-4b45-b68e-bf45f0fba188”中有无效的子元素“addressbookid”。预期的可能元素列表:命名空间“uuid:2065d525-a365-4b45-b68e-bf45f0fba188”中的“contact_us_email”

但我知道关键字分配了正确的元数据,(这就是我不费心检查的原因!)。从当前有问题的关键字中缩短 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 的索引捕获,并且必须按顺序重新分配现有字段。

干杯

4

1 回答 1

2

自从创建该组件以来,模式中字段的顺序似乎发生了变化。至少 Schema 期望contact_us_email在您当前拥有的位置addressbookid

可能还有其他更改,因此我会在运行工具之前验证架构中字段的顺序并确保组件匹配。

于 2012-06-13T08:18:53.277 回答