簡體   English   中英

JAXB - SAXParseException無法找到元素的聲明

[英]JAXB - SAXParseException Cannot find the declaration of element

嘗試使用給定的xsd驗證對象時遇到問題。 這些類是從xsd生成的。

SchemaFactory factory = SchemaFactory
                .newInstance("http://www.w3.org/2001/XMLSchema");
Schema schema = factory.newSchema(getClass().getResource("/xsd/test.xsd"));
JAXBContext context = JAXBContext.newInstance(aClass);
Unmarshaller u = context.createUnmarshaller();
u.setSchema(schema);
Object anObject = u.unmarshal(new StreamSource(new StringReader(
                MESSAGE)), aClass);

這是異常消息

[org.xml.sax.SAXParseException:cvc-elt.1:找不到元素'ACCESREFUSE'的聲明。

這是XSD:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:include schemaLocation="./include/CJCommon.xsd"/>
 <xs:element name="ACCESREFUSE">
<xs:complexType>
  <xs:sequence maxOccurs="1" minOccurs="1">
    <!-- Entete -->
    <xs:element maxOccurs="1" minOccurs="1" ref="IDOper"/>
    <xs:element maxOccurs="1" minOccurs="1" ref="DateEvt"/>
    <xs:element maxOccurs="1" minOccurs="1" ref="IDEvt"/>
    <xs:element maxOccurs="1" minOccurs="1" ref="IDJoueur"/>
    <xs:element maxOccurs="1" minOccurs="1" ref="HashJoueur"/>
    <xs:element maxOccurs="1" minOccurs="1" ref="IDSession"/>
    <xs:element maxOccurs="1" minOccurs="1" ref="IPJoueur"/>
    <xs:element maxOccurs="1" minOccurs="0" ref="IDCoffre"/>
    <!-- Corps -->
    <xs:element maxOccurs="1" minOccurs="1" ref="TypAg"/>
    <xs:element maxOccurs="1" minOccurs="0" name="CauseRefus" type="string-1024"/>
    <xs:element maxOccurs="1" minOccurs="0" name="TypeRefus">
      <xs:simpleType>
        <xs:restriction base="string-1024">
          <xs:enumeration value="DelaiIdentite"/>
          <xs:enumeration value="RejetIdentite"/>
          <xs:enumeration value="Interdit"/>
          <xs:enumeration value="AutoInterdit"/>
          <xs:enumeration value="OpVerrouille"/>
          <xs:enumeration value="Verrouille"/>
          <xs:enumeration value="Cloture"/>
          <xs:enumeration value="Autre"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:element>
  </xs:sequence>
</xs:complexType>
</xs:element>

元素ACCESREFUSE是xml的根。

XML:

 <ACCESREFUSE>
      <dateEvt>Tue Oct 15 11:45:48 CEST 2013</dateEvt>
      <hashJoueur>0000000000000000000000000000000000000000</hashJoueur>
      <typAg>JC</typAg>
      <causeRefus>Interdit</causeRefus>
      <typeRefus>Interdiction Temporaire</typeRefus>
      <idjoueur>81.252.190.129</idjoueur>
      <idoper>002</idoper>
      <idsession>301090</idsession>
      <idevt>0</idevt>
      <ipjoueur/>
      <idcoffre/>
 </ACCESREFUSE>

任何的想法 ? 謝謝

您可以嘗試將架構修改為:

<xs:element name="ACCESREFUSE">
<xs:complexType name="ACCESREFUSE">
...
</xs:schema>

編輯:我認為你有加載XSD的問題。 您可以更改此代碼以用於測試目的:

InputStream xmlStream = ...
Schema schema = factory.newSchema(xmlStream);

請試一試!

EDIT2:我嘗試用你的XSD解析ACCESREFUSE類。 我不知道你的./include/CJCommon.xsd架構,所以我省略了。 這是我的代碼:

        SchemaFactory factory = SchemaFactory
                .newInstance("http://www.w3.org/2001/XMLSchema");
        File file = new File("test.xml");
        Schema schema = factory.newSchema(file);

    JAXBContext context = JAXBContext.newInstance(ACCESREFUSE.class);
    Unmarshaller u = context.createUnmarshaller();
    u.setSchema(schema);
    Object anObject = u.unmarshal(new StreamSource(new StringReader(
            getMessage())), ACCESREFUSE.class);

我的ACCESREFUSE.class:

@XmlRootElement(name="ACCESREFUSE")
public class ACCESREFUSE {

    protected String v1;
    protected String v2;
    protected String v3;
    protected String v4;
    protected String v5;
    protected String v6;
    protected String v7;
        protected String v8;
    protected String v9;
    protected String CauseRefus;
    protected TypeRefus typeRefus;

     public enum TypeRefus{
         DelaiIdentite, RejetIdentite, Interdit, AutoInterdit, OpVerrouille, Verrouille, Cloture, Autre;
    }

消息:

private static String getMessage() {

        return "<ACCESREFUSE>"
                + "<v1>Tue Oct 15 11:45:48 CEST 2013</v1>"
                + "<v2>0000000000000000000000000000000000000000</v2>"
                + "<v3>JC</v3>" + "<v4>Interdit</v4>"   
                + "<v5>81.252.190.129</v5>"
                + "<v6>002</v6>" + "<v7>301090</v7>"
                + "<v8>0</v8>" + "<v9> test </v9>"
                + "<TypeRefus>RejetIdentite</TypeRefus>"

                + "</ACCESREFUSE>";
    }

並將您的XSD修改為簡單的字符串元素:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xs:element name="ACCESREFUSE">
<xs:complexType>
  <xs:sequence maxOccurs="1" minOccurs="1">
    <!-- Entete -->
    <xs:element maxOccurs="1" minOccurs="1" type="xs:string" name="v1"/>
     ...

該程序正常工作! :)

你能查一下你的./include/CJCommon.xsd嗎? 你是否使用xs前綴type="xs:string"

可能是命名空間問題。 你應該嘗試使用適當的名稱空間聲明等鏈接導入./include/CJCommon.xsd

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM