将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,但是关闭 is
在unmarshal
之前而不是之后?
UPDATE
我从来没有在XAXB上使用过XSD,只是它在域类上的注释,但是你的XSD是错误的。 尝试从XSD的开头删除documentTitle
元素。