我正在使用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