2012-05-09 4 views
0

Tridionにスキーマフィールドが埋め込まれており、そこにフィールドが埋め込まれている可能性があります。スキーマ内の各埋め込みスキーマフィールドを経由してリーフデータフィールドに到達するための再帰関数

最終的な葉のフィールドに到達したいので、値を割り当てることができます。そのためには、最終フィールドに達するまで各フィールドをループする再帰関数を作成したいと考えています。

私はSDL Tridionの中でコアサービスを使用して実装しています2011

マイコード:私はあなたが探している解決策を持っていないけれども

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.ServiceModel; 
using System.Net; 
using System.Xml; 
using Tridion.ContentManager.CoreService.Client; 
using System.Text; 
using Tridion.ContentManager.CoreService; 
using System.ServiceModel.Channels; 
using System.IO; 
using System.Collections; 
using System.Text.RegularExpressions; 
using System.Xml.Linq; 
using System.Data.OleDb; 
using System.Data; 
using System.Configuration; 


namespace Loading_Utility 
{ 
    public partial class TST : System.Web.UI.Page 
    { 
     Fields obj = new Fields(); 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      using (ChannelFactory<ISessionAwareCoreService> factory = 
      new ChannelFactory<ISessionAwareCoreService>("wsHttp_2011")) 
      { 
       ISessionAwareCoreService client = factory.CreateChannel(); 
       var schemaFields = client.ReadSchemaFields("tcm:202-2242-8", true, new ReadOptions()); 
       ComponentData component = (ComponentData)client.GetDefaultData(ItemType.Component, "tcm:202-638-2"); 
       var fields = Fields.ForContentOf(schemaFields); 
       component.Schema.IdRef="tcm:202-2242-8"; 
      } 
     } 
     public void fieldRecursion(Field field) 
     { 
      //var getFields = fields; 
      if (field.GetType() == typeof(EmbeddedSchemaFieldDefinitionData)) 
      { 
       // code for checking further if field is embedded or not 


       //Field newField = field.GetSubFields().GetFieldElements(new ItemFieldDefinitionData() as Field) 
       //fieldRecursion(recursiveField); 
      } 
      //string fieldName = recursiveField.Name; 
      //fields[fieldName] = "HI"; 

     } 
    } 
} 
+1

あなたが試したコードとあなたが遭遇した問題を提供しますか? –

+0

@ Nickoli私の編集したコードを参照してください... 私はそれにデータを割り当てることができるように埋め込まれていない最終的な葉のフィールドに達するまで、スキーマの各フィールドを再帰的な関数を書くしようとしています – Aquarius24

答えて

3

が、私はあなたがコアを使用している参照個人的には、コンポーネントXML(Component.Content)を取得し、必要に応じて解析/操作する方が好きです。おそらく、ここにXMLを貼り付けることができれば、サンプルのコアサービスプロジェクトの1つにドロップして、ソリューションを送り返すことができますか?

あなたが役に立たない場合は、私はapiを見てきました。これはあなたが正しい道を進むのに役立ちます。おそらく一度解決策があれば、ここに貼り付けることができますか?

public void RecurseEmbeddedFields(SchemaFieldsData schemaFields) 
{ 
    foreach (ItemFieldDefinitionData field in schemaFields.Fields) 
    { 
     if (field.GetType() == typeof(EmbeddedSchemaFieldDefinitionData)) 
     { 
      // check if this field contains more embedded fields 
      // if it does recurse 
     } 
    } 
} 
+0

ありがとうjohnwinter ..私が編集したコードを見てください。私はコメントしました – Aquarius24

+0

@ johnwriter以下の場所にコードを追加することができます: //このフィールドに埋め込みフィールドが多く含まれているかどうかを確認してください //それが再帰した場合 私はそれを取得できません。 ありがとう – Aquarius24

1

OK、私は助けないことについて少し罪悪を感じたが、私はまだこれがTridionの関連問題ではありません、あなたは一般的な開発手法といくつかのより多くの経験を取得してみなければならないことという私の見解に立ちます。

ここでは、再帰的にXMLを使用して、それを読んで、その後、コンポーネントのコンテンツをロードする方法の例です:コンポーネントの

のXml:

<Content xmlns="uuid:02395f72-acef-44e8-9c35-ff8c9f380251"> 
    <EmbeddedSchema1> 
     <SomeField>Hello</SomeField> 
     <EmbeddedSchema2> 
      <ATextField>There</ATextField> 
     </EmbeddedSchema2> 
    </EmbeddedSchema1> 
</Content> 

コアサービスコード:

static void Main(string[] args) 
{ 
    SessionAwareCoreServiceClient client = new SessionAwareCoreServiceClient("wsHttp_2011"); 
    ReadOptions readOptions = new ReadOptions(); 

    ComponentData component = (ComponentData)client.Read("tcm:5-3234", readOptions); 
    Console.WriteLine("Find fields recursively"); 

    XmlDocument content = new XmlDocument(); 
    content.LoadXml(component.Content); 
    SchemaData schema = (SchemaData)client.Read(component.Schema.IdRef, readOptions); 
    XmlNamespaceManager ns = new XmlNamespaceManager(new NameTable()); 
    ns.AddNamespace("content", schema.NamespaceUri); 

    foreach (XmlElement node in content.SelectNodes("content:*", ns)) 
    { 
     ReadContentRecursively(node, ns); 
    } 
    client.Close(); 
} 
private static void ReadContentRecursively(XmlElement node, XmlNamespaceManager ns) 
{ 
    if(!string.IsNullOrEmpty(node.InnerText)) 
    { 
     foreach (XmlNode innerNode in node) 
     { 
      if(innerNode is XmlText) 
      { 
       Console.WriteLine("Node " + node.Name + " with value \"" + innerNode.Value + "\""); 
      } 
     } 
    } 
    if(node.SelectNodes("content:*", ns).Count > 0) 
    { 
     foreach (XmlElement childNode in node.SelectNodes("content:*", ns)) 
     { 
      Console.WriteLine("Found Field: " + childNode.Name); 
      ReadContentRecursively(childNode, ns); 
     } 
    } 
} 

お知らせReadContentRecursively自身をどのように呼び出すのですか?

これが役に立ちます。

+0

私はなぜ新しいコンポーネントを作成しなければならないのですか?そのxmlアプローチを使用できない理由 – Aquarius24

+0

あなたの質問は何ですか?私は少し混乱しています。最初にフィールドをループする方法を尋ねると、コンポーネントの作成方法を尋ねられます。コンポーネントのコンテンツ_is_ XMLでは、このアプローチを使用するのを止めることは何もありません。 –

+0

@ Nuno ... ok私はあなたを明確にします 私は私のスキーマID と私は1つしか持っていません。そのスキーマIDに基づいてコンポーネントを作成する必要があります....そしてそれにデフォルト値を与えたい 私は持っていますtridionからコンポーネントを取得するのではなく、コンポーネントXMLを作成する 私の動機は、スキーマIDを使用してtridionでコンポーネントを作成することです。以前はtridionのコンポーネントがありませんでした。 – Aquarius24

関連する問題