2012-03-07 15 views
5

Al escribir una herramienta de importación personalizada para un proyecto de Tridion 2011 utilizando el servicio central me he encontrado con un problema al intentar guardar un componente.Servicio principal de Tridion 2011: no se puede actualizar el componente con un nuevo campo usando manipulación Xml

El siguiente código funciona bien cuando el campo en el componente tiene un valor pero cuando no aparece, aparece un error.

Aquí está mi código (la gestión de errores eliminado por razones de brevedad):

//component is a ComponentData object from Tridion 
var doc = new XmlDocument(); 
doc.LoadXml(component.Content); 

var namespaces = new XmlNamespaceManager(doc.NameTable); 
namespaces.AddNamespace("ns", doc.DocumentElement.NamespaceURI); 

//componentFromSpreadsheet has a dictionary of fields and values to update 
foreach (var field in componentFromSpreadsheet.Fields) 
{ 
    XmlNode xmlNode = doc.SelectSingleNode("//ns:" + field.Key, namespaces); 

    if (xmlNode == null) 
    { 
     xmlNode = doc.CreateNode(XmlNodeType.Element, field.Key, 
           doc.DocumentElement.NamespaceURI); 
     doc.DocumentElement.AppendChild(xmlNode); 
    } 

    //Namespace any Html in the field  
    string fieldValue = HtmlTidy.Tidy(field.Value); 
    xmlNode.InnerXml = fieldValue; 
} 


component.Content = doc.OuterXml; 

//This line throws a FaultException<CoreServiceException> with an 
//XmlException from tridion 
client.Save(component, null); 

Aquí es el mensaje de Tridion:

El elemento 'contenido' de espacio de nombres 'uuid: 09ed2feb-f7cb-4760 -ba4c-b9ff4f45d025 'tiene un elemento secundario no válido ' summary 'en el espacio de nombres' uuid: 09ed2feb-f7cb-4760-ba4c-b9ff4f45d025 '. lista de posibles elementos esperados: '' related_links en espacio de nombres 'uuid: 09ed2feb-f7cb-4760-ba4c-b9ff4f45d025'

sé resumen es un campo válido para el esquema de este componente.

Parece que el esquema es estricto y se preocupa por el orden de los campos dentro del Xml. ¿Hay alguna forma de evitar este u otro enfoque?

Respuesta

4

Desafortunadamente, tendrá que agregar todos los campos obligatorios en el orden correcto. El esquema realmente define los elementos como una secuencia ordenada. Podría intentar iterar los campos del esquema y luego seleccionarlos de la hoja de cálculo en lugar del enfoque que está utilizando actualmente.

+0

En la recomendación de un colega (Ryan Durkin) utilizamos el enfoque de serialización, que funciona muy bien y está fuertemente tipado, pero no es flexible, por lo que debemos aceptar los esquemas que actualizaremos. –

4

Por defecto, el orden es realmente importante (usa xsd: secuencia).

Puede actualizar el Esquema para que no le importe el orden (por ejemplo, usando xsd: todos en su lugar), pero es probable que el Esquema se convierta en un Esquema XSD (por lo que perderá la capacidad de editarlos mediante una GUI).

Lo que debe hacer es asegurarse de insertarlos en el lugar correcto.

Por lo tanto, debe recorrer el componente de la hoja de cálculo en el orden correcto, lo que probablemente signifique que necesita una variable separada para el pedido o necesita utilizar un tipo de datos diferente del diccionario.

+1

Como alternativa, use la clase de ayuda Fields desde este enlace: http://code.google.com/p/tridion-practice/wiki/ChangeContentOrMetadata –

+0

Frank: esa clase parece realmente útil, gracias por la referencia. –

Cuestiones relacionadas