使用JAXB读取和写入XML文件时处理org.xml.sax.SAXParseException

时间:2014-06-28 01:09:48

标签: java xml jaxb java-7

我使用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元素的类(FruitFruits),因为它们与此问题并不完全相关。

1 个答案:

答案 0 :(得分:2)

SAXParseException是一个已检查的异常,并未在方法unmarshal()上声明,因此您无法捕获它。

您可以捕获另一个例外,即javax.xml.bind.UnmarshalException。此异常扩展为javax.xml.bind.JAXBException,因此您必须将catch阻止放在JAXBException之前。

在方法unmarshal()的文档中,它表示如果发生验证错误或UnmarshalException无法执行XML到Java绑定,则抛出Unmarshaller

注意:我在Unmarshaller的实施中以及何时执行了验证 org.xml.sax.SAXException发生,它包含在javax.xml.bind.UnmarshalException

相关问题