XML异常:无效字符

时间:2009-05-12 19:06:52

标签: c# xml linq-to-xml

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

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

  

[System.Xml.XmlException]   消息:'?',十六进制值0x1C,是无效字符。

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

我很清楚XML有一种方法可以在其中添加&#x1C等字符。

如果可能的话,我会非常喜欢保留所有数据。如果不是,那就让它成为。


我已经考虑过以编程方式编辑响应字符串,然后返回并尝试重新解析如果抛出异常,但我尝试了一些方法,但似乎都没有成功。

谢谢你的想法。

代码就是这样的:

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?
}

7 个答案:

答案 0 :(得分:17)

您可以使用 XmlReader 并将 XmlReaderSettings.CheckCharacters 属性设置为 false 。这将允许您读取XML文件,尽管字符无效。从那里你可以导入将它传递给XmlDocument或XDocument对象。

您可以在我的blog中了解更多信息。

要将数据加载到 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);
}

可以找到更多信息here

答案 1 :(得分:11)

XML几乎可以处理任何字符,但有一些范围control codes and such,它不会。

最好的办法是,如果你无法让他们确定输出,那就是清理你收到的原始数据。您需要使用您记下的字符引用格式替换非法字符。

(你甚至不能诉诸CDATA,因为那里没有办法逃避这些角色。)

答案 2 :(得分:10)

in this blog post所描述的那样会有用吗?

基本上,他创建了一个消毒xml流。

答案 3 :(得分:0)

如果您的输入不是XML,您应该使用Tidy或Tagsoup之类的东西来清理这些混乱。

他们会接受任何输入,并希望尝试从中创建一个有用的DOM。

我不知道如何调用相关的暗侧库。

答案 4 :(得分:0)

Garbage In,Garbage Out。如果远程应用程序向您发送垃圾,那么这就是您所能得到的。如果他们认为他们正在发送XML,那么他们需要修复。在这种情况下,通过解决他们的错误,你不会给他们任何好处。

您还应该确定他们认为他们发送的是什么。 %1C对他们意味着什么?他们想要的是什么?

答案 5 :(得分:0)

恕我直言,最好的解决方案是修改代码/程序/产生无效XML的任何内容。不幸的是,这并不总是可行的。在这种情况下,您需要转义所有字符<在尝试加载文档之前是0x20。

答案 6 :(得分:0)

如果您确实无法修复源XML数据,请考虑采用我在this answer中描述的方法。基本上,您创建一个TextReader子类(例如StripTextReader)来包装现有的TextReader(tr)并丢弃无效字符。

相关问题