我想用模式解组传入的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并找到了模式)。记录器未输出“可以读取”,因此无法读取文件..为什么?第三种推理也应该没问题,因为我尝试了三种不同的模式,但没有任何效果。

最佳答案

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


在我的环境中,它经过了一点测试。

10-08 20:07