Java プログラムによって生成された XML ファイルを再読み取りし、それをグラフィカルに表現したJTable
フォームを提供しようとしています。手動で生成された XML はスキーマに準拠していますが、プログラムはそれを無効として検出します。
ロジックは単純です
。1 . task-list.xml
andtask-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
したがって、各ビデオ変換タスクには関連付けられた形式があるため FormatList
、Task
両方が同じクラスを共有します。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
}