目前,我正面临着一个非常大的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等编程语言)来获取这些数字?
答案 0 :(得分: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。值并计算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。