2015-11-11 3 views
1

В настоящее время я столкнулся с очень большим XSD-файлом, состоящим из более чем 20000 строк кода. Файл верхнего уровня XSD использует включает в себя:Количество вхождений сложных типов в XML-схему

<?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, что угодно), чтобы получить эти цифры?

ответ

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 

Во всяком случае, для более сложных запросов (поскольку модель весьма нормализуется), вы можете воспользоваться помощью встроенной в браузере модели и построитель запросов:

QTAssistant QXSD screenshot

Основываясь на объеме работы, вложенной в это, я бы подумал, что анализ сложности 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.