2009-12-10 1 views
1

Предположим, у меня есть doc.xml и соответствующий doc.xsd. Я использую xpath для извлечения некоторых узлов, поэтому я получаю список org.w3c.dom.Node. Как я могу получить тип каждого узла из схемы, например. xs: integer, xs: string и т. д.?Как получить тип xml Node на основе определения схемы в Java?

Некоторое решение должно заключаться в анализе схемы с запросом xpath «// NodeName [@type]» с использованием node.getNodeName() как NodeName, но это не идеально. Я не могу быть уверен, что схема элегантная - что, если NodeName существует во многих местах схемы и не было извлечено как отдельный тип?

Как правило, я ищу надежное решение для получения типа узла для ЛЮБОГО действительного xml & xsd.

+0

Вся идея, которую я ищу, чтобы стать альтернативой для генерации класса. Проблема в том, что схема часто меняется, и я не могу позволить себе обновлять обновленный код. Думаю, я надеялся использовать стандартную проверку схемы и использовать ее часть на своем собственном дворе. В конце концов, мне не нужно отображать типы xsd для типов java, все, что мне нужно, это информация об атрибуте «type» соответствующего элемента из схемы. – wilczarz

ответ

0

К сожалению, типы, определенные в XML-схеме (XSD) или определении типа документа (DTD), напрямую не привязаны к документу XML, который они проверяют. Элементы и атрибуты в XML-документе по сути не имеют типа, они просто текст. Подумайте о XSD как сценарии, который проверяет XML-документ, а не набор аннотаций типа для элементов и атрибутов.

Спецификация XML не определяет типы, как вы думаете о них здесь. Даже определения типа документа (DTD), которые могут быть встроены в документы XML, больше о структуре документа, а не типе данных, содержащихся в элементах и ​​атрибутах.

Система типов, описанная в XML-схеме, является необязательным уровнем проверки, который может применяться к документам XML. Поскольку эта валидация необязательна, стандартные XML-API не обеспечивают способ привязки правил проверки в XSD к фактическим атрибутам и элементам.

Я думаю, что XML API может предоставить механизм для привязки XSD к определенному XML-документу, но я не знаю об XML-синтаксическом анализаторе, который это делает. Одна из причин, почему это не так просто, заключается в том, что система типов, определенная в XML-схеме, намного богаче, чем поддерживается на большинстве основных языков программирования. В вашем примере вас могут интересовать только xs: integer, xs: string и т.п., но в XML Schema вы можете создавать типы, которые определяют диапазоны, шаблоны и другие вещи, которые просто невозможны с типами данных на большинстве языков программирования. Представить эту сложную систему типов в Java или любом языке программирования необходимо было бы выполнить с помощью довольно сложного API. Вопрос в том, действительно ли это стоит? Я бы сказал, наверное, нет.

1

Вам следует рассмотреть возможность использования JAXB. Он создаст классы Java для вас на основе типа схемы. Затем ваши XML-документы считываются в эти классы, которые вводятся в соответствии с тем, как вы определили свой XSD. Поэтому xsd: int отображает java int (или класс оболочки Integer, я не могу вспомнить) и т. Д.

1

Отправляйте свои элементы DOM в TypeInfo: оттуда вы можете получить информацию о типе, который вы ищете.

0

Согласно David Ds ответ, немного чище, вызовите getSchemaTypeInfo() на элемент или атрибут