我正在使用XmlReader。如果它存在,我基本上会通过if语句读取每个元素。如果我遇到不应该在那里的元素,我想抛出一个XmlException。然后,我还有一个基本上说,如果我们已经阅读所有的元素,并没有任何不符合我们正在寻找的元素关闭所有这些其他元素包裹在内的元素。除了检查无效或无法识别的元素外,Everthing正在工作。如果存在不应该出现的元素,我该如何抛出异常
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");
}
}
打破的部分是下面的代码。它每次都在这个if语句里面,并引发异常。
else if (((!reader.IsStartElement("description"))
&& (!reader.IsStartElement("source"))
&& (!reader.IsStartElement("properties"))
&& (!reader.IsStartElement("elements"))
&& (!reader.IsStartElement("parameters"))
&& (!readerE("job"))))
{
throw new XmlException("Unexpected element was present");
}
什么是'readerE'? – sstan
不要抛出系统定义的异常(*这个规则有一些例外,没有双倍意图,比如'ArgumentException' *),它不是很好的做法。相反,用'DuplicateElementFoundException'或'InvalidElementException'来创建一个新的Exception类型并抛出它。 – Igor
哎呀没有意识到那仍然是对不起。所以基本上,因为所有这些在读取其他元素(描述,源...等)之后被包裹在名为的元素中,读取器是结尾元素。我以为我可以尝试(!readerIsEndElement(“作业”),但xmlReader不包含IsEndElement。 –
Tim