XSL编译变换后输出未知的chr

时间:2010-07-15 08:45:19

标签: c# xml xslt

我的代码在我的XSLT输出XML的最开头输出一些奇怪的字符,并且Visual Studio 2008或记事本都没有显示它。但它肯定存在,因为VS让我删除它,然后将正确地自动格式化XML。我怎么阻止这个?这是我的代码:

    // create the readers for the xml and xsl
    XmlReader reader = XmlReader.Create(
        new StringReader(LoadFileAsString(MapPath(xslPath)))
    );
    XmlReader input = XmlReader.Create(
        new StringReader(LoadFileAsString(MapPath(xmlPath)))
    );

    // create the xsl transformer
    XslCompiledTransform t = new XslCompiledTransform(true);
    t.Load(reader);

    // create the writer which will output the transformed xml
    StringBuilder sb = new StringBuilder();
    //XmlWriterSettings tt = new XmlWriterSettings();
    //tt.Encoding = Encoding.Unicode;
    XmlWriter results = XmlWriter.Create(new StringWriter(sb));//, tt);

    // write the transformed xml out to a stringbuilder
    t.Transform(input, null, results);

    // return the transformed xml
    WriteStringAsFile(MapPath(outputXmlPath), sb.ToString());


    public static string LoadFileAsString(string fullpathtofile)
    {
        string a = null;
        using (var sr = new StreamReader(fullpathtofile))
            a = sr.ReadToEnd();
        return a;
    }

    public static void WriteStringAsFile(string fullpathtofile, string content)
    {
        File.WriteAllText(fullpathtofile, content.Trim(), Encoding.Unicode);
    }

1 个答案:

答案 0 :(得分:4)

XML输出文档开头的内容很可能是 byte-order-mark BOM ,它指示Unicode输出中的字节是否在big-endian或little-endian order。

此BOM可能对XML文档的使用者有用;但是,在某些情况下,它可能会导致问题,然后最好不要创建它。

您可以指定是否使用Encoding指定的XmlWriterSettings创建BOM:

XmlWriterSettings xmlWriterSettings = new XmlWriterSettings();
xmlWriterSettings.Encoding = new UTF8Encoding(false);

上面的代码将使用UTF8编码创建您的文档。这很可能是您想要的,除非您的消费系统明确要求UTF16 / Unicode编码或您正在处理亚洲字符。

要创建UTF16 / Unicode编码文档,请使用UnicodeEncoding并将第二个参数设置为false

XmlWriterSettings xmlWriterSettings = new XmlWriterSettings();
xmlWriterSettings.Encoding = new UnicodeEncoding(false, false);