C# LINQ查询中的异常处理
我有一个包含大量对象的XML文件,这些对象可以有多个字段,例如:C# LINQ查询中的异常处理,c#,xml,exception,C#,Xml,Exception,我有一个包含大量对象的XML文件,这些对象可以有多个字段,例如: <object> <obj_name>Car</obj_name> <field> <name>Brand</name> <type>string</type> <value>Volvo</value> </field> <field> &l
<object>
<obj_name>Car</obj_name>
<field>
<name>Brand</name>
<type>string</type>
<value>Volvo</value>
</field>
<field>
<name>Power</name>
<type>int</type>
<value>200</value>
</field>
</object>
我应该只从文件中读取具有名称和至少一个字段的对象。要有效的字段必须具有名称、类型字符串或int和值。我写了这个查询:
var objects = from newobject in
XDocument.Load("input.xml").Descendants("object")
where (string)newobject.Element("obj_name") != ""
select new DataObject
{
Name = (string)newobject.Element("obj_name"),
Fields = new List<Field>(
from fields in newobject.Elements("field")
where (string)fields.Element("name") != ""
where (string)fields.Element("type") != "" && ((string)fields.Element("type") == "string" || (string)fields.Element("type") == "int")
where (string)fields.Element("value") != ""
select new Field
{
Name = (string)fields.Element("name"),
Type = (string)fields.Element("type"),
Value = (string)fields.Element("value")
})
};
它工作正常,但问题是文件也可能有无效的标记,例如导致异常的Bob。如何跳过标记已断开的对象/字段并处理此查询中的异常?在运行c之前,必须修复错误。Net library XML类不允许读取任何带有匹配标记错误的XML文件。您可以使用文本类读取文件,然后进行修复,但强烈建议您修复这些XML错误,不要编写kludge软件来解决实际问题。我个人认为,如果XML无效,您不应该从中读取任何数据。我的意思是,你想如何跳过元素。名称标记是否真的在标记后关闭?如果一个>完全丢失了怎么办。我看不到可靠地解析损坏的xml的好方法,我的任务是编写一个能够处理此类错误的查询,这样我就无法在阅读之前修复它。一个标记被另一个标记关闭是唯一无效的数据情况,文件不会丢失<或'>'。有一些实用程序试图修复损坏的XML,例如XMLTidy。然而,这有点像试图修复损坏的Java或C代码,或者确实像拼写校正器——它可能总是产生语法上有效的东西,但并不总是作者想要的东西。首先修复生成错误XML的程序要好得多。我可以肯定你的观点,但这是一项招聘任务,XML文件是给定的。你必须在运行c之前修复错误。Net library XML类不允许读取任何带有匹配标记错误的XML文件。您可以使用文本类读取文件,然后进行修复,但强烈建议您修复这些XML错误,不要编写kludge软件来解决实际问题。我个人认为,如果XML无效,您不应该从中读取任何数据。我的意思是,你想如何跳过元素。名称标记是否真的在标记后关闭?如果一个>完全丢失了怎么办。我看不到可靠地解析损坏的xml的好方法,我的任务是编写一个能够处理此类错误的查询,这样我就无法在阅读之前修复它。一个标记被另一个标记关闭是唯一无效的数据情况,文件不会丢失<或'>'。有一些实用程序试图修复损坏的XML,例如XMLTidy。然而,这有点像试图修复损坏的Java或C代码,或者确实像拼写校正器——它可能总是产生语法上有效的东西,但并不总是作者想要的东西。首先修复生成错误XML的程序要好得多。我可以肯定你的观点,但这是一项招聘任务,XML文件是给定的。