2012-04-12 63 views
3

我想解析来自第三方url的xml流。在我的控制台中,它看起来像。JAXB中的Xml解析问题

`

<?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> 

`

和我得到的错误下面的错误。

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 

,但它正在与XML一样

`

<?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> 

`

感谢

+0

什么架构(Java类或类似)你想它解析成。 .. – 2012-04-12 07:43:26

+0

这是java类@XmlRootElement(na我= “ArrayOfString”) @XmlAccessorType(XmlAccessType.FIELD) 公共类ArrayOfString { @XmlElement(名称= “字符串”) ArrayList的 StringList的=新的ArrayList (); (){ return stringList; } public void setStringList(ArrayList stringList){ this.stringList = stringList; } } – KSHiTiJ 2012-04-12 07:58:24

+0

由于第一个xmlns命名空间,这两个XML片段完全不同。哪些是正确的? – davidfrancis 2012-04-12 08:17:53

回答

3

可以使用@XmlSchema批注指定命名空间的资格。包注释位于名为package-info的特殊类中,该类必须与您的域类位于同一个包中。下面是一个适用于你的用例的例子。

包信息

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

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

更多信息

+1

好的,这有效,但我认为这值得解释原因。第一个文档(来自源代码)包含一个模式名称空间,该文档符合文档的条件,并且(如@davidfrancis所指出的)与上一个没有名称空间的文档不同。 JAXB对模式名称空间非常敏感,因此类可能与文档具有“兼容结构”,但JAXB依赖上面给出的正确注释将其与预期的名称空间正确关联。总之,理解xml模式命名空间对于使用JAXB无挫折至关重要。 – 2012-04-13 05:31:23