0

SDl Tridion のコンポーネントのすべてのフィールドを含む xml ファイルを生成する方法は? これを行うには、C# コードを作成する必要があります。次のコードを使用しています。

 public class stockcompany : ITemplate
    {
        private Engine engine;
        private Package package;
        public void Transform(Engine engine, Package package)

        {

            this.engine = engine;
            this.package = package;



            StringBuilder sb = new StringBuilder();
            Component component = engine.GetObject(package.GetValue("Component.ID")) as Component;
            ItemFields componentfields = new ItemFields(component.Content, component.Schema);
            ItemFields compometa = new ItemFields(component.Metadata, component.Schema);



            if (compometa.Contains("check"))
           {

           }

            if (componentfields.Contains("companyname"))
            {

                 string company = string.Empty;

                company = componentfields["companyname"].ToString();
                package.PushItem("xml", package.CreateHtmlItem(company.ToString()));


         XDocument myxml = new XDocument (new XDeclaration ("1.0","UTF-8",null ),new XElement ("companies",new XElement ("company",xml)));

            }
4

4 に答える 4

5

あなたはおそらくここで車輪の再発明をしているでしょう。

  1. TridionアイテムXMLです。コンポーネントの.Contentプロパティと.MetadataプロパティはXMLを返しますが、これで十分でしょうか?
  2. DD4Tは、XMLを配信側に公開するテンプレートを使用します。確認する価値があるかもしれません:http ://code.google.com/p/dynamic-delivery-4-tridion/

DD4Tがオープンソースであることを考えると、例としてDD4Tがどのようにそれを行うかを確認することをお勧めします。

于 2012-09-25T07:15:22.090 に答える
3

XMLを生成する別のアプローチは、XmlSerializerを使用することです。次のように機能します。

  • POCOを作成する
  • コンポーネントからの値を入力します
  • XmlSerializerを使用してXML文字列に逆シリアル化します
  • パッケージのOutput変数にXMLを保存します

これがDD4Tのやり方です。ヌーノが言ったように、それをチェックすることは価値があります(彼の答えを見てください)。

于 2012-09-25T08:59:01.353 に答える
2

コンポーネント テンプレートを介してソース XML を取得するために、通常は XSLT に頼ってきましたが、C# でも同じことができます。

[TcmTemplateTitle("Show XML Guts")]
public class ShowXmlGuts : ITemplate
  {
  public void Transform(Engine engine, Package package)
    {
    Item contentItem = package.GetByType(ContentType.Component);
    Component component = engine.GetObject(contentItem.GetAsSource().GetValue("ID")) as Component;
    package.PushItem("componentSource", package.CreateHtmlItem(component.Content.OuterXml));
    }
  }

フィールドの選択

可能であれば、コンポーネント source への 1 対 1 のマッピングではない中間 XML 形式から始めます。

適切な API を使用してフィールドを取得および変換することを意図しています。ソース コンポーネントの形式に依存すると、次の大きな変更で問題が発生する可能性があります。

  • スキーマの変更と新しいキーワード
  • プレゼンテーション/レンダリング側または CMS の変更
  • 「予期しない」コンテンツ (リッチ テキスト、特殊文字、tcm 参照など)

C# の代替

技術面では:

  • XSLT は、C# テンプレート ビルディング ブロックで実行されたとしても、"XML 生成" に最適です。
  • お使いの環境で許可されている場合は、 XSLT メディエーターが適しています。
  • DWT を使用して XML を作成し、フィールドの選択を簡素化できます。ただし、この方法で無効な XML を作成する方が簡単です (XSLT も XML を検証しませんが、ノードのネストを解除するのは少し難しくなります)。

可能であれば、達成しようとしている出力 XML で質問を更新するか、新しい質問を開始して、未加工のコンポーネント XML から目的の出力を取得します。

于 2012-09-26T00:16:58.797 に答える