![](/img/trans.png)
[英]org.xml.sax.SAXParseException while parsing XMl using XPATH
[英]Handling org.xml.sax.SAXParseException while reading and writing an XML file using JAXB
我正在使用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
塊(如代碼片段所示),則會抱怨,
永遠不會在相應的
try
語句的主體中引發異常org.xml.sax.SAXParseException
如何處理此異常,以便在拋出此異常的情況下可以重新創建文件(刪除舊文件)?
我沒有顯示創建XML元素的類( Fruit
和Fruits
),因為它們與該問題不太相關。
SAXParseException
是一個已檢查的異常,未在方法unmarshal()
上聲明,因此通常無法捕獲它。
您還可以捕獲另一個異常,即javax.xml.bind.UnmarshalException
。 此異常擴展了javax.xml.bind.JAXBException
因此您必須將catch
塊放在JAXBException
之前。
在該方法的文檔unmarshal()
它說, UnmarshalException
被拋出,如果發生驗證錯誤或Unmarshaller
是無法執行XML到Java的綁定。
注意:我在Unmarshaller
的實施中以及何時
發生org.xml.sax.SAXException
,它包裝在javax.xml.bind.UnmarshalException
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.