С точки зрения оснастки 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 может быть не так прост в достижении - конечно, если вы хотите предоставить пользователю общее решение для анализа схемы и отчетности.
Если мне придется взломать его и только для номеров, которые вы задали, я бы выбрал API .NET для обработки XSD.
Начать загрузку и сборку XmlSchemaSet.
Рассчитать количество сложных типов: loop through XmlSchemaSet.GlobalTypes. Значения и подсчет всех экземпляров XmlSchemaComplexType. Это требует больше работы, если ваша схема использует шаблон хамелеона.
Чтобы подсчитать количество атрибутов на комплексный тип: начните с XmlSchemaComplexType.AttributeUses. Следите за числами, чтобы извлечь нужную статистику (мин/макс/средний). Если вы хотите подсчитать атрибуты, определенные для каждого типа, у вас больше работы, так как вы должны посмотреть на свойство Attributes, которое, в отличие от AttributeUses, может содержать ссылки на группы атрибутов. И рассмотрите сценарий использования = запрет (т. Е. В сценарии наследования, который должен уменьшить количество атрибутов и т. Д.)
Для деревьев наследования для каждого типа, который вас интересует, следует за имуществом PSVI BaseXmlSchemaType - make убедитесь, что вы не имеете дело с redefines, и в этом случае вам нужно использовать специальную логику. По мере прохождения базовых типов (остановитесь, когда имя базового типа находится в пространстве имен http://www.w3.org/2001/XMLSchema), отслеживайте глубину и, следовательно, вычисляйте среднюю глубину.
Вы также можете написать его на Java, используя Apache's XSOM library. Я предпочитаю .NET как лично, я считаю, что он лучше подходит для «хакерских» заданий. С Python вы все еще можете, если вы обрабатываете его, как XML. Я мог бы написать его даже с помощью XSLT или XQuery. Тем не менее, я бы выбрал специализированный XSD-процессор, чтобы воспользоваться валидацией и PSVI.