2016-07-27 66 views
-1

我正在使用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"); 
} 
+2

什麼是'readerE'? – sstan

+1

不要拋出系統定義的異常(*這個規則有一些例外,沒有雙倍意圖,比如'ArgumentException' *),它不是很好的做法。相反,用'DuplicateElementFoundException'或'InvalidElementException'來創建一個新的Exception類型並拋出它。 – Igor

+0

哎呀沒有意識到那仍然是對不起。所以基本上,因爲所有這些在讀取其他元素(描述,源...等)之後被包裹在名爲的元素中,讀取器是結尾元素。我以爲我可以嘗試(!readerIsEndElement(「作業」),但xmlReader不包含IsEndElement。 – Tim

回答

0

我發現的XmlReader讀取器包含用於IsName(串)的方法。它是靜態的。因此,由於我可以將IsEndElement添加到條件中,因爲XmlReader不包含此方法,所以我能夠添加XmlReader.IsName(「job」)來繞過結束作業元素標記。

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"); 
        } 
0

可能值得指出的是,驗證xml時推薦的做法是使用模式。

請參閱以下內容:XML Schema (XSD) Validation with XmlSchemaSet

+0

感謝Rich的好信息,我已經注意到了下一次,但不幸的是,現在我必須保持它的樣子 – Tim

+2

這是一個更好的方法實現了他驗證xml的目標,所以我認爲它值得。 –

1

這樣做的理想方式是驗證針對XSD(XML架構)的XML由System.Xml.Schema命名空間提供。進一步信息和實施例可以在適用MSDN頁中找到Here

實施例從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"); 
+0

正如我在下面提到的Rich,不幸的是我無法創建驗證模式。我必須保持它的方式。我只需要弄清楚如果在元素與其他startElement不匹配的情況下拋出一個異常,如何擊中else。 – Tim

相關問題