将xml文档导入jaxb创建的实体结构中

我试图使用jaxb将xml文档导入由jaxb创建的实体结构中。 我下载了jaxb 2.2.7,并使用了该下载中包含的create-marshal示例,但我将po.xsd的内容po.xsd为以下内容:

                     

然后我创建po.xml具有以下结构的po.xml ,该结构旨在匹配po.xsd

    first document   inner title   

我将Main.java更改为以下forms,以便将po.xml导入到使用create-marshal示例build.xml文件从po.xsd创建的实体结构中:

 package mainpackage; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBElement; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; import primer.po.*; import java.io.*; public class Main { public static void main( String[] args ) { String filename = "C:\\Temp\\jaxb\\apps\\create-marshal\\po.xml"; InputStream is = getInputStream(filename); try { unmarshal(BusinessDocument.class, is);} catch (JAXBException e) {e.printStackTrace();} } public static InputStream getInputStream(String filename){ InputStream is = null; try { is = new FileInputStream(filename); is.close(); } catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} return is; } public static  T unmarshal( Class docClass, InputStream inputStream )throws JAXBException { String packageName = docClass.getPackage().getName(); JAXBContext jc = JAXBContext.newInstance( packageName ); Unmarshaller u = jc.createUnmarshaller(); JAXBElement doc = (JAXBElement)u.unmarshal( inputStream ); return doc.getValue(); } } 

build.xml的编译部分是:

                 

但我得到以下堆栈跟踪:

 javax.xml.bind.UnmarshalException - with linked exception: [java.io.IOException: Read error] at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:203) at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:173) at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:137) at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:184) at mainpackage.Main.unmarshal(Main.java:39) at mainpackage.Main.main(Main.java:17) Caused by: java.io.IOException: Read error at java.io.FileInputStream.read(Native Method) at com.sun.org.apache.xerces.internal.impl.XMLEntityManager$RewindableInputStream.read(XMLEntityManager.java:2932) at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:704) at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:186) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:772) 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:119) 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:200) ... 5 more 

你的问题在这里:

 is = new FileInputStream(filename); is.close(); 

因此,您尝试使用FileInputStream从文件中解组XML,但是关闭 isunmarshal之前而不是之后?

UPDATE

我从来没有在XAXB上使用过XSD,只是它在域类上的注释,但是你的XSD是错误的。 尝试从XSD的开头删除documentTitle元素。