C# 如果存在不应该存在的元素,如何引发异常
我正在使用XmlReader。我基本上是通过一个if语句来读取每个元素,如果它存在的话。如果我遇到一个不应该存在的元素,我想抛出一个XmlException。然后我有一个else基本上是说,如果我们已经阅读了所有的元素,没有任何不匹配的元素,我们正在寻找接近元素,所有其他元素都被包装在里面。除了检查无效或无法识别的元素外,其他一切都正常工作C# 如果存在不应该存在的元素,如何引发异常,c#,C#,我正在使用XmlReader。我基本上是通过一个if语句来读取每个元素,如果它存在的话。如果我遇到一个不应该存在的元素,我想抛出一个XmlException。然后我有一个else基本上是说,如果我们已经阅读了所有的元素,没有任何不匹配的元素,我们正在寻找接近元素,所有其他元素都被包装在里面。除了检查无效或无法识别的元素外,其他一切都正常工作 public void ReadXml(XmlReader reader) { if (reader.IsStart
public void ReadXml(XmlReader reader)
{
if (reader.IsStartElement("job"))
{
//
// Get the values of all the <job> attributes
//
JobName = reader.GetAttribute("name");
MethodName = reader.GetAttribute("method");
//
// Read past <job>
//
reader.Read();
//
// We could have (in any order):
// <Description></Description>
// <Source></Source>
// <Properties></Properties>
// <Elements></Elements>
//
while (true)
{
if (reader.IsStartElement("description"))
{
Description = reader.ReadElementContentAsString();
}
else if (reader.IsStartElement("source"))
{
Source = reader.ReadElementContentAsString();
}
else if (reader.IsStartElement("properties"))
{
Properties.ReadXml(reader);
}
else if ((reader.IsStartElement("elements")) && (!reader.IsEmptyElement))
{
Elements.ReadXml(reader);
}
else if ((reader.IsStartElement("parameters")) && (!reader.IsEmptyElement))
{
Parameters.ReadXml(reader);
}
else if (((!reader.IsStartElement("description"))
&& (!reader.IsStartElement("source"))
&& (!reader.IsStartElement("properties"))
&& (!reader.IsStartElement("elements"))
&& (!reader.IsStartElement("parameters"))
&& (!reader.IsStartElement("job"))))
{
throw new XmlException("Unexpected element was present");
}
else
{
reader.MoveToContent();
reader.ReadEndElement();
break;
}
}
}
else
{
throw new XmlException("Expected <job> element was not present");
}
}
可能值得指出的是,验证xml时推荐的做法是使用模式
请参见以下内容:执行此操作的理想方法是根据System.XML.schema命名空间提供的XSD XML模式验证XML。更多信息和示例可在适用的MSDN页面上找到 MSDN中的示例:
XmlSchemaSet schemas = new XmlSchemaSet();
schemas.Add("", "CustomersOrders.xsd");
Console.WriteLine("Attempting to validate");
XDocument custOrdDoc = XDocument.Load("CustomersOrders.xml");
bool errors = false;
custOrdDoc.Validate(schemas, (o, e) =>
{
Console.WriteLine("{0}", e.Message);
errors = true;
});
Console.WriteLine("custOrdDoc {0}", errors ? "did not validate" : "validated");
我发现XmlReader包含一个IsNamestring方法。它是静态的。因此,由于XmlReader不包含此方法,所以我可以将IsEndElement添加到条件中,因此我可以添加XmlReader.IsNamejob以绕过结束作业元素标记
else if (((!reader.IsStartElement("description"))
&& (!reader.IsStartElement("source"))
&& (!reader.IsStartElement("properties"))
&& (!reader.IsStartElement("elements"))
&& (!reader.IsStartElement("parameters"))
&& (!XmlReader.IsName("job"))))
{
throw new XmlException("Unexpected element was present");
}
什么是readerE?不要抛出系统定义的异常该规则有一些异常,没有双关语的意图,比如ArgumentException,这不是好的做法。相反,创建一个名为DuplicateElementFoundException或InvalidElementException的新异常类型并抛出它。所以基本上,因为所有这些都被包装在一个元素中,在它读取其他元素的描述、源等之后调用它,所以reader是结束元素。我想我可以试试!ReaderSendElementJob但xmlReader不包含IsEndElement.MSDN说它调用MoveToContent并测试是否…,所以每次调用它时,我都非常确定您当前的位置正在移动。当您显式地调用else:reader.MoveToContent;,您似乎只想在到达else时移动它;,但是,您也在每次IsStartElement调用中调用MoveToContent.Right。但这不会影响我检查与任何建议的StartElements不匹配的元素,对吗?感谢您提供的丰富信息。我记下了下一次。但不幸的是,现在我不得不保持原样。这是实现其验证xml目标的更好方法,因此我认为这是值得的。正如我在下面向Rich提到的,不幸的是,我无法创建用于验证的模式。我必须保持现状。我只需要弄清楚,如果有一个元素与任何其他StartElement都不匹配,那么如果else抛出异常,如何命中else。
else if (((!reader.IsStartElement("description"))
&& (!reader.IsStartElement("source"))
&& (!reader.IsStartElement("properties"))
&& (!reader.IsStartElement("elements"))
&& (!reader.IsStartElement("parameters"))
&& (!XmlReader.IsName("job"))))
{
throw new XmlException("Unexpected element was present");
}