2016-10-12 88 views
0

我有一個關於我正在做的XML提要和XSL轉換的問題。在HTML頁面的輸出Feed的幾個部分,我會在頁面上出現奇怪的字符(例如「)」)。奇怪的字符編碼字符(?)出現在飼料

Bad characters

在另外一個網站(即我沒有)這是使用相同的飼料,它沒有得到這些字符。

No bad characters

下面是我用搶,並返回轉化內容的代碼:

string xmlUrl = "http://feedurl.com/feed.xml"; 
string xmlData = new System.Net.WebClient().DownloadString(xmlUrl); 
string xslUrl = "http://feedurl.com/transform.xsl"; 
XsltArgumentList xslArgs = new XsltArgumentList(); 
xslArgs.AddParam("type", "", "specifictype"); 
string resultText = Utils.XslTransform(xmlData, xslUrl, xslArgs); 
return resultText; 

而且我Utils.XslTransform功能如下:

static public string XslTransform(string data, string xslurl) 
{ 
    TextReader textReader = new StringReader(data); 
    XmlReaderSettings settings = new XmlReaderSettings(); 
    settings.DtdProcessing = DtdProcessing.Ignore; 
    XmlReader xmlReader = XmlReader.Create(textReader, settings); 
    XmlReader xslReader = new XmlTextReader(Uri.UnescapeDataString(xslurl)); 
    XslCompiledTransform myXslT = new XslCompiledTransform(); 
    myXslT.Load(xslReader); 

    StringBuilder sb = new StringBuilder(); 
    using (TextWriter tw = new StringWriter(sb)) 
    { 
     myXslT.Transform(xmlReader, new XsltArgumentList(), tw); 
    } 

    string transformedData = sb.ToString(); 
    return transformedData; 
} 

我不是對字符編碼問題非常瞭解,我一直試圖將這個問題扼殺在一些時間,並可以使用任何可能的建議。我不確定是否需要改變WebClient下載文件的方式或XslTransform中奇怪的內容。

謝謝!

+1

考慮將URL傳遞給XslCompiledTransform,而不是使用WebClient下載的字符串。 –

+0

你看到問題的第一點在哪裏?它在'xmlData'中嗎?如果是,那麼問題很可能是WebClient正在使用的編碼。 –

回答

0

HtmlEncode試試。因此,在這種情況下,你將引用的System.Web,然後讓這種變化(只需撥打最後一行的HTMLEncode功能):

string xmlUrl = "http://feedurl.com/feed.xml"; 
string xmlData = new System.Net.WebClient().DownloadString(xmlUrl); 
string xslUrl = "http://feedurl.com/transform.xsl"; 
XsltArgumentList xslArgs = new XsltArgumentList(); 
xslArgs.AddParam("type", "", "specifictype"); 
string resultText = Utils.XslTransform(xmlData, xslUrl, xslArgs); 
return HttpUtility.HtmlEncode(resultText); 
+0

添加了'HtmlDecode'行,沒有任何改變。仍然看到奇怪的字符。 – Chiggins

+0

糟糕,我可能已經倒過來了。您可能需要將編碼切換爲HTML實體而不是FROM。對不起... ...將編輯答案。 – rmc00

+0

剛剛結束將HTML轉換爲編碼實體,<和>以及所有爵士樂。 – Chiggins

0

的性格是多字節序列的標誌物(A€™)UTF的當它被表示爲ASCII時,-8編碼的文本。所以,我想,你用UTF-8生成一個HTML文件,而瀏覽器則用它來解釋它。我看到2種方法來解決這個問題:

  1. 最簡單的解決辦法是更新XSLT以包含HTML meta標籤,將提示正確的編碼到瀏覽器:<meta charset="UTF-8">
  2. 如果你的變換已經在元標記中定義了一個不同的編碼並且你想保留它,那麼這個編碼需要在將XML保存爲文件的函數中指定。在我的例子中,我假設這個函數默認使用ASCII。如果將XSLT配置爲直接將XML文件生成到磁盤,則可以使用XSLT指令<xsl:output encoding="ASCII"/>對其進行調整。
+0

我已經添加了元字符集到頁面,並沒有最終幫助。我必須再看一下#2。 – Chiggins

+0

我覺得問題的根源在那裏。很想知道它是否可行。如果寫入磁盤的函數未收到編碼,則可能需要在保存之前重新編碼字符串。 –

+0

卡在另一個項目,現在我回到了這個。 XSL在那裏已經有了一個編碼爲UTF-8的輸出,但是即使將它改爲ASCII也沒有任何幫助。 – Chiggins

0

要使用WebClient.DownloadString您必須知道服務器正在使用的編碼,並提前告訴WebClient 這是一個Catch-22。

但是,沒有必要這樣做。使用WebClient.DownloadDataWebClient.OpenReader並讓XML庫找出使用哪種編碼。

using (var web = new WebClient()) 
using (var stream = web.OpenRead("http://unicode.org/repos/cldr/trunk/common/supplemental/windowsZones.xml")) 
using (var reader = XmlReader.Create(stream, new XmlReaderSettings { DtdProcessing = DtdProcessing.Parse })) 
{ 
    reader.MoveToContent(); 
    //… use reader as you will, including var doc = XDocument.ReadFrom(reader); 
}