2016-07-26 3 views
0

編集: Preetam Kumarのおかげで、この問題は解決されましたが、このエラーは他の場所にあります。JAXBを使用してアンマーシャリングしている間に不正な形式のXML

javax.xml.bind.UnmarshalException 
- with linked exception: 
[org.xml.sax.SAXParseException; systemId: file:***/Workspace_XML/fichier_cri/xml/exemple1.xml; lineNumber: 5; columnNumber: 185; cvc-elt.1 : Declaration of element 'crifile' cannot be found.] 

はしかし、私は、スキーマにXMLファイルに正しいパスを与えるが、それはそれを使用していないようだ:私は再び私のxmlファイルをアンマーシャリングしようとすると、私は、要素が見つからない私に言って、このエラーが出ます... わかりません。

NB:以下の例では、スキーマとxmlタグが完全に一致しないことがわかりました。私はすでにファイルで修正しました。


最近では、いくつかのXMLファイルをJavaオブジェクトに解析するためにJAXB Javaライブラリを使用する必要があります。

XMLスキーマ(.xsd)を作成し、ツールxjcを使用してコンパイルし、Javaクラスを生成しました。 (xsdファイルの例はここに私の質問を参照してください:schema.xsd

私はカスタムXMLファイルをアンマーシャリングして、自分のスキーマと生成されたクラスをテストしようとしています。そして、ここに私の問題があります。私は名前空間を宣言するとき、私は数多くのウェブサイトや例で見てきたよう 私は常に、私のxmlは最初から不正な権利であるエラーを取得:

javax.xml.bind.UnmarshalException 
- with linked exception: 
[org.xml.sax.SAXParseException; systemId: file:***/Workspace_XML/fichier_cri/xml/exemple1.xml; lineNumber: 2; columnNumber: 11; The type of element "xmlns:xsi" must be followed by attribut specifications, ">" or "/>".] 

​​

私はエラーを取得します

私はラインを変更しようとしたとしても、それを削除したが、その後、私は別のエラーを取得:今

javax.xml.bind.UnmarshalException 
- with linked exception: 
[org.xml.sax.SAXParseException; systemId: file:***/Workspace_XML/fichier_cri/xml/exemple1.xml; lineNumber: 5; columnNumber: 10; cvc-elt.1 : Déclaration of element 'crifile' not found.] 

を、私はもう何をすべきかわからないので、誰かがヒントやSOMETを持っている場合興、私はどちらか、私は私のJavaのテストプログラムでは、本当に自信を持っていないです...ない

を言うことはありません...しかし、ここにある:

import generated.FichierCri; 

import java.io.File; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 
import javax.xml.bind.Unmarshaller; 
import javax.xml.validation.Schema; 
import javax.xml.validation.SchemaFactory; 

import org.xml.sax.SAXException; 

public class main { 

    final static File baseDir = new File("***\\Workspace_XML\\fichier_cri\\"); 

    public static void main(String[] args) { 

     System.out.println("*DEBUG* - load xml stream"); 
     System.out.println("*DEBUG* - xml file location : " + baseDir.getPath() + "\\xml\\exemple1.xml"); 

     File xmlFile = new File(baseDir, "\\xml\\exemple1.xml"); 

     if (xmlFile == null) 
      throw new NullPointerException("xmlFile is null"); 

     System.out.println("*DEBUG* - Instantiate SchemaFactory"); 

     SchemaFactory schemaFactory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema"); 

     System.out.println("*DEBUG* - Load schema file"); 
     System.out.println("*DEBUG* - schema location : " + baseDir.getPath() + "\\schema\\schema.xsd"); 

     Schema schema = null; 
     try { 
      schema = schemaFactory.newSchema(new File(baseDir, "\\schema\\schema.xsd")); 
     } 
     catch (SAXException e) { 
      e.printStackTrace(); 
     } 

     if (schema == null) throw new NullPointerException("schema is null"); 

     System.out.println("*DEBUG* - Instantiate JAXBContext"); 

     JAXBContext context = null; 
     try { 
      context = JAXBContext.newInstance(FichierCri.class); 
     } 
     catch (JAXBException e) { 
      e.printStackTrace(); 
     } 

     System.out.println("*DEBUG* - create unmarshaller"); 

     Unmarshaller unmarshaller = null; 
     try { 
      unmarshaller = context.createUnmarshaller(); 
     } 
     catch (JAXBException e) { 
      e.printStackTrace(); 
     } 

     System.out.println("*DEBUG* - set schema to unmarshaller"); 

     unmarshaller.setSchema(schema); 

     System.out.println("*DEBUG* - Create unmarshall object of type FichierCri"); 
     System.out.println("*DEBUG* - unmarshall from xml file"); 

     try { 
      FichierCri unmarshall = (FichierCri) unmarshaller.unmarshal(xmlFile); 
     } 
     catch (JAXBException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

、ここでxmlファイルのサンプルです:

<?xml version="1.0" encoding="UTF-8"?> 
<xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/> 
<xsi:schemaLocation="***\Desktop\Workspace_XML\fichier_cri\schema.xsd"/> 

<crifile> 
    <init_liaison> 
     <source>value</source> 
    </init_liaison> 
    <liste_cri> 
     <demande_cri> 
      <fichier_erreur>value</fichier_erreur> 
     </demande_cri> 
    </liste_cri> 
</crifile> 

すべての要素(crifile、liste_cri、...)はスキーマで定義されています。あなたのXMLが不正な形式である

答えて

1

あなたが持っているXMLが本当に不正な形式です。あなたのXMLが提供するものは、XMLボディ内に複数のルートノード/要素があり、XMLボディが1つだけである必要があります。xmlns:xsiおよびxsi:schemaLocationは、の唯一のルート要素要素。

あなたのXMLは、補正後、以下に示すようになります。PATH_TO_SCHEMA_FILEは、スキーマファイルの適切な場所に置き換えてください

<?xml version="1.0" encoding="UTF-8"?> 
<crifile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="PATH_TO_SCHEMA_FILE\schema.xsd"> 
    <init_liaison> 
     <source>value</source> 
    </init_liaison> 
    <liste_cri> 
     <demande_cri> 
      <fichier_erreur>value</fichier_erreur> 
     </demande_cri> 
    </liste_cri> 
</crifile> 

+0

本当にありがとう、それは効果的に私の問題を解決しましたが、別の問題があります...私は新しいエラーで質問を編集しました。 –

+0

「xml形式を指定する必要がありますか」ということはどういう意味ですか? –

+0

私に見てみましょう。私はそのテキストを含めることを意味していない方法で –

1

、あなたのヘッダは(のxmlnsとのschemaLocationは、ルートノードの属性であると要素を分離されていない)、このようになります。

<?xml version="1.0" encoding="UTF-8"?> 
    <root_element xmlns="uri to ns" 
       xmlns:xsi="uri_to schema instance" 
       xsi:schemaLocation="uri to schema location"> 
... 
    </root_element> 

は、詳細は以下のリンクをチェックしてください:

あなたがオンラインをテストすることができますようgeneral xml tutorial in french - based on the "fichier_erreur" I guess this is your prefered language

how to reference local files for schemaLocation

+0

私はフランス語です^^リンクありがとうございます。 –

関連する問題