4

Tridion Core Service(Tridion 2011 SP1)を使用して、特定のカテゴリIDのキーワードのリストを取得しています。

CoreService2010Client client = new CoreService2010Client();   
XElement xmlCategoryKeywords = client.GetListXml(category.Id, 
                                                 new KeywordsFilterData());

これにより、4レベルの深さの分類法を表すフラットなXML構造のように見えるものが返されます。

ドキュメントには、これを操作するためのアプローチの詳細が記載されています。

var categoryKeywords = xmlCategoryKeywords.Elements().Select(element => 
    element.Attribute("ID").Value).Select(id => (KeywordData)client.Read(id, null)
);
foreach (KeywordData keyword in categoryKeywords)
{
    Console.WriteLine("\t Keyword ID={0}, Title={1}", keyword.Id, keyword.Title);
}

ただし、これには各キーワードのみが表示されます。KeyboardDataオブジェクトにはプロパティが含まれているParentKeywordsため、メモリ内に階層を構築できます。

階層構造でコアサービスからXMLを取得することは可能ですか?または、このデータを操作する簡単な方法はありますか?

4

3 に答える 3

4

1つの方法は、TaxonomiesOwlFilterDataを使用することです。

string publicationId = "tcm:0-3-1";
var filter = new TaxonomiesOwlFilterData();
filter.RootCategories = new[] {new LinkToCategoryData{ IdRef = "tcm:3-158-512"},};
var list = ClientAdmin.GetListXml(publicationId, filter);

ご覧のとおり、公開時に呼び出されますが、1つ以上のカテゴリに絞り込むことができます。次のようにさらに処理できる恐ろしいXMLリストが返されます。

XNamespace tcmc = publicationId + "/Categories#";
XNamespace rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";
XNamespace tcmt = "http://www.tridion.com/ContentManager/5.2/Taxonomies#";

var taxonomyTree = new Dictionary<string, List<string>>();
var keywordNodes = list.Descendants(tcmc + "cat");
foreach (var keywordNode in keywordNodes)
{
   var parents = new List<string>();
   var parentNodes = keywordNode.Descendants(tcmt + "parentKeyword");
   if (parentNodes.Count() > 0)
   {
      foreach (var parentNode in parentNodes)
      {
         parents.Add(parentNode.Attribute(rdf + "resource").Value);
      }
    }
taxonomyTree.Add(keywordNode.Attribute(rdf + "about").Value, parents);
}

その結果、キーワードと対応する親の順序付けられていないリストが表示され、必要に応じてさらに処理できます。親を持たないアイテムは明らかに親キーワードです。これは最も美しい解決策ではないかもしれませんが、少なくともサーバーへの呼び出しは1回だけで済み、各キーワードを読み取る必要はありません。

于 2012-03-02T09:37:16.373 に答える
1

Tridion 2011 SP1には、新しいCoreServiceEndPointが付属しています。CoreService2011。最新のエンドポイントを使用することをお勧めします。最新のエンドポイントには、新しい機能主義者とバグ修正があります。SP1には、コードで直接使用できるデフォルトのコアサービスクライアントプロキシもあります。

于 2012-04-03T17:59:57.063 に答える
1

各ブランチをレベルごとに処理できます。これが私が遊んでいるいくつかのコードです:それはそれをします:

CoreService2010Client client = new CoreService2010Client("basicHttp_2010");

KeywordsFilterData keywordsDataFilter = new KeywordsFilterData()
{
    BaseColumns = ListBaseColumns.IdAndTitle,
    IsRoot = true
};

UsingItemsFilterData usingItemsFilter = new UsingItemsFilterData()
{
    BaseColumns = ListBaseColumns.IdAndTitle,
    ItemTypes = new[] { ItemType.Keyword },
    InRepository = new LinkToRepositoryData() { IdRef = "tcm:0-1-1" }
};

XElement parents = client.GetListXml("tcm:1-272-512", keywordsDataFilter);

foreach (XElement parent in parents.Descendants())
{
    // Do something with the parent (top level) KW

    XElement children = client.GetListXml(parent.Attribute("ID").Value, usingItemsFilter);

    foreach (XElement child in children.Descendants())
    {
        // Do something with the child KW
    }
}

過去に、フラットリストを階層(私の場合はパブリケーション内のすべてのSGのリスト)に処理すると、一度にブランチを処理する場合に比べて大きなオーバーヘッドが発生することがわかりました。もちろん、古い(5.x以前の)バージョンのTridionで試してみたので、それ以降は状況が改善されている可能性があることに注意する必要があります。

于 2012-03-02T10:10:43.887 に答える