2012-01-26 14 views
4

xmlファイルからJavaオブジェクトを作成しようとしています。私はJavaオブジェクトを作成するためにjaxb(unmarshalling)を使用しています。エラーが発生していますjavax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.w3.org/2001/XMLSchema", local:"schema"). Expected elements arejaxbを使用してJavaオブジェクトを作成する方法

私はいくつかのgoogleを見つけたので、xsdファイルが必要です。 。私は、次のJavaコードを使用しています:

import java.io.FileNotFoundException; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 
import javax.xml.bind.UnmarshalException; 
import javax.xml.bind.Unmarshaller; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement(name="report") 
public class Report 
{ 
    public static void main(String [] args) throws FileNotFoundException 
    { 
     try 
     { 
      JAXBContext jc = JAXBContext.newInstance(new Class[] {com.bcbsks.testjb.Report.class});    
      Unmarshaller um = jc.createUnmarshaller();   
      Report myJAXBObject = (Report)um.unmarshal(new java.io.FileInputStream("report.xsd")); 
     } 
     catch(UnmarshalException ue) 
     {  
      ue.printStackTrace(); 
     } 
     catch(JAXBException je) 
     { 
      je.printStackTrace(); 
     } 
    } 
} 

しかし、私はFOLを取得しています。によりエラー:

javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.w3.org/2001/XMLSchema", local:"schema"). Expected elements are (none) 

あなたは私がやっているいただきました間違った教えてくださいことはできますか?

ご協力いただきまして誠にありがとうございます。

答えて

5

私はあなたがいくつかの手順を欠場していると思います。あなたはreport.xsdとサンプルXMLを投稿していないので、私はいくつか推測します。手始めに

、あなたは問題の根本そのものであり、XSDなくXMLを、非整列化しようとしています。つまり、Report.javaクラスは正しく生成されていないように見えるので、XMLファイルに対して試してもアンマーシャリングが機能する可能性は低いです。

あなたが適切に作成したXSDファイルを持っている場合は、あなたが最初にすべきことはxjcを使用してJAXBのPOJOを作成することです。 xjcは、javaをインストールし、そしてあなたは、XSDから注釈付きのJavaクラスを作成するためにそれを使用しています。 JAXBで使用されるObjectFactory.javaとpackage-info.javaの2つの追加ファイルも作成されます。 (あなたが生成され、それらのファイルを持っていたら、あなたはそのパッケージ/ファイルに基づいてたJAXBContextを作成する必要が

xjc -d c:\dev\myproject\src\main\java report.xsd 

(スイッチの完全なリストについては、--help参照)-dのparamを使用して出力パスを指定することができます。

JAXBContext jc = JAXBContext.newInstance(something.generated.Report.class);    
Unmarshaller um = jc.createUnmarshaller();   
Report myJAXBObject = (Report)um.unmarshal(new java.io.FileInputStream("report.xsd"), Report.class).getValue(); 

アンマーシャラーを使用して、実際のレポートクラスを抽出することができ、そこからJAXBElementのを生成します。

・ホープ、このことができます。

+0

これは私をたくさん助けた。 –

+0

'unmarchal(FileInputStreamを、クラス)のためのメソッドシグネチャがありません' thomas.mc.work @ –

+0

は残念ながら、私はもはやプロジェクトに取り組んでいるか、現時点では、JAXBを使用していませんが、私はそれが非推奨かになってきているものです疑います過去3年間に削除されました。古いバージョンのJaxbを見て、そのメソッドがdeprecateとしてマークされているか/別のものに置き換えられているかどうかを確認することができます。残念ながら、私はこのバージョンのjaxbを使っていたのを覚えていません。 –

4

アンマーシャリングしようとしているBeanにはプロパティがありません。しかし、もっと重要なのは、XSD自体からオブジェクトを逆シリアル化しようとしていることです。エラーメッセージはここで良い指標である:あなたのBeanのプロパティにXSDのメタデータをマッピングしようとしているので、

unexpected element (uri:"http://www.w3.org/2001/XMLSchema", local:"schema")

JAXBは、このエラーメッセージを吐き出しています。もちろん、あなたの豆は実際には何も持っていません。エラーメッセージの次の部分は、できるだけ多くを示しています。

Expected elements are (none)

あなたが適切にあなたのJava Beanの定義(その上でいくつかのプロパティを置く!)、そして実際にあなたのシリアル化されたバージョンを表すXMLファイルを取得する必要があります豆。

関連する問題