次のようにJAXBを使用してXMLファイルを作成しています。
public final class Main
{
private File file;
private transient JAXBContext jaxb;
List<Fruit>fruits;
private void test()
{
try {
jaxb=JAXBContext.newInstance(Fruits.class);
file=new File(System.getenv("UPLOAD_LOCATION")+"\\xml_files\\fruits.xml");
Marshaller marshaller = jaxb.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.FALSE);
if(!file.exists()) {
file.createNewFile();
marshaller.marshal(new Fruits(new ArrayList<Fruit>()), file);
}
else {
fruits=((Fruits) jaxb.createUnmarshaller().unmarshal(file)).getList();
}
for(Fruit fruit:fruits) {
System.out.println(fruit.getId()+" : "+fruit.getName()+" : "+fruit.getPrice());
}
} catch (JAXBException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}/*catch (SAXParseException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}*/
}
public static void main(String... args) {
new Main().test();
}
}
オブジェクトを追加するコードは除外されます。ただし、次のようなXMLファイルが生成されます。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<fruits>
<fruit id="1">
<name>Mango</name>
<price>100</price>
</fruit>
<fruit id="2">
<name>Banana</name>
<price>50</price>
</fruit>
<fruit id="3">
<name>Pineapple</name>
<price>80</price>
</fruit>
</fruits>
このXMLファイルが、外部で変更される可能性があるなど、特定の理由で無効化された場合。
このファイルに複数の形式のXML形式が含まれている場合は、をスローしorg.xml.sax.SAXParseException
ます。この例外がスローされた場合は、このファイルを再作成します。それ以外の場合は、XMLコンテンツを手動で変更して再構築しない限り、例外が継続的にスローされます。そのためには、この例外をキャッチする必要があります。
コンパイラは、この例外のキャッチを拒否します。catch
切り取られたコードに示されているように、この例外の追加ブロックが試行されると、次のように文句を言います。
org.xml.sax.SAXParseException
対応するtry
ステートメントの本文に例外がスローされることはありません
この例外がスローされた場合にファイルを再作成(古いファイルを削除)できるように、この例外を処理するにはどうすればよいですか?
XML要素を作成するクラス(Fruit
およびFruits
)は、この質問とはあまり関係がないため、ここでは示していません。
SAXParseException
はチェックされた例外であり、メソッドunmarshal()
で宣言されていないため、キャッチできないのは正常です。
あなたが捕まえることができるもう一つの例外があります、それはjavax.xml.bind.UnmarshalException
です。この例外は拡張されるjavax.xml.bind.JAXBException
ため、catch
ブロックをの前に配置する必要がありますJAXBException
。
メソッドのドキュメントでは、検証エラーが発生した場合、またはXMLからJavaへのバインディングを実行できない場合にスローさunmarshal()
れるUnmarshalException
と記載されUnmarshaller
ています。
注:の実装で確認しましUnmarshaller
た
org.xml.sax.SAXException
が、発生すると、でラップされますjavax.xml.bind.UnmarshalException
。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加