2012-05-23 10 views
7

ich das Gegenteil von dem zu tun, ich versuche: JAXB - Ignore elementStellen JAXB Fehler auf nicht kartiert Elemente

Dass ich XML mit JAXB zu einem POJO zu analysieren ich versucht, und ich JAXB wollen fehlschlagen, wenn es nicht Finden Sie eine passende Java-Eigenschaft für ein bestimmtes Element. Ich weiß, dass ich wahrscheinlich eine Schema-Validierung machen könnte, aber das würde ich lieber nicht tun.

Beispiel:

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

Diese XML würde fehlschlagen:

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

Da es keine id Java-Eigenschaft ist

+0

Ich weiß nicht, ob Sie, dass die Verwendung jaxb erreichen können. Dies ist jedoch das Standardverhalten von XStream. – tibtof

+0

Es ist mehr für Unit-Testzwecke. Ich werde wahrscheinlich nur XmlUnit verwenden, den XML-Code entpacken und dann neu tarifieren und vergleichen, was ich in der Vergangenheit getan habe. –

Antwort

0

Der einzige Weg, ich in der Lage gewesen, fehlende Java-Eigenschaften zu validieren (w/o schema) ist, das XML zu meinem POJO zu entpacken, es dann mit dem gleichen POJO in XML umzuwandeln und zu vergleichen.

Im Folgenden finden Sie ein Beispiel mit XMLUnit, mit dem Probleme bei der Reihenfolge und bei Leerzeichen vermieden werden können.

Dies ist nicht ideal, funktioniert aber größtenteils für Unit Testing.

3

Sie können ein ValidationEventHandler nutzen, um das von Ihnen gesuchte Verhalten zu erhalten. Ein unerwartetes Element wird als Warnung behandelt, die standardmäßig ignoriert wird. Um Ihren Anwendungsfall zu unterstützen, können Sie eine ValdidationEventHandler liefern, die bei Warnungen fehlschlägt (siehe unten).

Demo

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 RI Ausnahme

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) 

Eclipse JAXB (moxy)

Wir haben dieses Verhalten zu moxy kürzlich hinzugefügt. Sie müssen EclipseLink 2.4.0 oder 2.3.3 verwenden. Ein Nightly Build kann unter der folgenden Adresse erhältlich:


UPDATE

Ich brauchte die Dog Klasse aus Ihrer Frage zwicken. Unten ist was ich benutzt habe.

Hund

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

Hmm das habe ich ausprobiert und es hat nicht geklappt (das war nicht MOXy).Ich werde es nochmal versuchen müssen. BTW Ich habe gerade Ihren Trick für dynamische XML-Elemente verwendet: http://blog.bdoughan.com/2012/02/xmlanyelement-and-xmladapter.html. Du kommst herum, wenn es um JAXB geht :) –

+0

Ich habe diesen genauen Code in JDK 1.7.0 (für Mac) ausgeführt, um die Ausnahme zu erhalten, die ich gepostet habe. Welche Version des JDK verwendest du? –

+0

JDK 1.6 Ich werde es in Kürze noch einmal versuchen. Ich denke, es war so, weil ich den Kontext geschaffen habe. –

Verwandte Themen