Java XStream - 忽略XML中不存在的标记

时间:2010-12-10 14:24:10

标签: 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)

6 个答案:

答案 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?
    }
}