Pregunta

Estoy usando el Tridion de Servicios Básicos (Tridion 2011 SP1) para recuperar una lista de palabras clave para un determinado ID de la Categoría.

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

Esto devuelve lo que parece ser un plano de la estructura XML que representa nuestra taxonomía, que es de 4 niveles de profundidad.

La documentación de los detalles de un enfoque para trabajar con este:

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

Sin embargo, esta es solamente una lista de cada palabra Clave.El KeywordData objeto contiene la propiedad ParentKeywords por lo que sería posible construir la jerarquía de memoria.

Es posible recuperar el XML desde el Núcleo de Servicio con una estructura jerárquica?O de una manera más fácil para trabajar con estos datos?

¿Fue útil?

Solución

Es una forma de utilizar 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);

Como se puede ver se llama en la publicación, pero se puede limitar a una o más categorías.Irá de miedo lista XML que puede seguir el proceso como este:

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, se obtendrá lista desordenada de las palabras clave y los correspondientes a los padres que usted puede seguir el proceso de como te gusta.Elemento que no tiene padres es, obviamente, una palabra clave principal.No podría ser de las más bellas de la solución, pero al menos usted tendrá sólo una llamada al servidor y no leer cada palabra clave.

Otros consejos

Usted podría proceso de cada rama, nivel por nivel.Aquí está el código que he estado jugando con que se hace:

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

He encontrado en el pasado que el procesamiento de una lista plana en una jerarquía (en mi caso una lista de todos los SGs en una Publicación) creó una enorme sobrecarga en comparación con el procesamiento de una rama a la vez.Por supuesto que debo salvedad de que al decir que lo probé con un viejo (principios 5.x) la versión de Tridion, por lo que puede que las cosas han mejorado desde entonces.

Tridion 2011 SP1 viene con un nuevo CoreService Extremo.CoreService de 2011.Se recomienda el uso de la última estación.Última estación tiene nuevo functionalists también correcciones de errores.SP1 también tiene un defecto coreservice proxy de cliente que u puede utilizar directamente en el código.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top