首页 > 解决方案 > 如何在 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 文件.

如果您对我的问题有更好的解决方案,我会很高兴听到它。

标签: c#xmlxsd

解决方案


如果您想测试给定文件是否与某个参考文件“相同”,我认为模式验证不是该工作的正确工具——尽管它是一个有趣的选项,尤其是对于 XSD 1.1 断言。

最常见的两种方法是

(a) 将两个文件都转换为规范的 XML 格式,并将它们作为字符串进行比较

(b) 使用fn:deep-equal()函数将它们作为树进行比较,使用 XPath 2.0+。

不幸的是,这两种方法都不能很好地告诉您差异在哪里。Saxon 有一个扩展 saxon:deep-equal() 试图报告差异,但老实说(作为它的作者)输出并不总是容易理解的。

对于测试,我首选的方法是用一组必须满足的 XPath 断言来表达预期的测试结果。这样可以轻松排除允许变化的内容(例如取决于日期和时间的内容),并且通过了解哪个断言失败,您可以更轻松地确定问题的原因。

考虑使用 XSpec 进行测试。


推荐阅读