2010-12-10 7 views
11

Ich verwende derzeit ein Stück XML wie folgtJava XStream - Ignorieren-Tag, das in XML existiert nicht

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

Was ich mit stecke, wird bei der Verwendung von XStream Ich brauche sicher ignorieren zu können, Tags, die angezeigt werden (im Fall oberhalb von 'FavOS') Diese Tags sind möglicherweise nicht bekannt oder werden in der Zukunft geändert. Gibt es eine Möglichkeit, alle Tags zu ignorieren, die nicht mit denen übereinstimmen, die derzeit implementiert sind?

(Mit XStream 1.3.1)

Antwort

16

(Abnahmeprüfung CustomMapperTest.testCanBeUsedToOmitUnexpectedElements() sehen) Wie es dauerte mehr als 15 Minuten, um diese Antwort zu finden Ich dachte, ich würde es posten.

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

Dies scheint XML-Elemente zu überspringen, die nicht in Ihren Objekten sind.

+0

funktionierts wenn Sie den Namen des Feldes Sie – ziggy

+1

Ja, es funktioniert ignorieren möchte nicht wissen ..... – markthegrea

0

Vom x-stream FAQ:

Wie funktioniert XStream Deal mit neueren Versionen von Klassen?

  • Wenn ein neues Feld in der Klasse hinzugefügt wird, eine alte Version Deserialisieren wird das Feld nicht initialisierten verlassen.
  • Wenn ein Feld aus der Klasse entfernt wird, verursacht das Deserialisieren einer alten Version, die das Feld enthält, eine Ausnahme. Wenn Sie das Feld an seinem Platz belassen, es aber als vorübergehend deklarieren, vermeiden Sie die Ausnahme, aber XStream versucht nicht, es zu deserialisieren.
  • ...
  • eine benutzerdefinierte Mapper implementieren automatisch unbekannte Felder zu ignorieren
+1

prost, das habe ich um eine Jagd haben und scheint ein Problem zu sein seit 2004 – Qwan

4

Zunächst einmal, vielen Dank für Ihre Antwort. Es war sehr nützlich. Der oben erwähnte Code weist jedoch Probleme auf. Es hat keine @Override-Annotationen, die ein Muss sind, um dieses Stück Code zu verwenden. Hier ist der aktualisierte Code, der funktioniert:

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 unterstützt den Umgang mit Tags, die nicht implementiert sind. Verwenden Sie ignoreUnknownElements für Tags, die noch nicht implementiert oder entfernt wurden und Sie mit alten XML befassen. Sie können auch angeben, welches bestimmte Tag ignoriert werden soll.

0

Seit XStream 1.4.5 durring Einweiser Erklärung reicht es ignoreEnknownElements zu verwenden() -Methode:

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

um unnötigen Elemente zu ignorieren.

0

Ich fragte nach genau dem gleichen Problem.

How can I make a XStreamMarshaller skip unknown binding?

Und ich habe einen Kommentar Beitrag zu verknüpfen.

Ich löste das mein Problem durch die Erweiterung der XStreamMarshaller.

public class ExtendedXStreamMarshaller extends XStreamMarshaller { 

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