【问题标题】:Failed to read schema file from document无法从文档中读取架构文件
【发布时间】:2015-11-14 04:25:38
【问题描述】:

我想用架构解组传入的 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);

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 并且架构在那里)。 “可以读取”不是记录器的输出,因此无法读取文件..但是为什么呢?第三个推理也应该没问题,因为我尝试了三种不同的模式,但没有任何效果。

【问题讨论】:

  • 相对于 jar 内容,模式文件的完整路径是什么? classloader.getresource 与类在同一目录中查找。如果它位于目录的底部,最好在它前面加上 /VlogaData.xsd。同时,我也会选择 Classloader.getResourceAsStream。
  • Schema 直接在 jar 中。我尝试使用 /VlogaData 但错误完全相同。我看到了使用流的代码示例,但模式构造函数需要一个文件,所以如果可能的话,我会尽量不要从流转换为文件。

标签: java jakarta-ee xsd schema unmarshalling


【解决方案1】:

我认为该文件无法读取,因为它位于 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")); 

它在我的环境中进行了一个小测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    相关资源
    最近更新 更多