如果存在应该';不要
本文关键字:不要 存在 如果 | 更新日期: 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");
}
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");
}