Мне нужно использовать веб-сервис .NET из приложения Java.Совместимость между ними обычно очень хорошая.Проблема, с которой я сталкиваюсь, заключается в том, что разработчик приложений .NET решил предоставлять данные с помощью объекта .NET DataSet.Есть много статей, написанных о том, почему вы не должны делать это и как это затрудняет взаимодействие:
Моя проблема в том, что, несмотря на то, что это не рекомендуемая практика, я застрял с необходимостью использовать веб-сервис, возвращающий DataSet с Java.Когда вы генерируете прокси-сервер для чего-то подобного с чем-то отличным от .NET, вы в основном получаете объект, который выглядит следующим образом:
@XmlElement(namespace = "http://www.w3.org/2001/XMLSchema", required = true)
protected Schema schema;
@XmlAnyElement(lax = true)
protected Object any;
Это первое поле представляет собой фактическую схему, которая должна описывать DataSet.Когда я обрабатываю это, используя JAX-WS и JAXB в Java, он представляет всю XS-схему как объекты Java, которые будут представлены здесь.Ходить по дереву объектов JAXB возможно, но не красиво.Любое поле представляет необработанный XML для DataSet, который находится в схеме, указанной схемой.
Структура набора данных довольно непротиворечива, но типы данных меняются.Мне нужен доступ к информации о типе, и схема меняется от звонка к звонку.У меня есть несколько вариантов, но ни один из них не кажется «хорошим».
- Попытка генерировать объекты Java из схемы с использованием JAXB во время выполнения кажется плохой идеей.Это будет слишком медленно, так как это должно происходить каждый раз.
- Грубое форсирование обхода дерева схемы с использованием объектов JAXB, которые принес JAX-WS.
- Возможно, вместо использования JAXB для анализаСхему было бы проще использовать в качестве XML и использовать XPath, чтобы попытаться найти нужную мне информацию о типе.
Существуют ли другие варианты, которые я не рассматривал?Существует ли библиотека Java для простого анализа объектов DataSet?Что сделали другие люди, у которых могут быть подобные ситуации?