我有一个关于我正在做的XML feed和XSL转换的问题。在HTML页面上输出的feed的一些部分中,我会在页面上出现奇怪的字符(例如“”)。
在使用相同Feed的另一个网站(我不拥有)上,它没有获得这些字符。
这是我用来抓取并返回转换内容的代码:
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中的奇怪内容来改变。
谢谢!
答案 0 :(得分: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);
答案 1 :(得分:0)
字符â是UTF-8编码文本的多字节序列(marker)的标记,表示为ASCII。所以,我想,你用UTF-8生成一个HTML文件,而浏览器则解释它。我看到了两种解决方法:
<meta charset="UTF-8">
。<xsl:output encoding="ASCII"/>
对其进行调整。答案 2 :(得分:0)
要使用WebClient.DownloadString
,您必须知道服务器将使用的编码,并事先告诉WebClient 。这有点像Catch-22。
但是,没有必要这样做。使用WebClient.DownloadData
或WebClient.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);
}