使用SDL Tridion 2011中的核心服务更新组件

Pat*_*tan 2 tridion

我正在使用Tridion 2011中的核心服务更新组件.

示例代码如下,

string COMPONENT_URI = "tcm:8-674";
string SCHEMA_URI = "tcm:8-426-8";

ComponentData component = client.TryCheckOut(COMPONENT_URI, null) as ComponentData;

try
{
    Response.Write("<BR>" + component.Content);
    XDocument xdoc = XDocument.Parse(component.Content);
    var element = xdoc.Elements("first").Single();
    element.Value = "updated";
    xdoc.Save(component.Content);
    client.Save(component, null);
    Response.Write("<BR"+"SAVED");
}
catch (Exception ex)
{
    Response.Write("Unable to save comp" + ex.Message);
}

client.CheckIn(COMPONENT_URI, null);
Run Code Online (Sandbox Code Playgroud)

我得到以下异常:

 Unable to save compSequence contains no elements 
Run Code Online (Sandbox Code Playgroud)

细节:

first - 组件中字段的名称

对此有任何帮助吗?

谢谢

Fra*_*len 12

Tridion中的Component的XML具有以下格式:

<Content xmlns="uuid:2607D20D-1B22-4994-98C1-66D9ACF85C20">
  <first>The value of my first field</first>
  <second>The value of my second field</second>
</Content>
Run Code Online (Sandbox Code Playgroud)

您的相关代码段是:

var element = xdoc.Elements("first").Single();
Run Code Online (Sandbox Code Playgroud)

这无法选择元素,因为它是:

  1. 没有为选择提供命名空间
  2. 仅选择文档根目录的直接子项

您似乎期望在未指定命名空间时自动选择默认命名空间,但这不是真的.只要您拥有处理命名空间的XML,每个查询都必须指定正确的命名空间.

如果你修改代码来处理这两个问题,它应该是这样的:

XNamespace ns = xdoc.Root.GetDefaultNamespace();
var element = xdoc.Descendants(ns+"first").Single();
Run Code Online (Sandbox Code Playgroud)

您可能想要考虑阅读XML中的命名空间的.NET处理和一般的XML命名空间,因为这是一个非常常见的错误,您只需要快速离开系统.

在您发现此处给出的帮助程序类有用之前,想要通过核心服务更新组件XML的人.

此外,Mihai指出你调用的方式XDocument.Save是错误的.它希望将文件名作为参数,同时将组件的XML传递给它.