Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果存在不应该存在的元素,如何引发异常_C# - Fatal编程技术网

C# 如果存在不应该存在的元素,如何引发异常

C# 如果存在不应该存在的元素,如何引发异常,c#,C#,我正在使用XmlReader。我基本上是通过一个if语句来读取每个元素,如果它存在的话。如果我遇到一个不应该存在的元素,我想抛出一个XmlException。然后我有一个else基本上是说,如果我们已经阅读了所有的元素,没有任何不匹配的元素,我们正在寻找接近元素,所有其他元素都被包装在里面。除了检查无效或无法识别的元素外,其他一切都正常工作 public void ReadXml(XmlReader reader) { if (reader.IsStart

我正在使用XmlReader。我基本上是通过一个if语句来读取每个元素,如果它存在的话。如果我遇到一个不应该存在的元素,我想抛出一个XmlException。然后我有一个else基本上是说,如果我们已经阅读了所有的元素,没有任何不匹配的元素,我们正在寻找接近元素,所有其他元素都被包装在里面。除了检查无效或无法识别的元素外,其他一切都正常工作

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