2017-07-26 24 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編碼。