2010-12-10 60 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? 
    } 
}