我有xml文件:
<TestType>
<Names>
<Name>
<ID>0</ID>
</Name>
<Name>
<ID>1</ID>
</Name>
<Name>
<ID>2WRONG</ID>
</Name>
<Name>
<ID>3</ID>
</Name>
</Names>
</TestType>
2个简单的课程
public class Name
{
[XmlElement("ID")]
public int Id { get; set; }
}
[XmlRoot("TestType")]
[Serializable]
public class TestType
{
public Collection<Name> Names { get; set; }
}
并尝试反序列化xml文件:
private static void ReadXml()
{
var book = new TestType(){Names = new Collection<Name>()};
var reader =
new XmlSerializer(typeof(TestType));
var file = new XmlTextReader(
@"c:\temp\stest.xml");
try
{
book = (TestType)reader.Deserialize(file);
}
catch (InvalidOperationException ex)
{
Console.WriteLine(ex.InnerException.Message);
}
file.Close();
Console.WriteLine(book.Names.Count);
Console.ReadKey();
}
正如预期的默认行为,反序列化抛出InvalidOperationException,“无效的输入字符串”在元素上,其中id = 2WRONG(是字符串,而不是int),并且反序列化过程中止。在book.Names中收集零元素。
我如何做到这一点:
1)反序列化过程不要在错误输入时中止,他的抛出异常,我抓住他并继续处理。 2)反序列化后的book.Names集合包含所有正确的元素(在这种情况下为(id = 0,1,3))
PS:我尝试混合验证和反序列化,是的。我这样做是因为反序列化非常快,这对我来说非常重要。如果我这样做错了 - 请告诉我。
答案 0 :(得分:0)
我一直都是在几个月前,当我试图弄清楚xml docs的序列化/反序列化是如何工作的时候。
在将信息反序列化为代码时,您有一些选择。
1-从XML传递到简单的类
根据您尝试阅读的文档创建一个包含propreties的类。这样,您就可以确切地知道您想要的信息。以下是如何使用TextReader和XmlSerializer
的示例MyClass object = new MyClass();
string filename = "C/path/to/file.xml";
TextReader fileReader = new StreamReader(filename); // the constructor of textreader does not take parameters and inherits from streamreader class
XmlSerializer serializer= new XmlSerializer(typeOf(MyClass));
//Deserialize the xml document
object = (MyClass) serializer.Deserialize(reader);
object.Close(); //close the stream of data!
2-使用LINQ 在进行不同类型的查询时,LINQ是一个非常强大的工具。这个过程高效而干净。 我将不得不向您推荐这篇文章,其中有一个很好的例子:How to deserialize xml using Linq?
3-如果选项1和2对您来说还不够,我建议您看一下:How to Deserialize XML document
希望我能帮助你一点! :)