我正在使用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");
}
答案 0 :(得分:1)
执行此操作的理想方法是根据System.Xml.Schema命名空间提供的XSD(XML架构)验证XML。更多信息和示例可在适用的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");
答案 1 :(得分:0)
值得指出的是,验证xml时的推荐做法是使用模式。
答案 2 :(得分:0)
我发现XmlReader阅读器包含IsName(字符串)的方法。这是静态的。因为我可以将IsEndElement添加到条件中,因为XmlReader不包含此方法,所以我能够添加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");
}