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

从Tridion多媒体组件中的XML文件读取UTF-8内容-模板化C,tridion,tridion-2011,Tridion,Tridion 2011,我试图通过templatingC读取嵌入在多媒体组件中的XML文件内容。XML文件包含很少的UTF-8字符。当我读取xml内容时,输出是将UTF-8字符转换成一些垃圾字符?符号或矩形框。 下面是我在C模板中使用的代码片段 代码1: Component xmlMultimediaComponent = (Component)XMLMMSRepositoryObject; // read xml in multimedia component into a string UTF8Encoding e

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

代码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编码的垃圾字符

您知道如何在Tridion多媒体组件中从XML文件的字符串输出中获得相同的UTF-8内容吗

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


提前谢谢。

我可以问一下,为什么要将Xml文档加载到字符串中

尝试将XML文档加载到能够理解XML文档(如XDocument或XmlDocument)的对象中,因为它们知道如何处理字节顺序标记

与XDocument.Loadstream.NET4类似的东西

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

编辑


通读您的代码,看起来您基本上是在试图输出存储为二进制的XML或不符合Tridion模式的XML,这不是我所说的最佳实践。无论如何,您可以将模板的输出设置为XmlDocument,而不需要是字符串。查看package.CreateItem变体。

我可以问一下,为什么要将Xml文档加载到字符串中

尝试将XML文档加载到能够理解XML文档(如XDocument或XmlDocument)的对象中,因为它们知道如何处理字节顺序标记

与XDocument.Loadstream.NET4类似的东西

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

编辑


通读您的代码,看起来您基本上是在试图输出存储为二进制的XML或不符合Tridion模式的XML,这不是我所说的最佳实践。无论如何,您可以将模板的输出设置为XmlDocument,而不需要是字符串。查看package.CreateItem变体。

进一步调查后,我们注意到多媒体组件中关联的文件是ASCII编码的。因此,在读取其内容时,不能显式转换为UTF-8,并且应该使用默认编码,即在上述情况下使用ASCII

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

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

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

也许可以将您的UTF8示例内容粘贴到这里,这样我们就可以在旁注上用iTunes进行测试—许多人认为使用不包含二进制文件(如文本、xml等)的MMC是一种不好的做法。如果需要在Tridion中存储XML,那么可以使用具有非RTF多值文本字段的组件。也许可以将您的UTF8示例内容粘贴到这里,这样我们就可以在旁注上用iTunes进行测试—许多人认为使用不包含二进制文件(如文本、xml等)的MMC是一种不好的做法。如果需要在Tridion中存储XML,那么可以使用具有非RTF多值文本字段的组件。是的,而不是显式编码;在上述情况下,您需要在目标类型设置级别将输出包保持为utf-8;在上述情况下,您需要将输出包保持为目标类型设置级别的utf-8。