使用 TOM.NET 更新多媒体组件
Posted
技术标签:
【中文标题】使用 TOM.NET 更新多媒体组件【英文标题】:Updating multimedia component using TOM.NET 【发布时间】:2012-11-23 12:09:22 【问题描述】:我正在尝试使用 Tridion 的 TOM.NET API 像这样在 C# 中更新多媒体图像上的元数据
componentMM.LoadXML(localComponent.GetXML(XMLReadFilter.XMLReadALL));
// make changes to the component mm multimedia text;
localComponent.UpdateXML(componentMM.InnerXML);
localComponent.Save(True)
虽然这适用于其他组件,但它不适用于多媒体图像。
<?xml version="1.0"?>
<tcm:Error xmlns:tcm="http://www.tridion.com/ContentManager/5.0"
ErrorCode="80040345" Category="19" Source="Kernel" Severity="2">
<tcm:Line ErrorCode="80040345" Cause="false" MessageID="16137"><![CDATA[
Unable to save Component (tcm:33-32599).
]]><tcm:Token>RESID_4574</tcm:Token>
<tcm:Token>RESID_4418</tcm:Token>
<tcm:Token>tcm:33-32599</tcm:Token>
</tcm:Line>
<tcm:Line ErrorCode="80040345" Cause="true" MessageID="15747"><![CDATA[
Unexpected element: MultimediaFileSize
]]><tcm:Token>MultimediaFileSize</tcm:Token>
</tcm:Line>
<tcm:Details>
<tcm:CallStack>
<tcm:Location>ComponentBL.CheckMultiMediaProperties</tcm:Location>
<tcm:Location>ComponentBL.CheckMultiMediaProperties</tcm:Location>
<tcm:Location>ComponentBL.Update</tcm:Location>
<tcm:Location>XMLState.Save</tcm:Location>
<tcm:Location>Component.Save</tcm:Location>
</tcm:CallStack>
</tcm:Details>
</tcm:Error>
你能告诉我我在这里做错了什么吗?
【问题讨论】:
在您的更新中仅包括 tcm:Metadata 节点? 【参考方案1】:感谢您的回复。我正在删除节点,但在错误的位置。我像这样更新代码,现在可以正常工作了。
if (localComponent.IsMultimediaComponent)
XmlNode multimediaFileSizeNode = localComponentXML.SelectSingleNode("//*[local-name()='MultimediaFileSize']",tridionNamespace);
XmlNode dataNode = multimediaFileSizeNode.ParentNode;
dataNode.RemoveChild(multimediaFileSizeNode);
localComponent.UpdateXML(localComponentXML.InnerXml);
【讨论】:
BTW *** 太棒了!!【参考方案2】:在您的更新中仅包含 tcm:Metadata 节点?
具体来说,它抱怨您指定 mm 文件的大小,这是您不应该指定的,这是系统属性。清理您从 Tridion 收到的 XML 以删除该属性(然后它可能会抱怨另一个属性,只要按照它的要求去做)。
编辑:阅读错误消息是一项很棒的技能......
【讨论】:
【参考方案3】:执行此操作时,您只需保存修改后的元数据数据(而不是整个 XML)。在调用.UpdateXML()
之前,尝试从 XML 结构中删除除 tcm:Metadata 之外的所有子节点
如果您需要进一步的帮助,也许可以粘贴您的示例 XML。
【讨论】:
【参考方案4】:我通常这样做:-
mComponent = (Component)mTDSE.GetObject("YOUR-COMPONENT-ID", EnumOpenMode.OpenModeView, null, XMLReadFilter.XMLReadAll);
mComponent.CheckOut(false);
mComponent.MetadataFields["YOUR-METADATA-FIELD-NAME"].value[1] = "VALUE TO BE REPLACED";
mComponent.Save(true);
【讨论】:
以上是关于使用 TOM.NET 更新多媒体组件的主要内容,如果未能解决你的问题,请参考以下文章
sql 一组方便的查询,用于检查空间项目二进制文件(即多媒体组件,模板构建块组件)正在使用多少空间项目
tridion 2009 - 将多媒体组件从一个出版物复制到另一个出版物