我已将 xml 发送到网页,我想针对多个 xsd 进行验证,直到文件通过验证。当它验证时,我将无法根据设法验证它的模式来确定 xml 文件的类型。
List<string> xsdList = new List<string>();
xsdList.Add(_path + @"Handlers\DeviceSpecificHandlers\Schemas\Enquiry.xsd");
xsdList.Add(_path + @"Handlers\DeviceSpecificHandlers\Schemas\FingerDeleted.xsd");
xsdList.Add(_path + @"Handlers\DeviceSpecificHandlers\Schemas\Heartbeat.xsd");
xsdList.Add(_path + @"Handlers\DeviceSpecificHandlers\Schemas\Validation.xsd");
XmlSchemaSet schemas = new XmlSchemaSet();
foreach (string schema in xsdList)
{
var reader = new StringReader(File.ReadAllText(schema));
schemas.Add("", XmlReader.Create(reader));
}
request.Validate(schemas, (o, e) =>
{
match = false;
});
任何人都可以提供帮助,以上是我到目前为止拼凑的内容,它目前抛出错误“System.Xml.Schema.XmlSchemaValidationException:全局元素‘interface’已经被声明”
有没有办法返回模式验证成功的结果?
最佳答案
首先,您必须弄清楚哪些 XSD 文件可以放在一个文件集中。您得到的错误告诉您相同的元素“接口(interface)”具有来自两个或多个不同 基本 URI 的定义。
如果您想动态确定集合,那么您需要做一些工作。这是可能的,但这不是微不足道的。这取决于 XSD 文件是否使用组合(包含/导入/重新定义)。如果他们不这样做(简单的场景),那么为了将 XSD 文件放在一起,您必须单独加载每个 XSD 文件,构建所有全局定义的内容(类型、元素、组、属性、属性组)的索引,然后将将集合中的那些组合在一起,使得给定该集合的任何一对单独的 XSD 成员,交集为空。构建集合的策略取决于许多因素,性能和覆盖率只是两个。基于这个简单的案例,您可以看出组合是如何变得重要的,因为现在即使交集不为空,因为如果公共(public)内容来自相同的 URI,则所有意图都将被视为空。
QTAssistant (我与之相关)有一个完整的引擎来处理上述问题,以便在“收集”任意 XSD 内容进行分析、验证等时为其 XML 模式重构引擎设置 XML 模式源集(或集合)。
一旦你弄清楚了这些集合,你就必须对这些模式的构成做出假设。换句话说,什么构成了有效的 XML 文档元素集(有时并不是所有的全局元素定义都是有效的文档元素),以及每个文档元素应该使用什么模式集。很明显,您必须以某种方式处理这个问题,因为您有重复的元素。
如果你想按照你的问题处理它,那么只需循环遍历如上构造的模式集集。
想出关于如何手动找出最佳集的策略的最佳方法可能是可视化 XSD 文件之间的关系。下面是我如何使用我可用的工具查看它的示例,来自 SO 上的另一篇文章。
关于c# - 针对多个模式验证未知 xml,直到找到匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15633786/