Pergunta

Estou usando o Tridion Core Service (Tridion 2011 SP1) para recuperar uma lista de palavras-chave para um determinado ID de categoria.

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

Isso retorna o que parece ser uma estrutura XML plana que representa nossa taxonomia com 4 níveis de profundidade.

A documentação detalha uma abordagem para trabalhar com isso:

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

No entanto, isso listará apenas cada palavra-chave.O objeto KeywordData contém propriedade ParentKeywords então seria possível construir a hierarquia na memória.

É possível recuperar XML do Serviço Principal com uma estrutura hierárquica?Ou uma maneira mais fácil de trabalhar com esses dados?

Foi útil?

Solução

Uma maneira é usar TaxonomiasOwlFilterData:

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

Como você pode ver, ele é chamado de publicação, mas você pode restringi-lo a uma ou mais categorias.Ele retornará uma lista XML assustadora que você pode processar assim:

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

Como resultado, você obterá uma lista não ordenada de suas palavras-chave e pais correspondentes, que poderá processar conforme desejar.O item que não tem pai é obviamente uma palavra-chave pai.Pode não ser a solução mais bonita, mas pelo menos você precisará apenas de uma chamada ao servidor e não lerá cada palavra-chave.

Outras dicas

Você poderia processar cada ramificação, nível por nível.Aqui está um código que estou brincando que faz isso:

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

Descobri no passado que o processamento de uma lista simples em uma hierarquia (no meu caso, uma lista de todos os SGs em uma publicação) criava uma sobrecarga enorme em comparação ao processamento de uma ramificação por vez.É claro que devo ressalvar isso dizendo que tentei isso com uma versão antiga (início da 5.x) do Tridion, então as coisas podem ter melhorado desde então.

Tridion 2011 SP1 vem com um novo CoreService EndPoint.CoreService 2011.É recomendado usar o endpoint mais recente.O endpoint mais recente tem novos funcionalistas e também correções de bugs.O SP1 também possui um proxy de cliente coreservice padrão que você pode usar diretamente em seu código.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top