При написании специального инструмента импорта для проекта 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. Есть ли способ обойти этот или другой подход?