2012-09-25 24 views
0

經過XSLT轉換後,我不斷得到(似乎)與字符編碼有關的主要問號,但我無法擺脫它們。我嘗試了所有不同的編碼,但它沒有幫助。當我序列化對象時,我被困在內存中的xml源代碼中。XSLT轉換後引導非法字符

這是我的代碼(儘可能短重現該問題)

var xd = new XmlDocument(); 
xd.LoadXml(@"<?xml version=""1.0"" encoding=""utf-8""?><Test><AAA>AAA</AAA></Test>"); 

var xslt = new System.Xml.Xsl.XslCompiledTransform(); 
xslt.Load(Server.MapPath("/Transformations/Test.xslt")); 

using (var ms = new MemoryStream()) 
{ 
    xslt.Transform(xd, null, ms); 
    ms.Position = 1; 

    using (var sr = new StreamReader(ms, System.Text.Encoding.UTF8, true)) 
    { 
     string s = sr.ReadToEnd(); 
    } 
} 

這是XSLT:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
    <xsl:output method="text" indent="no"/> 
    <xsl:template match="Test"> 
     BBB<xsl:value-of select="AAA" />CCC 
    </xsl:template> 
</xsl:stylesheet> 

產地:

��\r\n\t\tBBBAAACCC\r\n\t 

這也可能是很簡單,但我不知道它...

問候,

赫拉斯

+0

也許這是字節順序標記(BOM),它用來給出一個提示,其中保存了對文本文件的編碼。 (默認情況下,Visual Studio將其大部分文本文件保存爲UTF-8中的「.cs」)。[另請參閱此處](http://en.wikipedia.org/wiki/Byte_Order_Mark) – fero

回答

4

設置ms.Position至0而不是1

C#陣列爲零索引。

+3

儘管流支持通過一個數組,這是一個實現細節。我寧願說['Stream.Position'](http://msdn.microsoft.com/en-us/library/system.io.memorystream.position.aspx)是基於零的。 –

+0

現在我覺得很傻。這解決了它...我非常專注於字符編碼,我沒有注意到...謝謝! – Heras