4

コア サービスを使用して 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);

Tridion からのメッセージは次のとおりです。

名前空間「uuid:09ed2feb-f7cb-4760-ba4c-b9ff4f45d025」の要素「Content」には、名前空間「uuid:09ed2feb-f7cb-4760-ba4c-b9ff4f45d025」に無効な子要素「summary」があります。予想される可能な要素のリスト: 名前空間 'uuid:09ed2feb-f7cb-4760-ba4c-b9ff4f45d025' の 'related_links'

summary がこのコンポーネントのスキーマの有効なフィールドであることはわかっています。

スキーマは厳密で、Xml 内のフィールドの順序を気にしているようです。これまたは別のアプローチを回避する方法はありますか?

4

2 に答える 2

4

デフォルトでは、順序は確かに重要です (xsd:sequence を使用)。

順序を気にしないようにスキーマを更新することもできますが (たとえば、代わりに xsd:all を使用)、スキーマが XSD スキーマになる可能性があります (そのため、GUI を使用してそれらを編集する機能が失われます)。

あなたがする必要があるのは、それらを正しい場所に挿入することです.

そのため、正しい順序で componentFromSpreadsheet をループする必要があります。これは、順序に別の変数が必要であるか、Dictionary とは異なるデータ型を使用する必要があることを意味します。

于 2012-03-07T16:24:13.310 に答える
4

残念ながら、すべての必須フィールドを正しい順序で追加する必要があります。スキーマは実際に要素を順序付けられたシーケンスとして定義します。スキーマのフィールドを反復して、現在使用しているアプローチではなく、スプレッドシートから選択することができます。

于 2012-03-07T16:19:43.567 に答える