我正在对非常大的 XML 文档(有时超过 200MB)使用 XML 反序列化。大多数文档都运行得很好,但有时反序列化函数会抛出错误。
例如:
- 当整数是字符串时,您会收到“格式错误”
- 当无法识别指定的类型时,您会收到错误。
Input string was not in a correct format.
at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
at System.Number.ParseUInt32(String value, NumberStyles options, NumberFormatInfo numfmt)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderFeatureCollection.Read208_Item(Boolean isNullable, Boolean checkType)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderFeatureCollection.Read209_Item(Boolean isNullable, Boolean checkType)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderFeatureCollection.Read210_Item(Boolean isNullable, Boolean checkType)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderFeatureCollection.Read211_Item(Boolean isNullable, Boolean checkType)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderFeatureCollection.Read212_Item(Boolean isNullable, Boolean checkType)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderFeatureCollection.Read213_Item(Boolean isNullable, Boolean checkType)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderFeatureCollection.Read228_TrailInformation(Boolean isNullable, Boolean checkType)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderFeatureCollection.Read237_FeatureCollectionFeatureMember(Boolean isNullable, Boolean checkType)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderFeatureCollection.Read238_FeatureCollection(Boolean isNullable, Boolean checkType)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderFeatureCollection.Read239_FeatureCollection()
这些错误没有问题(我知道如何处理它们),将来我们很可能会遇到我们现在无法预见的其他错误。
我怎样才能告诉 XMLSerializer 继续并跳过这些错误?
我尝试了自定义事件处理程序,但它们不起作用。
我也许能够读取错误消息,然后删除出现错误的行,但这是一种非常令人讨厌的方式(请参阅下面的解决方法)!
Code:
try
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(FeatureCollection));
xmlSerializer.UnknownElement += new XmlElementEventHandler(Serializer_ElementEvent);
xmlSerializer.UnknownAttribute += new XmlAttributeEventHandler(Serializer_AttributeEvent);
xmlSerializer.UnknownNode += new XmlNodeEventHandler(Serializer_NodeEvent);
xmlSerializer.UnreferencedObject += new UnreferencedObjectEventHandler(Serializer_UnreferencedObjectEvent);
StringReader reader = new StringReader(xmlstring);
Message = (FeatureCollection)xmlSerializer.Deserialize(reader); // This is where the exception takes place
}
catch (Exception e)
{
System.Windows.MessageBox.Show("Something went wrong.", "Error", System.Windows.MessageBoxButton.OK);
return;
}
解决方法(正在进行中):
int tries = 1;
while (true)
{
try
{
Bericht = (FeatureCollection)xmlSerializer.Deserialize(reader);
}
catch(Exception e)
{
if(tries >= 100)
{
throw e;
}
Exception innerException = e.InnerException;
// REGEX linenumber innerException.Message; -> Error in XMLDocument (221, 6)
// REMOVE LINE from source
tries++;
continue;
}
break;
}