0

在我的项目中,我有一个非常大的 XSD 文件,我用它来验证一些 XML 请求和对第 3 方的响应。

对于上述情况,我可以有 2 种方法

1) 创建 XML,然后针对给定 XSD 进行验证 2) 在 XSD gen 工具的帮助下从 XSD 创建类,添加额外的属性并使用它们进行验证。

第二种方式的验证将以这种方式工作,a) 使用 XML 序列化将 xml 请求/响应转换为对象 b) 使用在每个属性上设置的自定义属性验证对象,即将对象传递给将通过以下方式验证对象的方法遍历属性及其在每个属性上设置的自定义属性,如果对象验证并确定 xml 请求是否有效,这将返回一个布尔值?

现在关心哪种方法在性能和其他方面都好???

4

2 回答 2

1

如果您主要关心的是性能,您应该使用附加了 XSD 架构的XmlReader进行验证。这是一个例子:

// Store a reference to this object
// to reuse the compiled XSD schema
// for multiple parsing operations
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add("http://www.contoso.com/books", "books.xsd");
settings.ValidationType = ValidationType.Schema;

using (XmlReader reader = XmlReader.Create("books.xml", settings))
{
    while (reader.Read())
    {
        // Do parsing logic
    }
}
于 2009-04-28T11:02:03.667 回答
0

我不确定将您的 XML 反序列化为一个对象是否会为您提供所需的验证。

举个例子,一个 XSD 定义了一个字符串字段,然后约束可以出现在该字段中的文本以匹配某个正则表达式。您生成的类会遵守该约束吗?有许多像这样的微妙问题可能会让您处于接受无效 xml 或拒绝其他有效 xml 的情况。

如果您的第 3 方给了您一个 XSD 来验证,那么您最好坚持这个合同定义,而不是寻找捷径。

但是,您可能会发现有一些常见的错误和错误可以快速过滤掉。这完全取决于您的信噪比,但您可以考虑创建一个简单的 XSD 或一个可以“快速失败”的程序测试,然后再花时间运行完整的 XSD。但是,只有当您遇到很多故障并且使用 XSD 进行完全验证的成本很高时,这才有意义。

此外,请确保您为您的方案使用最快的 XSD 验证。您没有说这是否是 .NET 环境,但如果是,那么您可以使用 XmlDocument、XmlValidatingReader 和 XElement 作为读取 XML 并根据方案验证它的 3 种方式。根据您从何处获取 XML、您之后使用它做什么等,您应该评估哪些机制可以为您提供最佳性能。

于 2009-04-28T10:59:26.980 回答