【问题标题】:Read UTF-8 content from the XML file in Tridion multimedia component - Templating C#从 Tridion 多媒体组件中的 XML 文件中读取 UTF-8 内容 - 模板化 C#
【发布时间】:2013-01-30 15:29:31
【问题描述】:

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

代码 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 编码保存。

提前致谢。

【问题讨论】:

  • 或许可以在此处粘贴您的示例 UTF8 内容,以便我们进行测试
  • 附带说明 - 许多人认为拥有不包含二进制文件(例如文本、xml 等)的 MMC 是不好的做法。如果您需要在 Tridion 中存储 XML,那么您可以使用具有非 RTF 多值文本字段的组件。
  • Chris - 下面是多媒体组件中存在的 XML 文件中的示例内容 sn-p。 tridion.com/ContentManager/5.0"> w3.org/1999/xhtml&quot;&gt;XYZ&lt;sup class="sup">®</sup></strong> <br xmlns="w3.org/1999/xhtml&quot; /> (XYZ 的示例描述)" />

标签: tridion tridion-2011


【解决方案1】:

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

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

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

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

编辑

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 是的,而不是显式编码;在上述情况下,您需要在目标类型设置级别将输出包保持为 utf-8。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 2013-01-16
    相关资源
    最近更新 更多