2010-12-10 14 views
11

में मौजूद नहीं है पर ध्यान न दें मैं वर्तमान में निम्नलिखितजावा 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') ये टैग भविष्य में ज्ञात या परिवर्तित नहीं हो सकते हैं। क्या उन सभी टैगों को अनदेखा करने का कोई तरीका है जो वर्तमान में लागू किए गए मेल से मेल नहीं खाते हैं?

उत्तर

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

+1

हाँ यह करता है चाहते हैं उसका नाम जानते हैं कि यह काम करता है एक मुद्दा हो रहा है ..... – markthegrea

0

(Xstream 1.3.1 का उपयोग करना) x-stream FAQ से:

कैसे वर्गों के नए संस्करणों के साथ Xstream सौदा करता है?

  • यदि कक्षा में कोई नया फ़ील्ड जोड़ा जाता है, तो पुराने संस्करण को deserializing क्षेत्र को अनियमित कर दिया जाएगा।
  • यदि कक्षा से कोई फ़ील्ड हटा दिया गया है, तो फ़ील्ड वाले पुराने संस्करण को deserializing एक अपवाद का कारण बन जाएगा। जगह को छोड़कर लेकिन इसे क्षणिक घोषित करने से अपवाद से बच जाएगा, लेकिन XStream इसे deserialize करने की कोशिश नहीं करेगा।
  • ...
  • अज्ञात फ़ील्ड अपने आप की अनदेखी करने के लिए एक कस्टम नक्शाकार लागू (स्वीकृति परीक्षण CustomMapperTest.testCanBeUsedToOmitUnexpectedElements देख())
+1

चियर्स, मैं एक शिकार के आसपास था और 2004 के बाद से – Qwan

4

सबसे पहले, इस उत्तर को साझा करने के लिए धन्यवाद। यह बहुत उपयोगी था। हालांकि, ऊपर वर्णित कोड में समस्याएं हैं। इसमें @ ओवरराइड एनोटेशन नहीं हैं, जो कोड के इस टुकड़े का उपयोग करना आवश्यक है। यहां अद्यतन कोड है जो काम करता है:

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

एक्सस्ट्रीम 1.4.5 टैग्स से निपटने का समर्थन करता है जो कार्यान्वित नहीं किए जाते हैं। उन टैग्स के लिए ignoreUnknownElements का उपयोग करें जिन्हें अभी तक कार्यान्वित नहीं किया गया है या हटा दिया गया है और आप पुराने एक्सएमएल से निपट रहे हैं। आप यह भी निर्दिष्ट कर सकते हैं कि आप किस विशेष टैग को अनदेखा करना चाहते हैं।

0

Xstream 1.4.5 durring marshaller घोषणा के बाद से यह 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? 
    } 
} 
संबंधित मुद्दे