XMLexception:无效字符

我正在开发一个小项目,它从一个长期运行的应用程序接收字符串forms的XML数据。 我正在尝试将此字符串数据加载到XDocumentSystem.Xml.Linq.XDocument )中,然后从那里执行一些XML Magic并为数据报告创建xlsx文件。

有时,我收到包含无效XML字符的数据,并且在尝试将字符串解析为XDocument ,我收到此错误。

[System.Xml.XmlException]消息:’?’,hex值0x1C,是无效字符。

由于我无法控制远程应用程序,因此您可以期待任何类型的角色。

我很清楚XML有一种方法可以将字符放在其中,例如&#x1C或类似的东西。

如果可能的话,我会非常喜欢保留所有数据。 如果没有,那就不要了。


我已经考虑过以编程方式编辑响应字符串,然后返回并尝试重新解析如果抛出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)并丢弃无效字符。