如何更改XmlReader的字符编码
我有一个简单的XmlReader:
XmlReader r = XmlReader.Create(fileName); while (r.Read()) { Console.WriteLine(r.Value); }
问题是,Xml文件中包含ISO-8859-9
字符,这使得XmlReader抛出“ Invalid character in the given encoding.
”exception。 我可以在开头添加行来解决这个问题,但我想以另一种方式解决这个问题,以防我无法修改源代码文件。 如何更改XmlReader的编码?
要强制.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,但仍然会失败。 我可能在这里胡说八道,所以试试看吧。 🙂
XmlTextReader
类(这是静态Create
方法实际返回的,因为XmlReader
是抽象基类)旨在自动检测XML文件本身的编码 – 没有办法手动设置它。
只需确保在您正在阅读的文件中包含以下XML声明:
如果您无法确保输入文件具有正确的标头,则可以查看XmlReader.Create方法的其他11个重载之一。
其中一些采用XmlReaderSettings
变量或XmlParserContext
变量,或两者兼而有之。 我没有调查这些,但有可能设置适当的值可能会有所帮助。
有一个XmlReaderSettings.CheckCharacters属性 – 这种状态的帮助:
指示读者检查字符并在任何字符超出合法XML字符范围时抛出exception。 字符检查包括检查文档中的非法字符,以及检查XML名称的有效性(例如,XML名称可能不以数字开头)。
因此将此设置为false
可能会有所帮助。 但是,帮助还说明:
如果XmlReader正在处理文本数据,它始终会检查XML名称和文本内容是否有效,而不管属性设置如何。 将CheckCharacters设置为false会关闭字符实体引用的字符检查。
因此需要进一步调查。
使用XmlTextReader
而不是XmlReader
:
System.Text.Encoding.UTF8.GetString(YourXmlTextReader.Encoding.GetBytes(YourXmlTextReader.Value))