计算 XML 模式中复杂类型的出现次数

Count occurrences of complex types in a XML schema

目前,我面临着一个非常大的 XSD 文件,其中包含超过 20000 行代码。顶级 XSD 文件使用包含:

<?xml version="1.0" encoding="UTF-8"?><schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:okstra="http://schema.okstra.de/2016/okstra" elementFormDefault="qualified" targetNamespace="http://schema.okstra.de/2016/okstra" version="2.016.0">
  <include schemaLocation="Datentypen.xsd"/>
  <include schemaLocation="S_Administration.xsd"/>
  <include schemaLocation="S_Allgemeine_Geometrieobjekte.xsd"/>
  <include schemaLocation="S_Allgemeine_Mengenberechnung.xsd"/>
  <include schemaLocation="S_Allgemeine_Objekte.xsd"/>

我想知道 XML 架构中包含多少复杂类型。此外,我对每个复杂类型的属性的最大、最小和平均数量感兴趣。我也对继承树感兴趣。我想知道复杂类型的继承树的最小深度、最大深度和平均深度。

是否有可以计算此软件指标值的工具?

或者是否有快速破解方法(使用 Python、C#、Java 等编程语言)来获取这些数字?

从工具的角度来看,QTAssistant (I am associated with it) has a component, named Query for XSD Analysis, which should help you with what you've described. In fact, there's a how-to paper which deals exactly with your subject: XSD Complexity Analysis

好处:您可以构建任何可能的报告,因为该工具基于一个模型,该模型捕获 XSD 1.0 语言及其模式的所有方面,反过来,通过 SQL,可以进一步按摩和查询您可能想到的任何统计数据和模式。它被广泛用于(到目前为止)满足以下标准的组织:经常处理使用 XSD 表示的大型模型,并要求遵守内部或行业组织定义的 XSD 设计指南。

警告:你需要知道SQL;它是 Transact-SQL(我们提供参考 here)的变体,带有一些扩展,例如 RegEx 支持(.NET 的变体)、拼写检查(对德语不太确定,但肯定有支持它的方式)等。它可以处理非常大的 XSDs(与我处理过的相比,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 来处理 XSDs。

从加载和编译的文件开始 XmlSchemaSet

计算复杂类型的数量:遍历XmlSchemaSet.GlobalTypes.Values and count all instances of XmlSchemaComplexType。如果您的架构使用变色龙模式,则需要做更多的工作。

要计算每个复杂类型的属性数:从 XmlSchemaComplexType.AttributeUses 开始。跟踪数字以提取您需要的统计数据 (min/max/avg)。如果要计算为每种类型定义的属性,则需要做更多的工作,因为您必须查看属性 属性,与 AttributeUses 不同,它可能包含对属性组的引用。并考虑 use=prohibited 场景(即在继承场景中,应该减少属性的数量等)

对于继承树,对于您感兴趣的每种类型,请遵循 PSVI BaseXmlSchemaType property - make sure that you're not dealing with redefines, in which case you have to use special logic there. As you traverse the base types (stop when the base type name is in the http://www.w3.org/2001/XMLSchema 命名空间),跟踪深度,然后计算平均深度。

您也可以使用 Apache's XSOM library 将其写在 Java 中。我更喜欢 .NET,因为我个人认为它更适合 "hack" 工作。使用 Python,你仍然可以,如果你像 XML 那样处理它。我什至可以使用 XSLT 或 XQuery 编写它。尽管如此,我还是会选择一个专门的 XSD 处理器,以利用验证和 PSVI。