C# XML反序列化错误
我目前正在处理一个xml文件,该文件通常应该包含一个自定义对象列表(list),但有时可能只包含一个带有消息的字符串节点。我有一个反序列化此文件的代码:C# XML反序列化错误,c#,xml,deserialization,C#,Xml,Deserialization,我目前正在处理一个xml文件,该文件通常应该包含一个自定义对象列表(list),但有时可能只包含一个带有消息的字符串节点。我有一个反序列化此文件的代码: private T DeserializeFile<T>(string filePath) { StreamReader readFileStream = new StreamReader(@filePath); var serializerObj = new XmlSerializer(ty
private T DeserializeFile<T>(string filePath)
{
StreamReader readFileStream = new StreamReader(@filePath);
var serializerObj = new XmlSerializer(typeof(T));
return (T)serializerObj.Deserialize(readFileStream);
}
private T反序列化文件(字符串文件路径)
{
StreamReader readFileStream=新的StreamReader(@filePath);
var serializerObj=新的XmlSerializer(typeof(T));
返回(T)serializerObj.Deserialize(readFileStream);
}
这适用于列表,但对于简单字符串会抛出错误(InvalidOperationException-缺少根元素,或“未预期”)。当文件仅包含string元素并从函数返回null时,如何检测这种情况
基本上这就是我想做的:
private T DeserializeFile<T>(string filePath)
{
StreamReader readFileStream = new StreamReader(@filePath);
var serializerObj = new XmlSerializer(typeof(T));
try
{
return (T)serializerObj.Deserialize(readFileStream);
}
catch (Exception ex)
{
return null;
}
}
private T反序列化文件(字符串文件路径)
{
StreamReader readFileStream=新的StreamReader(@filePath);
var serializerObj=新的XmlSerializer(typeof(T));
尝试
{
返回(T)serializerObj.Deserialize(readFileStream);
}
捕获(例外情况除外)
{
返回null;
}
}
这应该可以完成您想要做的事情。它使用来加载和解析文件,以便在尝试反序列化之前检查是否存在任何元素
private T DeserializeFile<T>(string filePath)
{
var xdoc = XDocument.Load(filePath);
if (xdoc.Root.Elements().Any())
{
var serializerObj = new XmlSerializer(typeof(T));
return (T)serializerObj.Deserialize(xdoc.CreateReader());
}
else
return default(T);
}
private T反序列化文件(字符串文件路径)
{
var xdoc=XDocument.Load(文件路径);
if(xdoc.Root.Elements().Any())
{
var serializerObj=新的XmlSerializer(typeof(T));
返回(T)serializerObj.Deserialize(xdoc.CreateReader());
}
其他的
返回默认值(T);
}
这假设您始终拥有有效的XML文件,唯一的区别是根目录包含更多的元素还是仅包含文本,例如类似
<someRoot>
<someObj>
</someObj>
<someObj>
</someObj>
</someRoot>
还有一条“线”像
只是一个字符串
在将文件内容发送到XmlDeserialize()
之前,您不能简单地检查XML的文件内容吗?如何检查内容?您已经有了StreamReader
对象。只需使用它的ReadToEnd()
将整个文件内容放在一个字符串中,然后使用简单的字符串函数或正则表达式检查xml节点。这是一个通用的方法,我不想在其中插入特殊的案例。这实际上不起作用。我调用的方法如下:列表结构=反序列化文件(_reportPath);在这里,如果xml文件包含一个简单的字符串节点,而不是CustomObjective类型的更复杂的节点,那么我想得到一个空值或空列表。它确实返回了null
,并带有我得到的测试数据(当T
是类时,default(T)
)。我张贴了这样的例子;您的数据是否有其他与我的代码不兼容的格式?
<someRoot>just a string</someRoot>