将Tridion组件转储为XML

est*_*why 3 dwt tridion tridion-2011

使用模块化模板将Tridion组件内容(基于给定模式,即:非任意)转储到XML中的最简单方法是什么?

具体来说,需要将组件的内容传递给/作为ASP.Net自定义控件,即:

<custom:MyControl runat="server"
    TextField="value1"..>
  <EmbeddedField>
    ..
  </EmbeddedField>
</custom:MyControl>
Run Code Online (Sandbox Code Playgroud)

我看到一种可能的方法是调整Default Dreamweaver组件设计 DWT TBB,但这似乎太费力了.

编辑

另一个模糊的主题是上面问题的第二部分:将XML嵌入到ASP.Net控制标记中.问题是需要转义XML.下面的脑力激荡器在DWT中进行(压力,Nuno的TBB写入输出):

<custom:MyControl runat="server">
    <xml>
        @@(Output).replace(RegExp.call(null, /&/.toString()[1], "g"), '&').replace(RegExp.call(null, /</.toString()[1], "g"), '<').replace(RegExp.call(null, />/.toString()[1], "g"), '>').replace(RegExp.call(null, String.fromCharCode(34), "g"), '"')@@
    </xml>
</custom:MyControl>
Run Code Online (Sandbox Code Playgroud)

(所有这些只是克服DWT神秘的JS转义规则所必需的.)

Nun*_*res 5

使用以下代码创建ac#Template Building Block:

TemplatingLogger log = TemplatingLogger.GetLogger(GetType());
if (package.GetByName(Package.ComponentName) == null)
{
    log.Debug("Not running in a Component Template, exiting.");
    return;
}
Component component = (Component)engine.GetObject(package.GetByName(Package.ComponentName));
package.PushItem(Package.OutputName, package.CreateStringItem(ContentType.Xml, component.Content.OuterXml));
Run Code Online (Sandbox Code Playgroud)

并且在您的模板中使用它而不需要任何其他构建块.

这将输出确切的内容Component.Content,这很少是你真正想要的(例如,你如何处理二进制文件或链接的组件?),所以你会想要进化到其他东西,更多的细节,并可能删除来自XML节点的命名空间......

我通常使用一个大的switch(field.GetType().Name),然后根据需要处理每个字段类型,这些内容如下:

foreach (ItemField field in content)
{
    string fieldType = field.GetType().Name;
    switch (fieldType)
    {
        case "XhtmlField":
            // do something, like write it to an XmlWriter
            break;
Run Code Online (Sandbox Code Playgroud)

等等等等.