2017-07-26 35 views
0

我曾经的代码在C#以下位到一个XML文件转换为另一种使用XSLT/XSLT总是给我UTF-16用斜杠

string xmlInput = @"<?xml version='1.0' encoding='UTF-8'?><catalog><cd><title> Empire Burlesque </title ><artist> Bob Dylan </artist><country> USA </country><company> Columbia </company><price> 10.90 </price><year> 1985 </year></cd></catalog>"; 

      /////////////////////////////////////////////////////////////// 
      string xmlOutput = String.Empty;    
      using (StringReader sri = new StringReader(xmlInput)) 
      { 
       using (XmlReader xri = XmlReader.Create(sri))     
       { 
        XslCompiledTransform xslt = new XslCompiledTransform(); 
        //xslt.Load(xrt); 
        xslt.Load(@"XSLT/slide2.xslt"); 
        using (StringWriter sw = new StringWriter()) 
        using (XmlWriter xwo = XmlWriter.Create(sw, new XmlWriterSettings { Encoding = Encoding.UTF8 })) 
        { 
         xslt.Transform(xri, xwo); 

         xmlOutput = sw.ToString(); 
        } 
       } 
      } 

xmlOutput给我"<?xml version=\"1.0\" encoding=\"utf-16\"?><root> Empire Burlesque </root>" 我怎样才能获得UTF-8并没有斜杠?

+0

实际文件中没有斜杠。你只是看着Visual Studio显示结果的方式。 – jdweng

+0

.NET字符串是UTF-16,因此如果输出XML声明,您将获得该编码。为什么你需要一个字符串作为XSLT结果,但希望它声明UTF-8?你以后是否将该字符串写入文件?至于斜杠,这是Visual Studio在调试器中为字符串值显示的内容,不是? –

+0

我的XSLT: <?xml version ='1.0'encoding ='UTF-8'?> iconiconoclast

回答

0

.NET字符串是UTF-16编码字符的序列,StringWriter/StringBuilder默认为该编码。 (来源https://forums.asp.net/post/3240311.aspx

所以你需要它继承了默认的StringWriter的一类:

public class StringWriterWithEncoding : StringWriter 
{ 
    Encoding myEncoding; 

    public override Encoding Encoding 
    { 
     get 
     { 
      return myEncoding; 
     } 
    } 

    public StringWriterWithEncoding(Encoding encoding) : base() 
    { 
     myEncoding = encoding; 
    } 

    public StringWriterWithEncoding(Encoding encoding) : base(CultureInfo.CurrentCulture) 
    { 
     myEncoding = encoding; 
    } 

    public StringWriterWithEncoding(StringBuilder sb, Encoding encoding) : base(sb, CultureInfo.CurrentCulture) 
    { 
     myEncoding = encoding; 
    } 
} 

,并在其中创建例如一个实例StringWriterWithEncoding utf8Writer = new StringWriterWithEncoding(Encoding.UTF8);并将其作为第三个参数传递给XslCompiledTransform的Transform方法。

使用这样的:

StringBuilder sb = new StringBuilder(); 
using (StringWriterWithEncoding sw = new StringWriterWithEncoding(sb, Encoding.UTF8)) 
{ 
    XslCompiledTransform xslt = new XslCompiledTransform(); 
    xslt.Load(@"XSLT/slide2.xslt"); 
    xslt.Transform(xri, sw); 
} 
xmlOutput = sb.ToString(); 
0

第一个问题是由StringWriter的

using (StringWriter sw = new StringWriter()) 
using (XmlWriter xwo = XmlWriter.Create(sw, new XmlWriterSettings { Encoding = Encoding.UTF8 })) 

即使你专门设置XmlWriterSettings.Encoding为UTF-8引起的,您可以指定输出流是StringWriter的和自.NET字符串是UTF-16,XmlWriter被迫使用UTF-16。 如果您使用FileStream而不是StringWriter,则输出将使用UTF-8或您指定的任何编码。

斜杠问题只是你的IDE逃脱它。如果您将xmlOutput打印到控制台,您将看到它不包含额外的斜线。

0

您可以包含此行XSLT样式表:

<xsl:output encoding="utf-8"/> 

(或课程编码为准你喜欢的),它会自动设置的输出设置为UTF-8编码。