Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何更改XmlReader的字符编码_C#_.net_Xml_Encoding_Character Encoding - Fatal编程技术网

C# 如何更改XmlReader的字符编码

C# 如何更改XmlReader的字符编码,c#,.net,xml,encoding,character-encoding,C#,.net,Xml,Encoding,Character Encoding,我有一个简单的XmlReader: XmlReader r = XmlReader.Create(fileName); while (r.Read()) { Console.WriteLine(r.Value); } 问题是,Xml文件中包含ISO-8859-9字符,这使得XmlReader在给定编码中抛出“无效字符。”异常。我可以通过在开头添加行来解决这个问题,但我想用另一种方法来解决这个问题,以防我无法修改源文件。如何更改XmlReader的编码?XmlTextReader类(这

我有一个简单的XmlReader:

XmlReader r = XmlReader.Create(fileName);

while (r.Read())
{
    Console.WriteLine(r.Value);
}

问题是,Xml文件中包含
ISO-8859-9
字符,这使得XmlReader在给定编码中抛出“
无效字符。
”异常。我可以通过在开头添加
行来解决这个问题,但我想用另一种方法来解决这个问题,以防我无法修改源文件。如何更改XmlReader的编码?

XmlTextReader类(这是静态
Create
方法实际返回的,因为
XmlReader
是抽象基类)设计用于自动检测XML文件本身的编码-无法手动设置

只需确保在正在读取的文件中包含以下XML声明:

<?xml version="1.0" encoding="ISO-8859-9"?>

如果无法确保输入文件具有正确的头,可以查看XmlReader.Create方法的其他11个重载之一

其中一些采用
XmlReaderSettings
变量或
XmlParserContext
变量,或两者兼而有之。我还没有研究过这些,但是设置适当的值可能会有所帮助

有XmlReaderSettings.CheckCharacters属性-此属性的帮助说明:

指示读取器检查字符,并在任何字符超出合法XML字符范围时引发异常。字符检查包括检查文档中的非法字符,以及检查XML名称的有效性(例如,XML名称不能以数字开头)

因此,将其设置为
false
可能会有所帮助。但是,该帮助还指出:

如果XmlReader正在处理文本数据,则无论属性设置如何,它都会检查XML名称和文本内容是否有效。将CheckCharacters设置为false将关闭字符实体引用的字符检查


因此,需要进行进一步的调查。

要强制.NET以ISO-8859-9的形式读取文件,只需使用众多XmlReader中的一个即可

using(XmlReader r = XmlReader.Create(new StreamReader(fileName, Encoding.GetEncoding("ISO-8859-9")))) {
    while(r.Read()) {
        Console.WriteLine(r.Value);
    }
}

但是,这可能不起作用,因为,IIRC,W3C XML标准说明了当读取XML声明行时,兼容的解析器应该立即切换到XML声明中指定的编码,而不管之前使用的是什么编码。在您的例子中,如果XML文件没有XML声明,则编码将是UTF-8,并且仍然会失败。我可能在这里胡说八道,所以试试看。:-)

使用
XmlTextReader
而不是
XmlReader

System.Text.Encoding.UTF8.GetString(YourXmlTextReader.Encoding.GetBytes(YourXmlTextReader.Value))

注意,在使用类似这样的语法时,
using
语句结束后,streamreader不会关闭。安全的方法是:
使用(StreamReader sr=newstreamreader(文件名,Encoding.GetEncoding(“ISO-8859-9”))使用(XmlReader r=XmlReader.Create(sr)){…}
@Andreas:你确定吗?我刚刚用Reflector深入研究了代码,当读卡器关闭时,它确实会关闭底层的
文本阅读器
。看看
System.Xml.XmlTextReaderImpl+ParsingState.Close(Boolean)
。是的,我在.NET2.0中遇到过这个问题,也许它在新版本中可以工作?