无法从文档中读取架构文件
Failed to read schema file from document
我想用模式解组传入的 XML 对象。我使用来自 java 对象的 schemagen
命令创建了一个模式,并添加了一些 minOccur 和 maxOccur 属性。
我将架构放在 src/main/resources 中。这是错误:
Failed to read schema document 'file:/C:/Users/cen/Desktop/wildfly-8.1.0.Final-sy/standalone/deployments/vloga-ear.ear/vloga-service.jar/VlogaData.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.
代码:
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
ClassLoader classLoader = getClass().getClassLoader();
File schemaFile = new File(classLoader.getResource("VlogaData.xsd").getFile());
if (schemaFile.canRead()) LOG.info("can read");
Schema schema = sf.newSchema(schemaFile);
Unmarshaller unmarshaller = context.createUnmarshaller();
unmarshaller.setSchema(schema);
架构 xsd(尝试使用和不使用 xml 标记,使用 xsd 命名空间,结果相同):
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="VlogaData" type="VlogaData"/>
<xs:complexType name="VlogaData">
<xs:sequence>
<xs:element minOccurs="1" maxOccurs="1" name="idVloge" type="xs:string"/>
<xs:element minOccurs="1" maxOccurs="1" name="idPriloge" type="xs:string"/>
<xs:element minOccurs="1" maxOccurs="1" name="imeVloge" type="xs:string"/>
<xs:element minOccurs="1" maxOccurs="1" name="verzija" type="xs:string"/>
<xs:element minOccurs="1" maxOccurs="1" name="vrstaPriloge" type="xs:string"/>
<xs:element minOccurs="1" maxOccurs="1" name="datumOblikovanja" type="xs:string"/>
<xs:element minOccurs="1" maxOccurs="1" name="datumZadnjeSpremembe" type="xs:string"/>
<xs:element minOccurs="1" maxOccurs="1" name="lastnik" type="xs:string"/>
<xs:element minOccurs="1" maxOccurs="1" name="kljucneBesede" type="xs:string"/>
<xs:element minOccurs="1" maxOccurs="1" name="priloga" type="xs:base64Binary"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
如何确定是三个原因中的哪一个?文件路径似乎没问题(我解压了 jar 并且模式在那里)。 "can read" 不是从记录器输出的,因此无法读取文件。但是为什么呢?第三个推理也应该没问题,因为我尝试了三种不同的模式,但没有任何效果。
我认为文件无法读取,因为它在一个 jar 中,那么 file:/C:/Users/cen/Desktop/wildfly-8.1.0.Final-sy/standalone/deployments/vloga-ear.ear/vloga-service.jar/VlogaData.xsd
不是真正的文件。
因为 SchemaFactory.newSchema
可以收到 URL
我建议你做更简单的事情:
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
ClassLoader classLoader = getClass().getClassLoader();
Schema schema = sf.newSchema(classLoader.getResource("VlogaData.xsd"));
它在我的环境中进行了一些小测试。
我想用模式解组传入的 XML 对象。我使用来自 java 对象的 schemagen
命令创建了一个模式,并添加了一些 minOccur 和 maxOccur 属性。
我将架构放在 src/main/resources 中。这是错误:
Failed to read schema document 'file:/C:/Users/cen/Desktop/wildfly-8.1.0.Final-sy/standalone/deployments/vloga-ear.ear/vloga-service.jar/VlogaData.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.
代码:
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
ClassLoader classLoader = getClass().getClassLoader();
File schemaFile = new File(classLoader.getResource("VlogaData.xsd").getFile());
if (schemaFile.canRead()) LOG.info("can read");
Schema schema = sf.newSchema(schemaFile);
Unmarshaller unmarshaller = context.createUnmarshaller();
unmarshaller.setSchema(schema);
架构 xsd(尝试使用和不使用 xml 标记,使用 xsd 命名空间,结果相同):
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="VlogaData" type="VlogaData"/>
<xs:complexType name="VlogaData">
<xs:sequence>
<xs:element minOccurs="1" maxOccurs="1" name="idVloge" type="xs:string"/>
<xs:element minOccurs="1" maxOccurs="1" name="idPriloge" type="xs:string"/>
<xs:element minOccurs="1" maxOccurs="1" name="imeVloge" type="xs:string"/>
<xs:element minOccurs="1" maxOccurs="1" name="verzija" type="xs:string"/>
<xs:element minOccurs="1" maxOccurs="1" name="vrstaPriloge" type="xs:string"/>
<xs:element minOccurs="1" maxOccurs="1" name="datumOblikovanja" type="xs:string"/>
<xs:element minOccurs="1" maxOccurs="1" name="datumZadnjeSpremembe" type="xs:string"/>
<xs:element minOccurs="1" maxOccurs="1" name="lastnik" type="xs:string"/>
<xs:element minOccurs="1" maxOccurs="1" name="kljucneBesede" type="xs:string"/>
<xs:element minOccurs="1" maxOccurs="1" name="priloga" type="xs:base64Binary"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
如何确定是三个原因中的哪一个?文件路径似乎没问题(我解压了 jar 并且模式在那里)。 "can read" 不是从记录器输出的,因此无法读取文件。但是为什么呢?第三个推理也应该没问题,因为我尝试了三种不同的模式,但没有任何效果。
我认为文件无法读取,因为它在一个 jar 中,那么 file:/C:/Users/cen/Desktop/wildfly-8.1.0.Final-sy/standalone/deployments/vloga-ear.ear/vloga-service.jar/VlogaData.xsd
不是真正的文件。
因为 SchemaFactory.newSchema
可以收到 URL
我建议你做更简单的事情:
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
ClassLoader classLoader = getClass().getClassLoader();
Schema schema = sf.newSchema(classLoader.getResource("VlogaData.xsd"));
它在我的环境中进行了一些小测试。