4 votes

Tridion 2011 Core Service : Impossible de mettre à jour le composant avec un nouveau champ en utilisant la manipulation Xml

Lors de l'écriture d'un outil d'importation personnalisé pour un projet Tridion 2011 utilisant le service de base, j'ai rencontré un problème lors de l'enregistrement d'un composant.

Le code suivant fonctionne bien lorsque le champ du composant a une valeur, mais s'il n'en a pas, j'obtiens une erreur.

Voici mon code (le traitement des erreurs a été supprimé pour des raisons de brièveté) :

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

Voici le message de Tridion :

L'élément 'Content' dans l'espace de nom 'uuid:09ed2feb-f7cb-4760-ba4c-b9ff4f45d025' a un élément enfant invalide summary' dans l'espace de nom 'uuid:09ed2feb-f7cb-4760-ba4c-b9ff4f45d025'. Liste des éléments possibles attendus : 'related_links' dans l'espace de noms 'uuid:09ed2feb-f7cb-4760-ba4c-b9ff4f45d025'

Je sais que summary est un champ valide pour le schéma de ce composant.

Il semble que le schéma soit strict et se soucie de l'ordre des champs dans le Xml. Existe-t-il un moyen de contourner ce problème ou une autre approche ?

4voto

Chris Summers Points 9467

Malheureusement, vous devrez ajouter tous les champs obligatoires dans le bon ordre. Le schéma définit en effet les éléments comme une séquence ordonnée. Vous pourriez essayer d'itérer les champs du schéma, puis de les sélectionner dans la feuille de calcul plutôt que d'utiliser l'approche que vous utilisez actuellement.

4voto

Peter Kjaer Points 4237

Par défaut, l'ordre est en effet important (utilise xsd:sequence).

Vous pourriez mettre à jour le schéma pour ne pas vous préoccuper de l'ordre (par exemple en utilisant xsd:all à la place), mais cela aurait pour conséquence de transformer le schéma en schéma XSD (vous perdriez donc la possibilité de les modifier à l'aide d'une interface graphique).

Ce que vous devez faire, c'est vous assurer que vous les insérez au bon endroit.

Vous devez donc parcourir componentFromSpreadsheet dans le bon ordre, ce qui signifie très probablement que vous avez besoin d'une variable distincte pour l'ordre, ou que vous devez utiliser un type de données différent de celui du dictionnaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X