Базовая служба Tridion 2011: невозможно обновить компонент новым полем с помощью манипуляций с XML - PullRequest
4 голосов
/ 07 марта 2012

При написании специального инструмента импорта для проекта Tridion 2011 с использованием основного сервиса я столкнулся с проблемой при попытке сохранить компонент.

Следующий код работает нормально, когда поле в компоненте имеет значение, но когда его нет, я получаю ошибку.

Вот мой код (для краткости устранена обработка ошибок):

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

Вот сообщение от Тридиона:

Элемент 'Content' в пространстве имен 'uuid: 09ed2feb-f7cb-4760-ba4c-b9ff4f45d025' содержит недопустимый дочерний элемент 'summary' в пространстве имен 'uuid: 09ed2feb-f7cb-4760-ba4c-b9ff4f45d025'. Список возможных ожидаемых элементов: «related_links» в пространстве имен 'UUID: 09ed2feb-f7cb-4760-ba4c-b9ff4f45d025'

Я знаю, что Summary является допустимым полем для схемы этого компонента.

Кажется, что схема строгая и заботится о порядке полей в XML. Есть ли способ обойти этот или другой подход?

Ответы [ 2 ]

4 голосов
/ 07 марта 2012

По умолчанию порядок действительно важен (используется xsd: sequence).

Вы можете обновить Схему, чтобы не заботиться о порядке (например, используя вместо этого xsd: all), но это может привести к тому, что Схема станет Схемой XSD (так что вы потеряете возможность редактировать их с помощью графического интерфейса).

Что вам нужно сделать, это убедиться, что вы вставили их в нужном месте.

Таким образом, вам нужно перебрать componentFromSpreadsheet в правильном порядке - что, скорее всего, означает, что вам нужна отдельная переменная для заказа, или вам нужно использовать тип данных, отличный от словаря.

4 голосов
/ 07 марта 2012

К сожалению, вам придется добавить все обязательные поля в правильном порядке.Схема действительно определяет элементы как упорядоченную последовательность.Вы можете попробовать повторить поля схемы, а затем выбрать их из электронной таблицы, а не подход, который вы используете в настоящее время.

...