Java XStream - игнорировать тег, который не существует в XML - PullRequest
11 голосов
/ 10 декабря 2010

В настоящее время я использую фрагмент 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)

Ответы [ 6 ]

16 голосов
/ 04 января 2011

Поскольку мне потребовалось более 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, которых нет в ваших объектах.

6 голосов
/ 15 октября 2013

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

4 голосов
/ 28 сентября 2012

Прежде всего, спасибо, что поделились этим ответом. Это было очень полезно. Тем не менее, код, упомянутый выше, имеет проблемы. Он не имеет аннотаций @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);
              }
            };
          }
        };
0 голосов
/ 12 февраля 2015

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

Как я могу заставить XStreamMarshaller пропустить неизвестное связывание?

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

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

public class ExtendedXStreamMarshaller extends XStreamMarshaller {

    @Override
    protected void configureXStream(final XStream xstream) {
        super.configureXStream(xstream);
        xstream.ignoreUnknownElements(); // will it blend?
    }
}
0 голосов
/ 18 июля 2014

Начиная с XStream 1.4.5 во время объявления маршаллера, достаточно использовать метод ignoreEnknownElements ():

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

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

0 голосов
/ 10 декабря 2010

Из x-stream FAQ :

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

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