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 是开源的,您可能希望以他们的方式为例。

于 2012-09-25T07:15:22.090 回答
3

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

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

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

于 2012-09-25T08:59:01.353 回答
2

我通常使用XSLT 通过组件模板获取源 XML,但我们绝对可以使用 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 中介器将是一个不错的选择
  • 可以使用 DWT 创建 XML,简化字段选择;但是,以这种方式创建无效 XML 更容易(XSLT 也不验证您的 XML,但破坏节点嵌套稍微困难一些)

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

于 2012-09-26T00:16:58.797 回答
1

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

1)你需要投你的

组件字段[“公司名称”].ToString();

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

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

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

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

祝你好运!

于 2012-09-25T07:07:39.097 回答