簡體   English   中英

使用JAXB讀寫XML文件時處理org.xml.sax.SAXParseException

[英]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元素的類( FruitFruits ),因為它們與該問題不太相關。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM