2012-04-12 8 views
3

Ich versuche, XML-Stream von Drittanbieter-URL zu analysieren. In meiner Konsole sieht es so aus.Xml Parse Problem in JAXB

`

<?xml version="1.0" encoding="utf-8"?> 
    <ArrayOfString xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/"> 
     <string>CMSDocs</string> 
     <string>CRMIncomingDocs</string> 
     <string>CRMOutgoingDocs</string> 
     <string>Customized Reports</string> 
     <string>scripts</string> 
     <string>Site Assets</string> 
     <string>Site Pages</string> 
     <string>Style Library</string> 
    </ArrayOfString> 

`

und ich bin immer Fehler folgende Fehlermeldung.

Exception in thread "main" javax.xml.bind.UnmarshalException 
- with linked exception: 
[org.xml.sax.SAXParseException: Premature end of file.] 
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.createUnmarshalException(AbstractUnmarshallerImpl.java:315) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.createUnmarshalException(UnmarshallerImpl.java:481) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:199) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:168) 
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:137) 
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:184) 
    at com.cms.webservice.converter.BaseMarshaller.convertToObject(BaseMarshaller.java:41) 
    at com.cms.webservice.converter.BaseMarshaller.main(BaseMarshaller.java:90) 
Caused by: org.xml.sax.SAXParseException: Premature end of file. 
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195) 
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:174) 
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:388) 
    at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1411) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:1058) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648) 
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737) 
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205) 
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:195) 
    ... 5 more 
Java Result: 1 

aber es funktioniert mit XML wie

`

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ArrayOfString> 
    <string>Kshitij-1</string> 
    <string>Kshitij-2</string> 
    <string>Kshitij-3</string> 
    <string>Kshitij-4</string> 
    <string>Kshitij-5</string> 
</ArrayOfString> 

`

dank

+0

Welches Schema (Java-Klassen oder dergleichen) versuchen Sie es in zu analysieren. .. –

+0

Dies ist Java-Klasse @ XmlRootElement (na me = "ArrayOfString") @XmlAccessorType (XmlAccessType.FIELD) public class ArrayOfString { @XmlElement (name = "string") Arraylist string = new Arraylist (); öffentliche ArrayList getStringList() { Rückgabe stringList; } öffentliche void setStringList (ArrayList stringList) { this.stringList = stringList; } } – KSHiTiJ

+0

Diese beiden Teile von XML sind aufgrund des xmlns Namespace in der ersten vollständig unterschiedlich. Welche davon ist richtig? – davidfrancis

Antwort

3

Sie können das @XmlSchema Annotation Namespace Qualifikation angeben. Paketanmerkungen werden in einer speziellen Klasse namens package-info platziert, die sich im selben Paket wie Ihre Domänenklassen befinden muss. Unten ist ein Beispiel, das für Ihren Anwendungsfall funktionieren würde.

Paket-info

@XmlSchema( 
    namespace = "http://tempuri.org/", 
    elementFormDefault = XmlNsForm.QUALIFIED) 
package example; 

import javax.xml.bind.annotation.XmlNsForm; 
import javax.xml.bind.annotation.XmlSchema; 

Weitere Informationen

+1

OK, das funktioniert, aber ich denke, es lohnt sich zu erklären, warum. Das erste Dokument (aus der Quelle) enthält einen Schemanamespace, der das Dokument qualifiziert und (wie @davidfrancis notiert) von dem letzten Dokument unterscheidet, das keinen Namespace hat. JAXB ist für den Schemanamensraum empfindlich, so dass eine Klasse eine "kompatible Struktur" mit dem Dokument haben kann, aber JAXB verlässt sich auf die richtige Annotation, die oben angegeben wurde, um sie korrekt mit dem beabsichtigten Namespace zu assoziieren. Unter dem Strich ist es wichtig, XML-Schema-Namespaces zu verstehen, um JAXB frustrationsfrei zu verwenden. –