rds*_*rds 1 c# xml encoding xml-deserialization
我有一个file.xml用Iso-latin-15(又名Iso-Latin-9)编码的XML文档
<?xml version="1.0" encoding="iso-8859-15"?>
<root xmlns="http://stackoverflow.com/demo">
<f>€.txt</f>
</root>
Run Code Online (Sandbox Code Playgroud)
从我最喜欢的文本编辑器,我可以告诉这个文件在Iso-Latin-15中正确编码(它不是UTF-8).
我的软件是用C#编写的,想要提取元素f.
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("file.xml");
Run Code Online (Sandbox Code Playgroud)
在现实生活中,我有一个XMLResolver来设置凭据.但基本上,我的代码就是这么简单.装载进展顺利,我没有任何例外.
现在,我提取值时的问题:
//xnsm is the XmlNameSpace manager
XmlNode n = xmlDoc.SelectSingleNode("//root/f", xnsm);
if (n != null)
String filename = n.InnerText;
Run Code Online (Sandbox Code Playgroud)
Visual Studio调试器显示filename = ?.txt
它可能只是一个Visual Studio错误.不幸的是File.Exists(filename)返回false,而文件实际存在.
怎么了?
如果我没记错的话,该XmlDocument.Load(string)方法始终采用UTF-8,无论XML编码如何.
您必须StreamReader使用正确的编码创建一个并将其用作参数.
xmlDoc.Load(new StreamReader(
File.Open("file.xml"),
Encoding.GetEncoding("iso-8859-15")));
Run Code Online (Sandbox Code Playgroud)
编辑:
我只是偶然发现了微软的KB308061.有一个有趣的段落:
在XML文档的XML声明部分中指定编码声明.例如,以下声明表明该文档采用UTF-16 Unicode编码格式:
Run Code Online (Sandbox Code Playgroud)<?xml version="1.0" encoding="UTF-16"?>请注意,此声明仅指定XML文档的编码格式,不会修改或控制数据的实际编码格式.
| 归档时间: |
|
| 查看次数: |
6916 次 |
| 最近记录: |