1

Java プログラムによって生成された XML ファイルを再読み取りし、それをグラフィカルに表現したJTableフォームを提供しようとしています。手動で生成された XML はスキーマに準拠していますが、プログラムはそれを無効として検出します。

ロジックは単純です
。1 . task-list.xmlandtask-list-schema.xsdが存在するかどうかを確認します。
2.はいの場合、XML をアンマーシャリングし、XML ドキュメントのデータを使用して行を準備し、テーブルに行を追加します。
3. ない場合、空の GUI を準備します。

問題は、XML がスキーマに準拠していないことです。問題は、生成された XML やスキーマにあるのではなく、バインディングに使用されるクラスにあります。以下にその方法を示します。

FormatList
|->Vector<Format>

TaskList
|-> Vector<Task>

Task
|-> input xs:string
|-> output xs:string
|-> Format 
|-> taskID xs:integer
|-> isReady xs:boolean  

Format
|-> name xs:string
|-> width xs:string
|-> height xs:string
|-> extension xs:string

したがって、各ビデオ変換タスクには関連付けられた形式があるため FormatListTask両方が同じクラスを共有します。Format

これが私が得るエラーです:
ここに画像の説明を入力

生成された XML は次のとおりです。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<task-list>
    <task>
        <input>E:\Videos\AutoIT\AutoIt Coding Tutorial Two - Website Functions.flv</input>
        <output>E:\test\StandaloneVideoConverter</output>
        <format>
            <name>[AVI] HD 1080p</name>
            <width>1920</width>
            <height>1080</height>
            <extension>.avi</extension>
        </format>
        <taskID>3</taskID>
        <isReady>false</isReady>
    </task>
</task-list>  

これを解決するにはどうすればよいですか?

クラス

@XmlAccessorType(XmlAccessType.FIELD)
public class Format {
    @XmlElement(name="name")
    private String name;
    @XmlElement(name="width")
    private int width;
    @XmlElement(name="height")
    private int height;
    @XmlElement(name="extension")
    private String extension;

    //getters and setters, synchronized
}

@XmlRootElement(name="format-list")
@XmlAccessorType(XmlAccessType.FIELD)
public class FormatList {
    @XmlElement(name="format")
    private Vector<Format> formats;


    public Vector<Format> getFormats(){
        return formats;
    }
    // this is the complete class
}

@XmlAccessorType(XmlAccessType.FIELD)
public class Task {
    @XmlElement(name="input")
    private String input;   // String representing the input file
    @XmlElement(name="output")
    private String output; // String representing the output file
    @XmlElement(name="format")
    private Format format; // a jaxb.classes.Format representing the format of conversion
    @XmlElement(name="taskID")
    private long taskID; // a unique ID for each task.
    @XmlElement(name="isReady")
    private boolean isReady; // boolean value representing whether the task is ready for conversion

    @XmlTransient
    private boolean isChanging = false; // boolean representing if the user is changing the task DO NOT MARSHALL
    @XmlTransient
    private boolean isExecuting = false; // boolean representing whether the task is being executed  DO NOT MARSHALL



    // getters and setters, synchronized
}

@XmlRootElement(name="task-list")
@XmlAccessorType(XmlAccessType.FIELD)
public class TaskList {

    public TaskList(){
        tasks = new Vector<Task>();
    }

    @XmlElement(name="task")
    Vector<Task> tasks;

    public Vector<Task> getTasks(){
        return tasks;
    }

    // this is  the complete class

}
4

1 に答える 1

2

エラーは、投稿した XML と一致していないようです。このエラーは、JAXB が要素をアンマーシャリングしようとしているformat-listが、それをどうしたらよいかわからないことを示しています。format-listその XML にはありません。与えられたエラーから、次のようなコードがあると思います:

JAXBContext.newInstance(TaskList.class).createUnmarshaller().unmarshal(xml);

そして、入力として TaskList XML ではなく FormatList XML を与えています。

于 2013-05-26T13:26:30.670 に答える