在sdl tridion中生成包含组件的xml字段

时间:2012-09-25 06:15:54

标签: tridion

如何生成包含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 个答案:

答案 0 :(得分:5)

你可能正在重新发明轮子。

  1. Tridion项 XML。组件的.Content和.Metadata属性返回XML,这就够了吗?
  2. DD4T使用将XML发布到交付方的模板,可能值得查看:http://code.google.com/p/dynamic-delivery-4-tridion/
  3. 鉴于DD4T是开源的,您可能需要检查它们是如何做到这一点的。

答案 1 :(得分:3)

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

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

DD4T就是这样做的。正如Nuno所说,检查它是值得的(见他的回答)。

答案 2 :(得分:2)

我通常通过组件模板使用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更改
  • “意外”内容(富文本,特殊字符,tcm引用等)

C#的替代品

在技术方面:

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

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

答案 3 :(得分:1)

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

1)你需要施展你的

  

componentfields [ “公司名称”]的ToString();

我怀疑你在这里使用TextField,然后将它转换为TextField对象,然后使用对象.value属性

2)这里是你将值推入包中的地方,这将包含你从'companyname'字段获得的任何内容,它可能是xml,它可能不是:

  

package.PushItem(“xml”,package.CreateHtmlItem(company.ToString()));

..但我认为通过这些信息,您可以找到自己需要的方式。

祝你好运!