Xml验证 - 即使代码无效,代码也会验证xml文件

时间:2014-02-07 09:28:20

标签: c# xml validation xmlreader

我编写了以下代码来命名一个名为order.xml的xml文件

private void ValidateOrderXml()
{
    // Create the XmlSchemaSet class.
    XmlSchemaSet sc = new XmlSchemaSet();

    // Add the schema to the collection.
    sc.Add("urn:order-schema", "order_schema.xsd");

    // Set the validation settings.
    XmlReaderSettings settings = new XmlReaderSettings();
    settings.ValidationType = ValidationType.Schema;
    settings.Schemas.Add(sc);
    settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);

    // Create the XmlReader object.
    XmlReader reader = XmlReader.Create(xmlFileName, settings);

    // Parse the file.  
    try
    {
        while (reader.Read()) ;
    }
    catch (XmlException err)
    {
        ;
    }
    finally
    {
        reader.Close();
    }
}

// Display any validation errors. 
private static void ValidationCallBack(object sender, ValidationEventArgs e)
{
    Console.WriteLine("Validation Error: {0}", e.Message);
}

但问题是即使xml文件无效,代码也不会给出任何错误。例如,根据模式,根节点应具有名称顺序。我使用了一个带有其他根名称的xml文件。还是经过验证。

1 个答案:

答案 0 :(得分:1)

问题是你“吞下”了例外:

    // Parse the file.  
    try
    {
        while (reader.Read()) ;
    }
    catch (XmlException err)
    {
        ;
    }
    finally
    {
        reader.Close();
    }
}

所以保留的每个XmlException都会消失,因为您在catch块中没有处理此问题:

catch (XmlException err)
{
    ; // you should place your error handling logic here
}

根据您希望如何处理异常,您可以在记录器中记录异常消息,然后重新抛出它。 因此,例如,您可以将XmlException作为内部异常抛出一个新异常:

catch (XmlException err)
{
    //TODO: log your exception message in a logger
    throw new Exception("Xml has not been validated appropriately", err); 
}

或者您可以简单地重新抛出原始异常:

catch (XmlException err)
{
    //TODO: log your exception message in a logger
    throw;
}

请记住,你永远不应该这样做:

catch (XmlException err)
{
    //TODO: log your exception message in a logger
    throw err; // <-- DON'T DO THIS!
}

因为它抛出原始异常但重置堆栈跟踪,销毁所有堆栈跟踪信息直到catch块:/