如何在 C# 中基于 XML 文件创建具有严格值验证的 XSD 文件
How to create a XSD file with strict value validation based on a XML File in C#
我有未定义数量的 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();
这有效,但是它只创建一个 XSD 文件来验证 XML 文件的结构,我想要一个 XSD 文件也验证 XML 文件,有没有办法根据 XML 文件自动创建 XSD 文件。
如果你对我的问题有更好的解决方案,我会很高兴听到。
如果您想测试给定文件是否与某个参考文件“相同”,我认为模式验证不是适合这项工作的工具 - 虽然这是一个有趣的选择,尤其是 XSD 1.1 断言。
两种最常见的方法是
(a) 将两个文件都转换为规范的 XML 格式并将它们作为字符串进行比较
(b) 使用 fn:deep-equal()
函数将它们作为树进行比较,使用 XPath 2.0+。
不幸的是,这两种方法都不能很好地告诉您差异在哪里。 Saxon 有一个扩展 saxon:deep-equal() 试图报告差异,但老实说(作为其作者)输出并不总是容易理解。
对于测试,我的首选方法是根据一组必须满足的 XPath 断言来表达预期的测试结果。这使得排除允许变化的东西(例如取决于日期和时间的东西)变得容易,并且通过知道哪个断言失败,您可以更容易地确定问题的原因。
考虑使用 XSpec 进行测试。
我有未定义数量的 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();
这有效,但是它只创建一个 XSD 文件来验证 XML 文件的结构,我想要一个 XSD 文件也验证 XML 文件,有没有办法根据 XML 文件自动创建 XSD 文件。
如果你对我的问题有更好的解决方案,我会很高兴听到。
如果您想测试给定文件是否与某个参考文件“相同”,我认为模式验证不是适合这项工作的工具 - 虽然这是一个有趣的选择,尤其是 XSD 1.1 断言。
两种最常见的方法是
(a) 将两个文件都转换为规范的 XML 格式并将它们作为字符串进行比较
(b) 使用 fn:deep-equal()
函数将它们作为树进行比较,使用 XPath 2.0+。
不幸的是,这两种方法都不能很好地告诉您差异在哪里。 Saxon 有一个扩展 saxon:deep-equal() 试图报告差异,但老实说(作为其作者)输出并不总是容易理解。
对于测试,我的首选方法是根据一组必须满足的 XPath 断言来表达预期的测试结果。这使得排除允许变化的东西(例如取决于日期和时间的东西)变得容易,并且通过知道哪个断言失败,您可以更容易地确定问题的原因。
考虑使用 XSpec 进行测试。