Jaxb UnMarshal Fehler: unerwartetes Element (uri: "", lokal: "processedSalesOrderTypeList"). Erwartete Elemente sind

8

Ich versuche die XML-Datei zu entpacken. Ich habe die Jaxb-Klassen erstellt, aber wenn ich versuche, sie zu entpacken, gibt es mir:

%Vor%

Das ist meine ObjectFactory.java-Klasse:

%Vor%

XSD:

%Vor%

XML-Datei zum Parsen:

%Vor%

Können Sie mir bitte helfen, da ich feststecke und nicht in der Lage bin, meinen Kunden Gründe für die Verzögerung bei der Entwicklung dieser Funktionalität zu liefern.

Danke, Jayesh Jain

    
Jayesh 22.03.2017, 06:22
quelle

4 Antworten

5

Ich kann mir zwei verschiedene Gründe vorstellen, warum dein Unmarshaller versagt.

  1. In Ihrem Schema ist "processedSalesOrderTypeList" nicht definiert. In dem Fehler, den Sie erwähnten, sind die gültigen Elemente:

<{api.supplieroasis.com}processedSalesOrderMessage>,<{api.supplieroasis.com}salesOrderMessage>,<{api.supplieroasis.com}shipperOfRecordAccountNumber>,<{api.supplieroasis.com}shippingAccountNumber>,<{api.supplieroasis.com}uspsMailerId>, <{api.supplieroasis.com}warehouseName>

Der XML-Namespace ist in den geschweiften Klammern {} enthalten, und der Name des Elements steht direkt dahinter. Diese Werte sind in Ihrer ObjectFactory angegeben. Wie Sie sehen können, ist "processedSalesOrderTypeList" nicht in Ihrer ObjectFactory definiert. Wenn der Unmarshaller also das Element "processedSalesOrderTypeList" in Ihrem XML-Code findet, hat er eine no Idee, wie er es verarbeiten soll.

  1. Ich hatte ein Problem mit den Namespaces, die in dem von xjc generierten Code nicht übereinstimmten, was dazu führte, dass viele der Elemente während der Deserialisierung null zurückgaben. Das Seltsame war, dass einige der Elemente korrekt analysiert wurden, andere jedoch nicht. Zuerst würde ich einen ValidationEventHandler hinzufügen, um alle XML-Validierungsfehler zu sehen:

    unmarshaller.setEventHandler (new DefaultValidationEventHandler ());

Wenn Sie einen ähnlichen Fehler wie den folgenden erhalten, sollte Ihnen diese Antwort helfen.

%Vor%

Ich würde nach der Klasse suchen, die dieses Feld hat (es könnte eine root-level-Klasse sein). Verwenden Sie beim Auffinden dieser Klasse eine Beurteilung. Wenn das Element-Tag, das nicht analysiert werden kann, das Wurzelelement ist, hat die Klasse höchstwahrscheinlich denselben exakten Namen wie das Element. Wenn das Element ein untergeordnetes Element eines anderen Elements ist, suchen Sie in der entsprechenden Klasse nach diesem bestimmten Element.

Sobald Sie die Klasse gefunden haben, sehen Sie, dass die Namespaces korrekt übereinstimmen. Ich hatte ein Problem, bei dem der Namespace leer war und ausgefüllt werden musste.

Füllen Sie den Namespace mit demselben Namespace aus, den das XML besitzt. Code Beispiel:

%Vor%

@XmlElement(name = "MyEntity", namespace = "test:com.example")

Stellen Sie im Wesentlichen sicher, dass der Namespace in der Annotation und der XML-Code übereinstimmen. Wenn dies nicht der Fall ist und die Namespace-Verifizierung aktiviert ist, wird die Ausgabe des XML-Codes verweigert.

Wenn dies Ihr Problem nicht behebt und Sie eine Ausnahme in Bezug auf ObjectFactory sehen, würde ich nach dem QName suchen, das diesem bestimmten Element entspricht. Das korrekte Code-Snippet sollte in etwa so aussehen und sicherstellen, dass die Namespaces übereinstimmen (erstellen Sie es, falls es nicht existiert):

QName _MyEntity_QNAME = new QName("test:com.example", "MyEntity");

Suchen Sie in der gleichen ObjectFactory nach dem @ XmlElementDecl. Dies ist die Anmerkung, die definiert, wie das XML-Element in ein Java-Objekt konvertiert wird. Der richtige Code sollte etwa so aussehen:

%Vor%

Nachdem die Namespaces alle übereinstimmen, sollte die Deserialisierung funktionieren. Wenn nicht, gehe zurück und überprüfe die Ausnahme und poste sie und ich werde dir mehr Einblick geben.

    
jon5477 21.11.2017 02:23
quelle
2

Ihre JAXB-Objekt-Factory und XSD scheint anders zu sein ... die JAXB-Klassen erneut zu erstellen.

    
saraboji sowndarajan 22.03.2017 06:54
quelle
2

Ihre XSD stimmt nicht mit XML überein. Sie können jedoch ein neues XSD aus XML erstellen. Ich benutze trang Dienstprogramm. Es ist besser, viele XMLs zur Verfügung zu stellen, um alle Elemente zu generieren.

Ich habe Ihr XML in 1.xml gespeichert, ran:

%Vor%

Download-Link

Dann können Sie Java-Klassen mit dem nativen openjdk-Dienstprogramm erstellen

%Vor%

Ihre Klassen erscheinen in / tmp / zzz

    
Oleg Gritsak 23.11.2017 10:43
quelle
0

Versuchen Sie, diese XSD zu verwenden, um die Java-Klassen zu generieren, das sollte funktionieren, ich habe versucht und in der Lage, das xml, das Sie

%Vor%     
Saran 24.11.2017 12:40
quelle

Tags und Links