1

我正在尝试通过模板(C#)读取嵌入在多媒体组件中的 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 编码)。

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

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

提前致谢。

4

2 回答 2

2

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

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

类似于XDocument.Load(stream)(.NET 4)的东西。

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

编辑

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

于 2013-01-30T15:53:00.410 回答
2

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

       Component xmlMultimediaComponent = XMLMMSRepositoryObject as Component;               
       byte[] binary = xmlMultimediaComponent.BinaryContent.GetByteArray();
       string navContent = (binary != null) ? Encoding.GetEncoding("ASCII") : string.Empty;
于 2013-01-31T18:43:23.767 回答