2016-07-27 38 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

相关问题