如何在SDL Tridion中获取任意对象的XML结构

如何在SDL Tridion中获取任意对象的XML结构,tridion,tridion-2011,Tridion,Tridion 2011,如何获取Tridion中项目的XML结构(如模式、组件、复合模板、关键字、类别、文件夹等) 它是否位于Tridion的安装文件夹或其他任何位置?或者有没有办法直接从Tridion UI访问它?以下是您可以在浏览器控制台中运行的最简单的代码片段,以实现这一点: var itemUri = "tcm:..."; var item = $models.getItem(itemUri); if(item) { if(item.isStaticLoaded()) { console

如何获取Tridion中项目的XML结构(如模式、组件、复合模板、关键字、类别、文件夹等)


它是否位于Tridion的安装文件夹或其他任何位置?或者有没有办法直接从Tridion UI访问它?

以下是您可以在浏览器控制台中运行的最简单的代码片段,以实现这一点:

var itemUri = "tcm:...";
var item = $models.getItem(itemUri);
if(item)
{
   if(item.isStaticLoaded())
   {
      console.log(item.getStaticXml());
   }
   else
   {
      $evt.addEventHandler(item, "staticload", function() {
         console.log(item.getStaticXml());
      });
     item.staticLoad();
   }
}

您也可以使用协议处理程序。如果您登录到内容管理服务器,只需启动internet explorer并在地址栏中键入uri。它将显示任何项目的XML表示形式。
然而:这在64位版本的IE 9上不起作用(参见另一个最近的线程)。

正如Quirijn所指出的,使用协议处理程序是一种最受欢迎的技术。另外,如果您使用的是Tridion2011,那么来自的项Xml扩展也非常有用


如果您使用的是旧版本的Tridion,您可能还希望尝试将UI设置为调试模式,并以这种方式检查XML。

另外两种快速方法至少可以获取组件XML,这次是通过模板

注意:对于依赖原始源的项目要小心,尤其是当我们使用支持的API时。

XSLT组件模板
如果使用CoreService,还可以使用以下代码获取项目的XML:

publicxmlementtor6xml()
{
DataContractSerializer dcs=新的DataContractSerializer(ComponentData);
使用(MemoryStream stream=new MemoryStream())
{
dcs.WriteObject(流、当前数据);
流位置=0;
XmlDocument document=新的XmlDocument();
文件加载(流);
返回document.DocumentElement;
}
}
但是,这将返回Tridion“R6”Xml,与通过TOM.NET或协议处理程序(“R5”Xml)公开的Xml不同


N

不清楚您希望看到什么样的XML结构。你能澄清你的问题吗?如果您想要获取项目的xml,那么可以使用CoreServiceAPI来获取它。我相信您可以通过使用UI API获得相同的信息。@IgorPaniushkin。我想获得任何项目(如组件、文件夹、架构或类别)的完整源。如果您指定上下文,这将有所帮助。Boris已经回答了如何在安圭拉实现这一点,Quirijn已经回答了如何在IE中实现这一点,但是您也可以在TOM、TOM.NET、XSLT或CoreService中实现这一点——显然使用不同的方法。。。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:generic="http://createandbreak.net/schema/generic" 
    xmlns:tcm="http://www.tridion.com/ContentManager/5.0"
    xmlns:xlink="http://www.w3.org/1999/xlink"
    exclude-result-prefixes="xsl tcm xlink generic">

    <xsl:output omit-xml-declaration="no" indent="yes"
        method="xml" cdata-section-elements="description" />
    <xsl:variable name="Content" select="/tcm:Component/tcm:Data/tcm:Content" />

    <xsl:template match="/">
        <xsl:copy-of select="." />
        <xsl:apply-templates select="$Content/*" />
     </xsl:template>

    <xsl:template match="*">
        <xsl:copy-of select="." />
    </xsl:template>
</xsl:stylesheet>
using Tridion.ContentManager.ContentManagement;
using Tridion.ContentManager.Templating; 
using Tridion.ContentManager.Templating.Assembly;

namespace CreateAndBreakTemplates
{
    [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));
        }
    }
}