在我的项目中,我有一个非常大的XSD文件,用于验证某些XML请求和对第三方的响应。
对于上述场景,我可以有两种方法
1)创建XML,然后验证是否给予XSD 2)借助XSD gen工具从XSD创建类,添加xtra位attirbutes并使用它们进行验证。
以第二种方式验证将以这种方式工作, a)使用XML Serialization将xml请求/响应转换为对象 b)使用在每个属性上设置的自定义属性验证对象,即将对象传递给一个方法,该方法将通过迭代属性及其在每个属性上设置的自定义属性来验证对象,如果对象验证,这将返回一个布尔值并确定xml请求是否有效?
现在关注哪种方法在性能和其他方面都很好?
答案 0 :(得分: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
}
}
答案 1 :(得分:0)
我不确定将XML反序列化为对象会为您提供所需的验证。
例如,使用定义字符串字段的XSD,然后约束可以在该字段中出现的文本以匹配某些正则表达式。你生成的类会尊重这个约束吗?这样的一些微妙问题可能会让您处于接受无效xml或拒绝其他有效xml的情况。
如果你的第三方已经给你一个XSD进行验证,那么你最好坚持这个合同定义,而不是找到捷径。
但是,您可能会发现有一些常见的错误和错误可以快速过滤掉。这一切都取决于您的信噪比,但您可能会考虑创建一个简单的XSD或编程测试,可以“快速失败”,然后再花时间运行完整的XSD。但是,只有在遇到大量故障并且使用XSD完全验证的成本很高时,这才有意义。
此外,请确保您为方案使用最快的XSD验证。你没有说过这是否是一个.NET环境,但如果是,那么你有XmlDocument,XmlValidatingReader和XElement作为读取XML并根据方案验证它的3种方法。根据您从哪里获取XML,以及您之后使用它做什么等,您应该评估哪些机制可以为您提供最佳性能。