【问题标题】:generating xml containg fields of a component in sdl tridion在 sdl tridion 中生成组件的 xml 包含字段
【发布时间】:2012-09-25 06:15:54
【问题描述】:

如何在 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)));

            }

【问题讨论】:

  • 你用的是什么版本的 Tridion?

标签: tridion


【解决方案1】:

你可能在这里重新发明轮子。

  1. Tridion 项目 XML。组件的 .Content 和 .Metadata 属性返回 XML,这样就够了吗?
  2. DD4T 使用将 XML 发布到交付端的模板,可能值得检查一下:http://code.google.com/p/dynamic-delivery-4-tridion/

鉴于 DD4T 是开源的,您可能想以他们为例来看看他们是如何做到的。

【讨论】:

    【解决方案2】:

    另一种生成 XML 的方法是使用 XmlSerializer。它的工作原理如下:

    • 创建 POCO
    • 用组件中的值填充它
    • 使用 XmlSerializer 将其反序列化为 XML 字符串
    • 将 XML 存储在包的输出变量中

    这就是 DD4T 的做法。正如努诺所说,值得一试(见他的回答)。

    【讨论】:

      【解决方案3】:

      我通常通过组件模板使用XSLT to get source XML,但我们绝对可以使用do the same with 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));
          }
        }
      

      选择字段

      如果可能的话,我会从中间 XML 格式开始,它不是到组件源的一对一映射

      我们旨在使用适当的 API 获取和转换字段。在您的下一个重大更改中,依赖源组件格式可能会出现问题,其中可能包括:

      • 架构更改和新关键字
      • 演示/渲染端或 CMS 更改
      • “意外”内容(富文本、特殊字符、中医参考等)

      C#的替代品

      在技术方面:

      • XSLT 非常适合“生成 XML”,即使是在 C# 模板构建块中完成。
      • 如果您的环境允许,XSLT Mediator 将是一个不错的选择
      • 可以使用 DWT 创建 XML,简化字段选择;但是,以这种方式创建无效 XML 更容易(XSLT 也不验证您的 XML,但破坏节点嵌套稍微困难一些)

      如果可能,请使用您尝试实现的输出 XML 更新您的问题,或者开始一个新问题以从您的原始组件 XML 获取所需的输出。

      【讨论】:

      • 我同意 Alvin XSLT 调解器将是一个不错的选择,如果您的环境中有它,或者您可以下载或配置它。我们确实使用 XSLT 中介实现了这一点,并且我们能够轻松地操作所有 tcm 引用、富文本等。
      【解决方案4】:

      您的代码不是很清楚,并且包含很多问题,但通常您似乎走在正确的轨道上。

      1) 你需要投射你的

      componentfields["companyname"].ToString();

      我怀疑您在这里使用的是 TextField,因此将其转换为 TextField 对象,然后使用 objects .value 属性

      2) 这里是您将值推送到包中的位置,这将包含您从“公司名称”字段中获得的任何内容,可能是 xml,也可能不是:

      package.PushItem("xml", package.CreateHtmlItem(company.ToString()));

      ..但我认为有了这些信息,您可以找到所需的方法。

      祝你好运!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-19
        • 1970-01-01
        相关资源
        最近更新 更多