更新关键字元数据时的XML验证错误

时间:2012-06-13 07:56:09

标签: tridion

继我之前关于创建地址簿的问题之后(非常感谢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的索引被捕获,并且必须按顺序重新分配现有字段。

干杯

1 个答案:

答案 0 :(得分:2)

由于创建了Component,因此Schema中的字段顺序似乎已更改。至少Schema期望contact_us_email位于您当前拥有addressbookid的位置。

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