如何生成包含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)));
}
答案 0 :(得分:5)
你可能正在重新发明轮子。
鉴于DD4T是开源的,您可能需要检查它们是如何做到这一点的。
答案 1 :(得分:3)
生成XML的另一种方法是使用XmlSerializer。它的工作原理如下:
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来获取和转换字段。依赖源组件格式可能会在下一次重大更改中出现问题,其中可能包括:
在技术方面:
如果可能,请使用您尝试实现的输出XML更新您的问题,或者开始一个新问题,以便从原始组件XML获得所需的输出。
答案 3 :(得分:1)
您的代码不是很清晰,并且包含很多问题,但通常您似乎处于正确的轨道上。
1)你需要施展你的
componentfields [ “公司名称”]的ToString();
我怀疑你在这里使用TextField,然后将它转换为TextField对象,然后使用对象.value属性
2)这里是你将值推入包中的地方,这将包含你从'companyname'字段获得的任何内容,它可能是xml,它可能不是:
package.PushItem(“xml”,package.CreateHtmlItem(company.ToString()));
..但我认为通过这些信息,您可以找到自己需要的方式。
祝你好运!