从工具的角度来看,QTAssistant(我与它相关联)有一个名为 Query for XSD Analysis 的组件,它应该可以帮助您完成所描述的内容。事实上,有一篇关于您的主题的操作指南:XSD Complexity Analysis。
好消息:您可以构建任何可能的报告,因为该工具基于一个模型,该模型捕获了 XSD 1.0 语言及其模式的所有方面,进而可以通过 SQL 进一步处理和查询任何内容统计数据和您可能想到的模式。它被广泛用于(到目前为止)满足以下标准的组织中:经常处理使用 XSD 表达的大型模型,并要求遵守内部或行业组织定义的 XSD 设计指南。
警告:您需要了解 SQL;它是各种 Transact-SQL(我们提供参考 here),带有一些扩展,例如 RegEx 支持(.NET 的变种)、拼写检查(不太确定德语,但肯定有办法支持它),等等。它可以处理非常大的 XSD(与我处理过的相比,20,000 真的不算什么),但是您可能需要更现代的硬件。
例如,如果您想知道复杂类型的数量:
SELECT count(*) from XSComplexType
如果您想了解有关属性数量的指标,我将不得不问:PSVI 集(来自此复杂类型及其基本类型的所有属性的集合)或仅在复杂类型级别定义的那些(来自创作视角)?
适用于所有用途:
Select count(*) As [Total Attributes],
XSComplexType.LocalName,
XSComplexType.Namespace
From XSComplexTypeAttributeUses
Inner Join XSComplexType
On XSComplexType.RowId = XSComplexTypeAttributeUses.XSComplexTypeRowId
Group By XSComplexType.LocalName,
XSComplexType.Namespace
无论如何,对于更复杂的查询(因为模型是高度规范化的),您可以使用内置模型浏览器和查询生成器的帮助:
基于为此投入的大量工作,我认为 XSD 复杂性分析可能并不那么容易实现 - 当然,如果想要为用户提供模式分析和报告的通用解决方案。
如果我必须破解它并且只针对您询问的数字,我会选择 .NET 的 API 来处理 XSD。
从加载和编译的XmlSchemaSet开始。
要计算复杂类型的数量:遍历XmlSchemaSet.GlobalTypes.Values 并计算XmlSchemaComplexType 的所有实例。如果您的架构使用变色龙模式,则需要更多的工作。
要计算每个复杂类型的属性数量:从XmlSchemaComplexType.AttributeUses 开始。跟踪数字以提取您需要的统计数据(最小/最大/平均)。如果要计算为每种类型定义的属性,则需要做更多的工作,因为您必须查看 Attributes 属性,与 AttributeUses 不同,该属性可能包含对属性组的引用。并考虑 use=prohibited 场景(即,在继承场景中,应该减少属性的数量等)
对于继承树,对于您感兴趣的每种类型,请遵循 PSVI BaseXmlSchemaType 属性 - 确保您没有处理重新定义,在这种情况下您必须在那里使用特殊逻辑。在遍历基本类型时(当基本类型名称在 http://www.w3.org/2001/XMLSchema 命名空间中时停止),跟踪深度,然后计算平均深度。
您也可以使用Apache's XSOM library 用Java 编写它。我更喜欢 .NET,因为我个人觉得它更适合“黑客”工作。使用 Python,如果您像 XML 一样处理它,您仍然可以。我什至可以使用 XSLT 或 XQuery 编写它。尽管如此,我还是会选择一个专门的 XSD 处理器,以利用验证和 PSVI。