从Tridion多媒体组件中的XML文件中读取UTF-8内容 - 模板化C#

时间:2013-01-30 15:29:32

标签: tridion tridion-2011

我试图通过模板化(C#)读取多媒体组件中嵌入的XML文件内容。 XML文件包含少量UTF-8字符。当我读取xml内容时,输出将UTF-8字符转换为一些乱码(?符号或矩形框)。 下面是我在C#Templating中使用的代码片段。

代码1:

Component xmlMultimediaComponent = (Component)XMLMMSRepositoryObject;
// read xml in multimedia component into a string
UTF8Encoding encoding = new UTF8Encoding();
byte[] binary = xmlMultimediaComponent.BinaryContent.GetByteArray();
string navXmlContent = (binary != null) 
               ? UTF8Encoding.UTF8.GetString(binary, 0, binary.Length) 
                       : string.Empty;           

代码2:

using (MemoryStream ms = new MemoryStream())
{
  xmlMultimediaComponent.BinaryContent.WriteToStream(ms);
  ms.Seek(0, SeekOrigin.Begin);

  using (var streamReader = new StreamReader(ms, Encoding.UTF8))
  {                      
    string output = streamReader.ReadToEnd();
      ....
  }
}

在上述两种情况下,输出都有垃圾字符(对于UTF-8编码)。

知道如何将相同的UTF-8内容放入Tridion多媒体组件中XML文件的字符串输出中。

注意:多媒体组件中的XML文件以UTF-8编码保存。

提前致谢。

2 个答案:

答案 0 :(得分:2)

请问为什么要尝试将Xml文档加载到字符串中?

尝试将XML文档加载到理解XML文档的对象(如XDocumentXmlDocument)中,因为他们知道如何处理字节顺序标记。

XDocument.Load(stream)(.NET 4)。

的内容

如果确实需要该文档的文本,则可以使用该对象的“OuterXml”字符串属性。

修改

阅读您的代码,看起来您基本上是在尝试输出存储为二进制文件的XML(或者不符合Tridion模式的xml),这不是我称之为最佳实践的方法。无论如何,您可以将模板的输出设置为XmlDocument,不需要是字符串。查看package.CreateItem变体。

答案 1 :(得分:2)

在进一步调查中,我们注意到多媒体组件中关联的文件是ASCII编码的。因此,在读取其内容时,一定不能显式转换为UTF-8,它应该采用默认编码(即上例中的ASCII)。

       Component xmlMultimediaComponent = XMLMMSRepositoryObject as Component;               
       byte[] binary = xmlMultimediaComponent.BinaryContent.GetByteArray();
       string navContent = (binary != null) ? Encoding.GetEncoding("ASCII") : string.Empty;