2010-12-10 29 views
11

Actualmente utilizo un trozo de XML como el siguienteJava xstream - Ignorar la etiqueta que no existe en 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> 

Lo que estoy atascado con, es cuando se usa xstream que necesito para ser capaz de ignorar ciertos etiquetas que aparecen (en el caso anterior 'FavOS') Estas etiquetas pueden no conocerse o cambiar en el futuro. ¿Hay alguna manera de ignorar todas las etiquetas que no coinciden con lo que se implementa actualmente?

(Usando xstream 1.3.1)

Respuesta

16

Como me tomó más de 15 minutos para encontrar esta respuesta , Pensé que lo publicaría

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; 
         } 
        } 
       }; 
      } 
     }; 

Esto parece saltear los elementos xml que no están en sus objetos.

+0

hace este trabajo si usted no sabe el nombre del campo que desea ignorar – ziggy

+1

sí lo hace ..... – markthegrea

0

Desde el x-stream FAQ:

¿Cómo trata xstream con las nuevas versiones de clases?

  • Si se añade un nuevo campo a la clase, deserializar una vieja versión dejará el campo sin inicializar.
  • Si se elimina un campo de la clase, la deserialización de una versión anterior que contiene el campo provocará una excepción. Dejar el campo en su lugar pero declararlo como transitorio evitará la excepción, pero XStream no intentará deserializarlo.
  • ...
  • implementar un asignador de costumbre de ignorar campos desconocidos de forma automática (ver CustomMapperTest.testCanBeUsedToOmitUnexpectedElements prueba de aceptación())
+1

aplausos, yo tenía una caza alrededor y parece ser un problema desde 2004. – Qwan

4

Antes que nada, gracias por compartir esta respuesta. Fue muy útil. Sin embargo, el código mencionado anteriormente tiene problemas. No tiene anotaciones @Override, que son obligatorias para usar este fragmento de código. Aquí está el código actualizado que funciona:

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 admite el tratamiento de etiquetas que no están implementadas. Use ignoreUnknownElements para las etiquetas que aún no se han implementado o que se han eliminado y está tratando con xml anterior. También puede especificar qué etiqueta particular le gustaría ignorar.

0

Desde xstream 1.4.5 durring declaración marshaller Es suficiente para utilizar ignoreEnknownElements() Método:

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

para ignorar los elementos innecesarios.

0

Pedí exactamente el mismo problema.

How can I make a XStreamMarshaller skip unknown binding?

Y tengo un comentario que une este post.

Resolví mi problema extendiendo el XStreamMarshaller.

public class ExtendedXStreamMarshaller extends XStreamMarshaller { 

    @Override 
    protected void configureXStream(final XStream xstream) { 
     super.configureXStream(xstream); 
     xstream.ignoreUnknownElements(); // will it blend? 
    } 
} 
Cuestiones relacionadas