我试图通过模板化(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编码保存。
提前致谢。
答案 0 :(得分:2)
请问为什么要尝试将Xml文档加载到字符串中?
尝试将XML文档加载到理解XML文档的对象(如XDocument
或XmlDocument
)中,因为他们知道如何处理字节顺序标记。
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;