2013-06-04 19 views
5

Ich möchte teilweise Unmarshaling von großen XML.Partial-Unmarshalling mit JAXB

XML hat folgende Struktur:

<Records> 
    <Contract> 
     ... 
    </Contract> 
    <Contract> 
     ... 
    </Contract> 
    ... 
    <Contract> 
     ... 
    </Contract> 
    <Contract> 
     ... 
    </Contract> 
</Records> 

und Ergebnisklasse erzeugt mit XJC:

- Records 
    |- Contract 

Wenn i these (Probe aus jaxb-ri) folgen, erhalte ich Fehler:

Exception in thread "main" javax.xml.bind.UnmarshalException: unexpected element (uri:"http://somedomain.com", local:"Contract"). Expected elements are <{http://somedomain.com}Records> 

Wenn ich verwende:

<jaxb:globalBindings localScoping="toplevel"/> 

ich Fehler:

org.xml.sax.SAXParseException: A class/interface with the same name "com.my.package.Text" is already in use. Use a class customization to resolve this conflict. 

Aber ich brauche viele Klassen zu ändern. Und das ist keine Lösung.

Antwort

7
/** 
* User: r.ibragimov 
* Date: 04.06.13 
*/ 
public class PartialJAXB1 { 

    public static void main(String[] args) throws JAXBException, XMLStreamException, FileNotFoundException { 

     final QName qName = new QName("http://www.domain.com","Contract"); 

     InputStream inputStream = new FileInputStream(new File("c:\\test.xml")); 

     // create xml event reader for input stream 
     XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance(); 
     XMLEventReader xmlEventReader = xmlInputFactory.createXMLEventReader(inputStream); 

     // initialize jaxb 
     JAXBContext context = JAXBContext.newInstance(Records.class); 
     Unmarshaller unmarshaller = context.createUnmarshaller(); 

     XMLEvent e = null; 

     // loop though the xml stream 
     while((e = xmlEventReader.peek()) != null) { 

      // check the event is a Document start element 
      if(e.isStartElement() && ((StartElement)e).getName().equals(qName)) { 

       // unmarshall the document 
       Records.Contract contract = unmarshaller.unmarshal(xmlEventReader, Records.Contract.class).getValue(); 
       System.out.println(contract); 
      } else { 
       xmlEventReader.next(); 
      } 

     } 

    } 
} 
+0

Danke, es funktioniert perfekt! – Margaret

2

Generierung von Top-Level-Klassen

I want get just Records class and separate Contract class.

standardmäßig eine JAXB Implementierungsklassen entsprechend anonyme komplexen Typen als statische innere Klassen generieren. Wenn Sie wollen alles, was ein Top-Level-Klasse sein, Sie können wie Sie sagten in Ihrer Frage die folgende externe Bindung Anpassung verwenden:

<jaxb:bindings 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    version="2.1"> 
    <jaxb:globalBindings localScoping="toplevel"/> 
</jaxb:bindings> 

Resolving Namenskonflikte

I get error:

org.xml.sax.SAXParseException: A class/interface with the same name "com.my.package.Text 

Eine der Aufgaben der statischen inneren Klassen besteht darin, Namenskonflikte zu verhindern. Mit allen Klassen der obersten Ebene können Sie eine externe Bindungsdatei verwenden, um die Klasse umzubenennen, die aus einem komplexen Typ generiert wurde. Im Folgenden sehen Sie ein Beispiel, in dem die Klasse, die dem komplexen Typ itemType entspricht, als Item generiert wird.

<jaxb:bindings 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    version="2.1"> 
    <jaxb:globalBindings localScoping="toplevel"/> 
    <jaxb:bindings schemaLocation="company.xsd"> 
     <jaxb:bindings node="//xsd:element[@name='employee']/xsd:complexType/xsd:sequence/xsd:element[@name='address']/xsd:complexType"> 
      <jaxb:class name="EmployeeAddress"/> 
     </jaxb:bindings> 
    </jaxb:bindings> 
</jaxb:bindings> 

Mit dem Einbindemappe

Sie die Bindungsdatei im XJC Aufruf angeben mit der Option -b

xjc -b binding.xml your-schema.xsd 

Weitere Informationen

+0

Sie schon meine andere Frage :) Diese Frage, wie separate Klasse zu machen. – IRus

+0

Oder über, wie man partionally folgende Struktur folgt. – IRus

+0

@IRus - Meine aktuelle Antwort wird Ihnen mit dem gleichen Namen Fehler helfen, den Sie sehen. Ich verstehe den unvollständigen unmarsalen Teil Ihrer Frage nicht. –