我目前使用的是一段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)
答案 0 :(得分: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项目。
答案 1 :(得分:6)
XStream 1.4.5支持处理未实现的标记。对于尚未实现或已被删除且您正在处理旧xml的标记,请使用ignoreUnknownElements。您还可以指定要忽略的特定标记。
答案 2 :(得分: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);
}
};
}
};
答案 3 :(得分:0)
来自x-stream FAQ:
XStream如何处理更新的问题 类的版本?
- 如果将新字段添加到类中,则反序列化旧版本 将离开现场未初始化。
- 如果从类中删除了某个字段,则反序列化包含该字段的旧版本将导致异常。保留该字段但将其声明为瞬态将避免异常,但XStream不会尝试对其进行反序列化。
- ...
- 实现自定义映射器以自动忽略未知字段(请参阅验收测试CustomMapperTest.testCanBeUsedToOmitUnexpectedElements())
答案 4 :(得分:0)
由于XStream 1.4.5在marshaller声明中使用ignoreEnknownElements()方法就足够了:
XStreamMarshaller marshaller = new XStreamMarshaller();
marshaller.getXStream().ignoreUnknownElements();
...
忽略不必要的元素。
答案 5 :(得分: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?
}
}