2010-12-10 8 views
11

В настоящее время я использую кусок XML как следующийJava XStream - игнорировать тег, который не существует в XML

<Person> 
    <Name>Frank Smith</Name> 
    <Id>100023412</Id> 
    <DOB>12/05/1954</DOB> 
    <LasLogin>01/09/2010</LasLogin> 
    <FavOS>Windows</FavOS>  // Wild card that may occasionally appear 
</Person> 

То, что я застрял с, как при использовании XStream мне нужно, чтобы иметь возможность игнорировать определенные теги, которые появляются (в случае выше «FavOS») Эти теги могут быть неизвестны или изменены в будущем. Есть ли способ игнорировать все теги, которые не соответствуют тому, что в настоящее время реализовано?

(с использованием XStream 1.3.1)

ответ

16

Как мне потребовалось более 15 минут, чтобы найти этот ответ , Я думал, что опубликую его.

XStream xstream = new XStream(new DomDriver()) { 
      protected MapperWrapper wrapMapper(MapperWrapper next) { 
       return new MapperWrapper(next) { 
        public boolean shouldSerializeMember(Class definedIn, String fieldName) { 
         try { 
          return definedIn != Object.class || realClass(fieldName) != null; 
         } catch(CannotResolveClassException cnrce) { 
          return false; 
         } 
        } 
       }; 
      } 
     }; 

Это, кажется, пропускает элементы xml, которых нет в ваших объектах.

+0

ли эту работу, если вы не знаете имя поля, которое нужно игнорировать – ziggy

+1

Да, это делает ..... – markthegrea

0

От x-stream FAQ:

Как XStream дело с новыми версиями классов?

  • Если новое поле добавляется в класс, десериализации старой версии оставит поле неинициализированным.
  • Если поле удалено из класса, десериализация старой версии, содержащей это поле, приведет к исключению. Оставляя поле на месте, но объявляя его временным, избегает исключения, но XStream не будет пытаться десериализовать его.
  • ...
  • реализации пользовательского картографа, чтобы игнорировать неизвестные поля автоматически (см тест приемки CustomMapperTest.testCanBeUsedToOmitUnexpectedElements())
+1

веселит, я имел охоту вокруг и, кажется, проблема с 2004 года – Qwan

4

Прежде всего, спасибо, что поделились этим ответом. Это было очень полезно. Однако упомянутый выше код имеет проблемы. В нем нет аннотаций @Override, которые необходимы для использования этого фрагмента кода. Вот обновленный код, который работает:

XStream xstream = new XStream(new StaxDriver()) { 
      @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); 
       } 
      }; 
      } 
     }; 
6

XStream 1.4.5 поддерживает работу с тегами, которые не реализованы. Используйте ignoreUnknownElements для тегов, которые еще не реализованы или были удалены, и вы имеете дело со старым xml. Вы также можете указать, какой конкретный тег вы хотите игнорировать. Метод

0

С XStream 1.4.5 durring декларации ИАС этого достаточно, чтобы использовать ignoreEnknownElements():

XStreamMarshaller marshaller = new XStreamMarshaller(); 
marshaller.getXStream().ignoreUnknownElements(); 
... 

игнорировать ненужные элементы.

0

Я попросил точно такую ​​же проблему.

How can I make a XStreamMarshaller skip unknown binding?

И я получил комментарий, связывающий этот пост.

Я решил свою проблему, расширив XStreamMarshaller.

public class ExtendedXStreamMarshaller extends XStreamMarshaller { 

    @Override 
    protected void configureXStream(final XStream xstream) { 
     super.configureXStream(xstream); 
     xstream.ignoreUnknownElements(); // will it blend? 
    } 
} 
Смежные вопросы