我正在开发一个小项目,它从长时间运行的应用程序接收字符串形式的XML数据。我正在尝试将此字符串数据加载到XDocument
(System.Xml.Linq.XDocument
),然后从那里执行一些XML Magic并为数据报告创建xlsx文件。
有时,我会收到包含无效XML字符的数据,在尝试将字符串解析为XDocument
时,我收到此错误。
[System.Xml.XmlException] 消息:'?',十六进制值0x1C,是无效字符。
由于我无法控制远程应用程序,因此您可以期待任何类型的角色。
我很清楚XML有一种方法可以在其中添加
等字符。
如果可能的话,我会非常喜欢保留所有数据。如果不是,那就让它成为。
我已经考虑过以编程方式编辑响应字符串,然后返回并尝试重新解析如果抛出异常,但我尝试了一些方法,但似乎都没有成功。
谢谢你的想法。
代码就是这样的:
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?
}
答案 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)并丢弃无效字符。