Как правильно обрабатывать объект, который является экземпляром класса в apache.xerces? - PullRequest
1 голос
/ 23 марта 2010

Предисловие: Я работаю над анализатором docx для Java. Формат DOCX основан на XML. Когда я читаю документ, его части разбираются (с JAXB). И я получаю дерево определенных элементов на основе разметки XML.

Почти проблема : Но некоторые элементы (которые находятся на очень глубоком уровне XML) возвращаются не как определенный класс из спецификации docx (т.е. CTStyle, CTDrawing, CTInline и т. Д.), А как Object. Эти объекты действительно являются экземплярами классов Xerces, например, ElementNSImpl.

Проблема : Как мне обрабатывать объекты из ксероксов (например, ElementNSImpl)? Самый простой подход:

CTGraphicData gData = getGraphicData ();
Object obj = gData.getAny().get(0);
ElementNSImpl element = (ElementNSImpl)obj;

Но, похоже, это не хорошее решение. Я никогда не работал с Xerces напрямую. Какой лучший способ сделать это кастинг? (Если бы кто-нибудь также дал мне совет о правильном способе итерации по узлам, было бы здорово).

1 Ответ

3 голосов
/ 23 марта 2010

Поскольку у XSD было 'any', JAX-B отображает этот фрагмент XML в DOM. Вы должны использовать «Элемент», а не «ЭлементNSImpl». Затем вы должны использовать DOM API, возможно, с помощью XPath, чтобы получить данные.

Если JAXB предоставляет вам элементы, и вы думаете, что схема имеет определенный тип, а не xs: any, тогда что-то не так с настройкой JAX-B.

xs: любое значение в XSD означает «что угодно».

Элемент позволяет нам расширить XML-документ с элементами не указывается схемой.

...