2012-03-07 3 views
5

핵심 서비스를 사용하여 Tridion 2011 프로젝트에 대한 사용자 지정 가져 오기 도구를 작성하는 동안 구성 요소를 저장하려고 할 때 문제가 발생했습니다.Tridion 2011 핵심 서비스 : Xml 조작을 사용하여 새 필드로 구성 요소를 업데이트 할 수 없습니다.

다음 코드는 구성 요소의 필드에 값이 있지만 오류가 발생하지 않을 때 올바르게 작동합니다.

네임 스페이스 의 요소 '콘텐츠' 'UUID : 09ed2feb-f7cb-4760

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

여기 Tridion의 메시지입니다 : 여기

내 코드 (간결함을 제거 오류 처리)입니다 -ba4c-b9ff4f45d025 '의'uuid : 09ed2feb-f7cb-4760-ba4c-b9ff4f45d025 '네임 스페이스에 잘못된 자식 요소 'summary '가 있습니다. 'related_links'네임 스페이스 에서 'UUID : 09ed2feb-f7cb-4760-ba4c-b9ff4f45d025'예상 가능한 요소의 목록

나는 요약이 구성 요소의 스키마에 유효한 필드 알고있다.

스키마가 엄격하고 XML 내의 필드 순서에 신경을 쓰는 것처럼 보입니다. 이 접근법이나 다른 접근법에 어떤 방법이 있습니까?

답변

4

불행히도 모든 필수 입력란을 올바른 순서로 추가해야합니다. 스키마는 실제로 요소를 정렬 된 순서로 정의합니다. 스키마의 필드를 반복하여 시도한 다음 현재 사용중인 방식이 아닌 스프레드 시트에서 스키마를 선택할 수 있습니다.

+0

동료 (Ryan Durkin)의 권장 사항에서 우리는 훌륭하게 작동하고 강력하게 형식화되었지만 유연성이없는 직렬화 방식을 사용 했으므로 우리가 업데이트 할 스키마에 동의해야합니다. –

4

기본적으로 순서는 실제로 중요합니다 (xsd : sequence 사용).

스키마를 업데이트하여 순서를 신경 쓰지 않고 (예 : xsd : all을 대신 사용) 스키마가 XSD 스키마가 될 수 있습니다 (따라서 GUI를 사용하여 스키마를 편집 할 수 없게됩니다).

당신이해야 할 일은 당신이 올바른 장소에 그들을 삽입했는지 확인하는 것입니다.

올바른 순서로 componentFromSpreadsheet를 반복해야합니다. 대부분 주문의 개별 변수가 필요하거나 사전과 다른 데이터 유형을 사용해야합니다.

+1

또는이 링크의 Fields 도우미 클래스를 사용하십시오. http://code.google.com/p/tridion-practice/wiki/ChangeContentOrMetadata –

+0

Frank -이 클래스는 참으로 도움이됩니다. 참조 해 주셔서 감사합니다. –

관련 문제