2012-05-23 11 views
7

मैं के विपरीत करने के लिए कोशिश कर रहा हूँ पर JAXB त्रुटि बनाओ: है यही कारण है कि मैं एक POJO को JAXB के साथ एक्सएमएल पार्स करने का प्रयास कर रहा हूँ JAXB - Ignore elementगैर मैप किया तत्वों

और मैं अगर यह नहीं करता है विफल JAXB करना चाहते हैं किसी दिए गए तत्व के लिए मिलान करने वाली जावा प्रॉपर्टी ढूंढें। मुझे पता है कि मैं शायद स्कीमा सत्यापन कर सकता हूं लेकिन मैं ऐसा नहीं करूँगा।

उदाहरण:

@XmlRootElement(name="Dog") 
public class Dog { 
    private String name; 
    public String getName() {return name;} 
    public String setName(String name) {this.name = name}; 
} 

यह XML विफल हो जाएगा:

<Dog> 
<id>blah</id> 
<name>Stuff</name> 
</Dog> 

क्योंकि वहाँ कोई id जावा संपत्ति है

+0

मैं आप प्राप्त कर सकते है, तो JAXB का उपयोग कर कि पता नहीं है। हालांकि, यह एक्सस्ट्रीम का डिफ़ॉल्ट व्यवहार है। – tibtof

+0

इकाई परीक्षण उद्देश्यों के लिए यह और अधिक है। मुझे शायद एक्सएमएलयूनीट का उपयोग करना होगा, एक्सएमएल को अनमर्शल करना होगा और उसके बाद इसे फिर से देखें और तुलना करें कि मैंने पहले क्या किया है। –

उत्तर

0

एक ही रास्ता मुझे याद आ जावा गुण मान्य करने के लिए सक्षम किया गया है (डब्ल्यू/ओ स्कीमा) एक्सएमएल को अपने पीओजेओ में अनमर्शल करना है, फिर उसी पीओजेओ का उपयोग करके इसे एक्सएमएल में रीमर्शल करें और तुलना करें।

नीचे XMLUnit का उपयोग करके एक उदाहरण है जो ऑर्डर और व्हाइटस्पेस समस्याओं को अनदेखा करने में मदद करता है।

@Test 
public void testSerialization() throws Exception { 
    XMLUnit.setIgnoreWhitespace(true); 

    EventSearchResults r = 
      JAXB.unmarshal(getClass().getResourceAsStream("/EventSearchResults.xml"), 
        EventSearchResults.class); 
    StringWriter sw = new StringWriter(); 
    JAXB.marshal(r, sw); 
    String expected = 
      IOUtils.toString(getClass().getResourceAsStream("/EventSearchResults.xml"), "UTF-8"); 
    String actual = sw.toString(); 
    //System.out.println(expected); 
    System.out.println(actual); 
    assertXMLEqual(expected, actual); 
} 

यह आदर्श नहीं है लेकिन अधिकांश भाग यूनिट परीक्षण के लिए काम करता है।

3

आप जिस व्यवहार को ढूंढ रहे हैं उसे प्राप्त करने के लिए आप ValidationEventHandler का लाभ उठा सकते हैं। एक अप्रत्याशित तत्वों को एक चेतावनी के रूप में माना जाता है जिसे डिफ़ॉल्ट रूप से अनदेखा किया जाता है। अपने उपयोग के मामले का समर्थन करने के लिए आप ValdidationEventHandler आपूर्ति कर सकते हैं जो चेतावनियों पर विफल रहता है (नीचे देखें)।

डेमो

package forum10721257; 

import java.io.File; 
import javax.xml.bind.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Dog.class); 

     File xml = new File("src/forum10721257/input.xml"); 
     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     unmarshaller.setEventHandler(new ValidationEventHandler() { 

      @Override 
      public boolean handleEvent(ValidationEvent event) { 
       return false; 
      } 

     }); 
     Dog dog = (Dog) unmarshaller.unmarshal(xml); 
    } 

} 

JAXB आरआई अपवाद

Exception in thread "main" javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"id"). Expected elements are <{}name> 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:647) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:243) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:238) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:105) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.childElement(Loader.java:90) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.StructureLoader.childElement(StructureLoader.java:236) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:483) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:465) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:135) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:506) 
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:376) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2715) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:607) 
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:116) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:488) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:835) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764) 
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1210) 
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:568) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:202) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:174) 
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:157) 
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:162) 
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:171) 
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:189) 
    at forum10721257.Demo.main(Demo.java:26) 

EclipseLink JAXB (MOXY)

हमने हाल ही में MOXY को यह व्यवहार गयी। आपको EclipseLink 2.4.0 या 2.3.3 का उपयोग करने की आवश्यकता होगी। एक रात का निर्माण निम्न स्थान से प्राप्त किया जा सकता:


अद्यतन

मैं अपने प्रश्न से Dog वर्ग बदलाव करने की जरूरत है। नीचे मैंने जो इस्तेमाल किया है।

कुत्ता

package forum10721257; 

import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement(name="Dog") 
public class Dog { 
    private String name; 
    public String getName() {return name;} 
    public void setName(String name) {this.name = name;} 
} 
+1

हम्म मैंने कोशिश की और यह काम नहीं किया (माना जाता है कि यह मोक्सी नहीं था)।मुझे इसे फिर से कोशिश करनी होगी। बीटीडब्ल्यू मैंने डायनामिक एक्सएमएल एलिमेंट्स के लिए अपनी चाल का उपयोग किया: http://blog.bdoughan.com/2012/02/xmlanyelement-and-xmladapter.html। जब आप JAXB की बात करते हैं तो आप घूमते हैं :) –

+0

मैंने पोस्ट अपवाद प्राप्त करने के लिए जेडीके 1.7.0 (मैक के लिए) में यह सटीक कोड चलाया। आप जेडीके का किस संस्करण का उपयोग कर रहे हैं? –

+0

जेडीके 1.6 मैं जल्द ही इसे फिर से कोशिश करूंगा। मुझे लगता है कि ऐसा इसलिए था क्योंकि जिस तरह से मैं संदर्भ बना रहा था। –

संबंधित मुद्दे