【问题标题】:Count occurrences of complex types in a XML schema计算 XML 模式中复杂类型的出现次数
【发布时间】:2015-11-11 16:41:35
【问题描述】:

目前,我面临一个非常大的 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 等编程语言)来获取这些数字?

【问题讨论】:

    标签: xml xsd metrics


    【解决方案1】:

    从工具的角度来看,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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-19
      • 1970-01-01
      • 2016-10-15
      • 2012-01-10
      • 2021-12-16
      • 2017-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多