2009-10-15 2 views
2

У нас есть XML, который нужно преобразовать в объект и наоборот. Что-то вроде Xstream. До сих пор мы использовали Xstream для маршалла и unmarshall объекта/xml. Однако проблема в том, что объект, соответствующий XML в xstream, должен иметь все теги в качестве атрибутов; else if XML содержит любые дополнительные теги, которых нет в объекте; он бомбит.Подходящий XML-маршаллер и Unmarshaller

Или у нас должны быть настроены пользовательские преобразователи, чтобы убедиться, что операция идет по желанию. Мне также было предложено, чтобы обычный генератор позволял Xpath анализировать XML с объекта.

Мне интересно, какой лучший подход;

  1. Я просто хочу преобразовать XML в объект и наоборот.
  2. Имейте возможность молча игнорировать любые поля в XML, которые не отображаются в объекте сопоставления.

Что вы предлагаете?

+0

+1: Это важно при работе с несколькими версиями данных. Предполагая, что новая версия имеет больше атрибутов и в противном случае обратная совместимость с программным обеспечением, ожидающим старую версию, вы хотите, чтобы новый XML был немаркирован в старый объект. Вам нужен клиент, ожидающий, что более старая версия объекта с меньшим количеством атрибутов будет удалена из XML, который был –

+0

. Я понимаю вашу точку зрения, и это тоже мое намерение. Однако есть ли какая-то система, способная сделать это с наименьшими усилиями. Как я уже сказал, в Stream мне придется писать конвертеры. Есть что-то еще; который помогает в этом аспекте более плавно. Я не знаю всех структур, которые могут помочь в этом. – Priyank

ответ

0

Я предложил бы использовать http://simple.sourceforge.net/ я использую аннотации для отображения атрибутов и элементов и имеет «строго запрещен» режим, который позволяет считывать из документа XML, игнорируя все атрибуты и элементы, не присутствующие в объекте Java.

+0

Зачем использовать проприетарное решение, такое как Simple, когда вы можете использовать и отраслевой стандарт, например JAXB, http://bdoughan.blogspot.com/2010/07/jaxb-xml-binding-standard.html –

+0

Я думаю, вы неправильно поняли, что слово принадлежит собственнику , Simple имеет более либеральную лицензию (Apache). Кроме того, вы можете сделать больше с помощью Simple, чем вы можете с JAXB. Наконец, его проще в использовании, быстрее, легче и работает на Andriod, GAE и любой Java 1.5+ VM. –

2

Вы должны использовать пользовательские MapperWrapper как описано здесь http://pvoss.wordpress.com/2009/01/08/xstream/

XStream xstream = new XStream() { 
    @Override 
    protected MapperWrapper wrapMapper(MapperWrapper next) { 
    return new MapperWrapper(next) { 
     @Override 
     public boolean shouldSerializeMember(Class definedIn, 
       String fieldName) { 
     if (definedIn == Object.class) { 
      return false; 
     } 
     return super.shouldSerializeMember(definedIn, fieldName); 
     } 
    }; 
    } 
}; 

Единственное, что она делает это сказать XStream игнорировать все поля, которые он не знает, чтобы иметь дело с.

+0

Или вы можете использовать JAXB, который дает желаемое поведение по умолчанию. –

Смежные вопросы