如果存在应该';不要

本文关键字:不要 存在 如果 | 更新日期: 2023-09-27 17:58:52

我正在使用XmlReader。我基本上是在读if语句,如果每个元素都存在的话。如果我遇到一个不应该存在的元素,我想抛出一个XmlException。然后我还有一个基本上是说,如果我们已经阅读了所有的元素,并且没有任何元素与我们想要的不匹配,那么关闭所有其他元素都包含在其中的元素。除了检查一个无效或无法识别的元素外,其他一切都在工作。

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

如果存在应该';不要

执行此操作的理想方法是根据系统提供的XSD(XML模式)验证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");

可能值得指出的是,在验证xml时,建议使用模式。

请参阅以下内容:使用XmlSchemaSet 进行XML架构(XSD)验证

我发现XmlReader读取器包含一个IsName(字符串)的方法。它是静态的。因此,由于XmlReader不包含此方法,我可以将IsEndElement添加到条件中,因此我可以添加XmlReader。IsName("job")以绕过结束的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");
                    }