2012-03-02 39 views
4

我正在使用Tridion核心服務(Tridion 2011 SP1)來檢索給定類別ID的關鍵字列表。Tridion核心服務 - 使用分層分類法

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

這返回什麼似乎是一個扁平的XML結構,代表我們的深度爲4級的分類。

文檔細節的做法與此工作:

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

然而,這隻會列出每個關鍵字。 KeywordData對象包含屬性ParentKeywords,因此可以在內存中構建層次結構。

是否可以從具有分層結構的核心服務中檢索XML?或者更簡單的方式來處理這些數據?

回答

4

一種方法是使用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); 

正如你看到它被稱爲上公佈,但你可以縮小它的一個或多個類別。它會回報你,你可以這樣進一步處理嚇人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

您可以逐級處理每個分支。下面是一些代碼,我一直在與玩弄這是否:

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的名單中公佈)與一次處理分支相比,造成了巨大的開銷。當然,我應該告誡說,我用Tridion的舊版本(早期的5.x版本)嘗試過,所以事情可能從那時起有所改進。

+0

您的算法還會將相關關鍵字標記爲子關鍵字。您應該使用ChildKeywordsFilterData而不是UsingItemsFilterData。你如何處理具有多個父母的關鍵字? – 2012-03-02 10:47:15

1

Tridion 2011 SP1帶有一個新的CoreService EndPoint。 CoreService 2011.其推薦使用最新的端點。最新的端點有新的功能主義者也修正了錯誤。 SP1還有一個默認的coreservice客戶端代理,您可以直接在您的代碼中使用。

相關問題