XMLexception:无效字符
我正在开发一个小项目,它从一个长期运行的应用程序接收字符串forms的XML数据。 我正在尝试将此字符串数据加载到XDocument
( System.Xml.Linq.XDocument
)中,然后从那里执行一些XML Magic并为数据报告创建xlsx文件。
有时,我收到包含无效XML字符的数据,并且在尝试将字符串解析为XDocument
,我收到此错误。
[System.Xml.XmlException]消息:’?’,hex值0x1C,是无效字符。
由于我无法控制远程应用程序,因此您可以期待任何类型的角色。
我很清楚XML有一种方法可以将字符放在其中,例如
或类似的东西。
如果可能的话,我会非常喜欢保留所有数据。 如果没有,那就不要了。
我已经考虑过以编程方式编辑响应字符串,然后返回并尝试重新解析如果抛出exception,但我尝试了一些方法,但它们似乎都没有成功。
谢谢你的想法。
代码就是这样的:
TextReader tr; XDocument doc; string response; //XML string received from server. ... tr = new StringReader (response); try { doc = XDocument.Load(tr); } catch (XmlException e) { //handle here? }
XML可以处理几乎任何字符,但是有范围, 控制代码等 ,它不会。
如果你不能让他们解决他们的输出,最好的办法是清理你收到的原始数据。 您需要使用您记下的字符引用格式替换非法字符。
(你甚至不能诉诸CDATA,因为那里没有办法逃避这些角色。)
您可以使用XmlReader并将XmlReaderSettings.CheckCharacters属性设置为false 。 这将允许您读取XML文件,尽管字符无效。 从那里,您可以导入将其传递给XmlDocument或XDocument对象。
您可以在我的博客中阅读更多相关内容。
要将数据加载到System.Xml.Linq.XDocument ,它将看起来像这样:
XDocument xDocument = null; XmlReaderSettings xmlReaderSettings = new XmlReaderSettings { CheckCharacters = false }; using (XmlReader xmlReader = XmlReader.Create(filename, xmlReaderSettings)) { xmlReader.MoveToContent(); xDocument = XDocument.Load(xmlReader); }
更多信息可以在这里找到。
这个博客文章中描述的内容会有用吗?
基本上,他创建了一个消毒xml流。
如果您的输入不是XML,您应该使用Tidy或Tagsoup之类的东西来清理这些混乱。
他们会接受任何输入,并希望尝试从中创建一个有用的DOM。
我不知道如何调用相关的暗侧库。
垃圾进垃圾出。 如果远程应用程序向您发送垃圾,那么这就是您所能得到的。 如果他们认为他们正在发送XML,那么他们需要修复。 在这种情况下,你不是通过解决他们的bug来帮助他们。
你还应该确定他们认为他们发送的是什么。 %1C对他们意味着什么? 他们想要的是什么?
恕我直言,最好的解决方案是修改代码/程序/生成无效XML的任何内容。 不幸的是,这并不总是可行的。 在这种情况下,您需要在尝试加载文档之前转义所有字符<0x20。
如果您真的无法修复源XML数据,请考虑采用我在此答案中描述的方法。 基本上,您创建一个TextReader子类(例如StripTextReader),它包装现有的TextReader(tr)并丢弃无效字符。