如何更改XmlReader的字符编码

时间:2009-06-07 10:58:00

标签: c# .net xml encoding character-encoding

我有一个简单的XmlReader:

XmlReader r = XmlReader.Create(fileName);

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

问题是,Xml文件中包含ISO-8859-9个字符,这使得XmlReader抛出“Invalid character in the given encoding.”异常。我可以在开头添加<?xml version="1.0" encoding="ISO-8859-9" ?>行来解决这个问题但是我想以另一种方式解决这个问题,以防我无法修改源文件。如何更改XmlReader的编码?

4 个答案:

答案 0 :(得分:35)

要强制.NET以ISO-8859-9的形式读取文件,只需使用许多XmlReader.Create重载之一,例如

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,它仍然会失败。我可能在这里胡说八道,所以试试看吧。 : - )

答案 1 :(得分:4)

XmlTextReader类(静态Create方法实际返回的类,因为XmlReader是抽象基类),旨在自动检测XML文件本身的编码 - 没有办法手动设置它。

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

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

答案 2 :(得分:2)

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

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

有XmlReaderSettings.CheckCharacters属性 - 此状态的帮助:

  

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

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

  

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

因此需要进一步调查。

答案 3 :(得分:0)

使用XmlTextReader代替XmlReader

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