JAXB中的Xml解析问题
问题描述:
我想解析来自第三方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>
`
感谢
答
可以使用@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
什么架构(Java类或类似)你想它解析成。 .. – 2012-04-12 07:43:26
这是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
由于第一个xmlns命名空间,这两个XML片段完全不同。哪些是正确的? – davidfrancis 2012-04-12 08:17:53