c# - 如何在 C# 中基于 XML 文件创建具有严格值验证的 XSD 文件
问题描述
我有未定义数量的 XML 文件,它们都具有不同的结构,这些文件需要作为“黄金文件”来验证另一批 XML 文件。
我已经想到了几种不同的方法,但最后我决定 XSD 文件可能是要走的路。
这是我目前的解决方案:
XmlReader reader = XmlReader.Create(Path);
XmlSchemaSet schemaSet = new XmlSchemaSet();
XmlSchemaInference schema = new XmlSchemaInference();
schema.Occurrence = XmlSchemaInference.InferenceOption.Restricted;
schema.TypeInference = XmlSchemaInference.InferenceOption.Restricted;
schemaSet = schema.InferSchema(reader);
XmlWriter writer;
foreach (XmlSchema s in schemaSet.Schemas())
{
writer = XmlWriter.Create(Path.ChangeExtension(Path, ".xsd"));
s.Write(writer);
writer.Close();
}
reader.Close();
这可行,但是它只创建一个验证 XML 文件结构的 XSD 文件,我想要一个 XSD 文件,它也验证 XML 文件中的值,有没有办法根据 XML 文件自动创建 XSD 文件.
如果您对我的问题有更好的解决方案,我会很高兴听到它。
解决方案
如果您想测试给定文件是否与某个参考文件“相同”,我认为模式验证不是该工作的正确工具——尽管它是一个有趣的选项,尤其是对于 XSD 1.1 断言。
最常见的两种方法是
(a) 将两个文件都转换为规范的 XML 格式,并将它们作为字符串进行比较
(b) 使用fn:deep-equal()
函数将它们作为树进行比较,使用 XPath 2.0+。
不幸的是,这两种方法都不能很好地告诉您差异在哪里。Saxon 有一个扩展 saxon:deep-equal() 试图报告差异,但老实说(作为它的作者)输出并不总是容易理解的。
对于测试,我首选的方法是用一组必须满足的 XPath 断言来表达预期的测试结果。这样可以轻松排除允许变化的内容(例如取决于日期和时间的内容),并且通过了解哪个断言失败,您可以更轻松地确定问题的原因。
考虑使用 XSpec 进行测试。
推荐阅读
- android - 确保 gradle 依赖项在 app bundle 中包含 32 位和 64 位库
- c++ - 排队或不排队以获得低延迟
- kotlin - 如果在 flatMap { ... } 映射器函数中进行阻塞操作是安全的?
- c++ - 如何使用 Rcpp 就地缩放 NumericMatrix?
- xamarin - Xamarin:Xamarin Google Map 始终显示 Xamarin.Forms.GoogleMaps 而不是加载地图
- linux - 如何了解 GNU 并行一次可以运行的最大进程数?
- web-crawler - 如何使用 nightmare.js 拒绝自动访问此页面
- websocket - 如何使用 Adonis 的 websocket 中间件返回 401 错误
- dynamics-crm - 在 Microsoft Dynamics CRM 实体中显示特定字段更改的查询
- hadoop - hdfs如何计算已用(剩余)空间配额?如何将小文件存储在hdfs中?