2

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);

次の例外が発生しています:

 Unable to save compSequence contains no elements 

詳細:

first- コンポーネント内のフィールドの名前

これに関して誰も助けることができますか?

ありがとうございました

4

3 に答える 3

13

Tridion のコンポーネントの 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>

関連するコード スニペットは次のとおりです。

var element = xdoc.Elements("first").Single();

次の理由により、これは要素の選択に失敗しています。

  1. 選択に名前空間を提供していません
  2. ドキュメント ルートの直接の子のみを選択する

名前空間を指定しないと、デフォルトの名前空間が自動的に選択されることを期待しているようですが、これは正しくありません。名前空間を扱う XML があるとすぐに、すべてのクエリで正しい名前空間を指定する必要があります。

これら 2 つの問題に対処するためにコードを変更すると、次のようになります。

XNamespace ns = xdoc.Root.GetDefaultNamespace();
var element = xdoc.Descendants(ns+"first").Single();

XML での名前空間の .NET 処理と一般的な XML 名前空間について読むことを検討することをお勧めします。これは、システムからすぐに抜け出す必要がある非常によくある間違いであるためです。

ここで示したヘルパー クラスが役立つと思う前に、コア サービスを介してコンポーネント XML を更新したいと思っていた人。

また、Mihai が指摘するように、呼び出し方XDocument.Saveが間違っています。コンポーネントのXMLを渡している間、パラメータとしてファイル名が必要です。

于 2012-04-09T13:31:46.670 に答える
3

コードは、XML DOM をファイルに保存しようとします。

XDocument.Save(string fileName)- これXDocumentをファイルにシリアル化し、既存のファイルが存在する場合は上書きします。

次のようなものを使用する必要があります。

using (var client = new SessionAwareCoreServiceClient(netTcpBinding, remoteAddress))
{
    ReadOptions readOptions = new ReadOptions();
    ComponentData component = client.Read(compTcmUri, readOptions) as ComponentData;
    XDocument dom = XDocument.Parse(component.Content);
    // do your modifications to dom
    component.Content = dom.ToString();
    component = client.Update(component, readOptions) as ComponentData;

    Console.WriteLine("Component updated: " + component.LocationInfo.WebDavUrl);
}
于 2012-04-09T07:07:38.633 に答える
2

場合によっては、特にマスターとして機能する別のリポジトリからコンテンツを同期している場合は、コンポーネントを最初から再構築できます。その場合、これを行う方法の基本的な例を次に示します。

    public static void updateComponent()
    {
        string componentWdUrl = "/webdav/020%20Content/Building%20Blocks/Content/wstest/testComponent.xml";
        CoreServicesUtil coreServicesUtil = new CoreServicesUtil();
        coreServicesUtil.coreServiceClient.CheckOut(componentWdUrl, true, coreServicesUtil.readOptions);
        ComponentData componentData = coreServicesUtil.getComponentData(componentWdUrl);
        SchemaData schemaData = coreServicesUtil.getSchemaData(componentData.Schema.IdRef);
        componentData.Content = xmlUtil.GetNewXmlNode("Content", schemaData.NamespaceUri);
        componentData.Metadata = xmlUtil.GetNewXmlNode("Metadata", schemaData.NamespaceUri);
        componentData.AddSingleField("singlefield", "singlefield sample", schemaData.NamespaceUri);
        componentData = (ComponentData)coreServicesUtil.coreServiceClient.Save(componentData, coreServicesUtil.readOptions);
        coreServicesUtil.coreServiceClient.CheckIn(componentData.Id, coreServicesUtil.readOptions);
        coreServicesUtil.coreServiceClient.Close();
    }

このサンプルで使用されているメソッドの詳細については、次の記事で説明されています。

コア サービスでコンポーネントを作成中に Faulted State エラーが発生しました

于 2012-04-11T23:12:21.770 に答える