我正在尝试读取xml流并将其加载到集合中。
这有效,但我在阅读特殊字符时遇到困难。
E.g。如果我的xml看起来像这样
<?xml version="1.0" encoding="ISO-8859-1" ?>
<persons>
<person>
<firstname>
<![CDATA[ Sébastien ]]>
</firstname>
<lastname>
<![CDATA[Ørvåk]]>
</lastname>
</person>
</persons>
我尝试使用linq读取值
var persons = from p in doc.Elements("persons").Elements("person") select p;
string firstname = person.Element("firstname").Value;
string lastname = person.Element("lastname").Value;
但是在ØrvåkØ和å/Sébastien中,é给出了奇怪的字符。
有谁知道什么是错的?我猜它不使用编码ISO-8859-1。
由于
答案 0 :(得分:3)
扩大别人给出的答案:
有两种可能性:
UTF-8
,但您的xml解析器将其解释为ISO-8859-1
。ISO-8859-1
,但您的xml解析器将其解释为UTF-8
。要确定哪个是哪个,请查看é
中Sébastien
的内容。我可以想象出两种可能性:
é
”成为两个不同的角色 - 可能是“é
ӎ
”成为单个无意义的字母或“?
”,名称b
中也可能缺少“Sébastien
”。在第一种情况下,您的文件不是您认为的。 (它以UTF-8
数据的形式进入您的程序,但您的程序正在尝试将其解释为ISO-8859-1
)使用十六进制编辑器或其他可以显示字节的字节来查看xml文件磁盘是。
在第二种情况下,我将检查localhost上的HTTP服务器如何提供此文件。 (您的程序以ISO-8859-1
格式获取字节,但将其解释为UTF-8
)在Windows上执行此操作的最简单方法是打开cmd
提示符,然后运行命令: telnet localhost 80
当弹出窗口时,键入以下行(或从stackoverflow中剪切并粘贴),然后按两次Enter键。警告:您将无法看到您正在键入的内容,并且大写非常重要。
GET /Test/person.xml HTTP/1.0
在回复中,查找以Content-Type
开头的行。这将告诉您本地Web服务器如何提供文件。
更新:看了你的文件后,它确实是iso-8859-1,所以我建议在你之前设置你的Webclient
实例的.Encoding属性告诉它下载文件:
client.Encoding = System.Text.Encoding.GetEncoding("iso-8859-1")
或者,您可以使用DownloadBytes
方法而不是DownloadString
方法,然后将字节解析为xml文件。目前的问题是,当xml解析器获取文件内容时,字节已被解释为字符串,因此在那里更改编码为时已晚。
答案 1 :(得分:1)
该文件可能不在ISO-8859-1中,但是使用的是UTF-8。你能提供内容的十六进制转储吗?有时XML文件的编写者不小心编码字符串。
此外,可能是XML文档是通过HTTP发出的,而HTTP标头声明编码不正确。 XML specification中的第4.3.3节规定MIME规则覆盖文档本身所声明的内容。
如果您将自己的代码指向链接而不是本地副本,则可能意味着您的本地Web服务器配置不正确...
答案 2 :(得分:0)
您在后续跟踪中提到的XML文件是完全正确的。因此,您的错误特定于您的Javascript代码。