2010-12-10 69 views
11

存在标签我目前使用的是一块XML像下面的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)

回答

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项目。

+0

这是否工作..... – ziggy 2014-04-04 11:42:46

+1

是它的字段的名称,2004年 – markthegrea 2014-04-04 19:02:50

0

x-stream FAQ

如何XStream的处理新 版本的类?

  • 如果将新字段添加到类中,则反序列化旧版本 会使该字段未初始化。
  • 如果从类中删除一个字段,则反序列化包含该字段的旧版本将导致异常。将字段留在原地但将其声明为暂时的将避免该异常,但XStream不会尝试对其进行反序列化。
  • ...
  • 实现自定义映射器自动忽略未知领域(见验收测试CustomMapperTest.testCanBeUsedToOmitUnexpectedElements())
+1

欢呼声中,我也有各地狩猎,似乎是一个问题,因为如果你不知道要忽略 – Qwan 2010-12-14 10:32:19

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

XStream 1.4.5支持处理未实现的标记。使用ignoreUnknownElements表示尚未实现或已被移除的标记,并且您正在处理旧的xml。您也可以指定您想要忽略的特定标签。

0

由于XStream的1.4.5 durring编组声明它足以使用ignoreEnknownElements()方法:

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

忽略不必要的元素。

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