使用核心服务时可选字段上的错误SynchronizeWithSchemaAndUpdate


3

我试图在具有嵌入式架构“Aaa”类型的多值可选字段“AAA”的架构上同步组件,该架构具有强制嵌入文本字段“BBB”和另一个可选嵌入字段“CCC”。

AAA - optional multi-value field on Embedded Schema 'Aaa' 
+-> BBB - mandatory single-value text field 
+-> CCC - optional single-value text field 

当我在架构上创建组件时,我不必为字段AAA输入任何值,也不会在组件XML中出现任何值。当我将相同的组件保存在CME中时,它可以成功保存。

我有一个核心服务的客户端执行Client.SynchronizeWithSchemaAndUpdate(tcmUri, SynchronizeOptions),其中客户端是使用basicHttp结合一个ICoreService对象,tcmUri是组件的TCMURI和SynchronizeOptions是new SynchronizeOptions { SynchronizeFlags = SynchronizeFlags.All };

上面的代码产生一个FaultException<CoreServiceFault>其消息内容如下:

{"XML validation error. Reason: The element 'AAA' in namespace 'Aaa' has incomplete 
content. List of possible elements expected: 'BBB' in namespace 'Aaa'."} 

为什么我收到此错误没有意义。字段AAA是可选的多值。只有嵌入字段BBB是强制性的,只有在可选嵌入字段CCC有值且必填字段BBB被省略时才应该抛出此错误。

所以我的问题是:发生了什么事?这是一个错误?有没有人看到过这个错误?

2

不幸的是,某些标志是“破坏性”的,意味着它们可以将完全有效的XML转变为无效的XML。下面的标志应该是安全的:

SynchronizeFlags.ApplyDefaultValuesForMissingMandatoryFields | 
SynchronizeFlags.Basic | 
SynchronizeFlags.ConvertFieldType | 
SynchronizeFlags.FixNamespace | 
SynchronizeFlags.RemoveAdditionalValues | 
SynchronizeFlags.RemoveUnknownFields; 

有下列标志有效的XML转换成XML无效:

SynchronizeFlags.ApplyDefaultValuesForMissingNonMandatoryFields 
SynchronizeFlags.ApplyFilterXsltToXhtmlFields 

希望我们将在以后的版本中得到一个不太自杀替代使用“全部”,但不幸的是,它并没有进入SDL Web 8版本。

  0

确实有效。 'SynchronizeFlags.ApplyDefaultValuesForMissingNonMandatoryFields'丢失时不会引发异常。感谢您的解释! 05 1月. 162016-01-05 18:31:19


2

我已经尝试并测试了上述场景,我可以看到组件同步成功发生。我进一步在嵌入式模式和模式字段中尝试了更多场景,并且所有方面似乎都工作正常。所以要回答你的问题 - 这不是API中的错误。

只是为了获得更多的知识,你可以仔细检查,或者可以三重检查,你正在同步传递SynchronizeFlags.All标志。另外,除了上述错误之外,日志中还有其他内容吗?

  0

我在3个不同的系统中试过我的代码,并且在所有这些系统中都有错误。似乎有一个解决方法 - 不使用SynchronizeFlags.All,而是使用除了SynchronizeFlags.ApplyDefaultValuesForMissingNonMandatoryFields之外的所有其他标志之间的按位或运算符。这是目前我唯一的解决方案。在添加SynchronizeFlags.ApplyDefaultValuesForMissingNonMandatoryFields的那一刻,抛出了异常。 05 1月. 162016-01-05 06:24:42

  0

这很奇怪 05 1月. 162016-01-05 06:47:41

  0

我自己没有仔细检查过它,但是'SF.All^SF.ApplyDefaultValuesForMissingNonMandatoryFields'应该给出与按位OR或所有其他标志相同的结果。 05 1月. 162016-01-05 19:14:18