怎么办“builder.parse(存储这个罐子里面的xml文件)”?

问题描述 投票:0回答:1

我试图用一个文件对象,与当前的jar文件,这是运行的内部XML文件的路径,在builder.parse(不xml文件的绝对路径);

的DocumentBuilder助洗剂= dbf.newDocumentBuilder();

文档DOC = builder.parse( “资源/ userConfig.xml”);

该代码在食,但在导出的jar文件不一样。当我运行导出的罐子它无法找到在C XML:\用户...

java file parsing jar
1个回答
0
投票

对于你的情况,你需要的一个,但低于去年的方法,即采用一个InputStream。最后一种方法是添加为你的情况与在类路径的jar文件的例子。您可能需要以不同的方式做exceptionhandling。

public class XMLLib {

    public static DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();

    public static Document readXML(File file) {
        try {
            final DocumentBuilder builder = builderFactory.newDocumentBuilder();
            return builder.parse(file);
        } catch (ParserConfigurationException ex) {
           return null;
        } catch (SAXException | IOException ex) {
           return null;
        }
    }

    public static Document readXML(InputStream is) {
        try {
            final DocumentBuilder builder = builderFactory.newDocumentBuilder();
            return builder.parse(is);
        } catch (ParserConfigurationException ex) {
             return null;
        } catch (SAXException | IOException ex) {
            return null;
        }
    }

    //example call:
    public static Document getDocumentResource(String resourcepath){
        try (InputStream is = XMLLib.class.getResourceAsStream(resourcepath)){
             return readXML(is); 
         } catch (IOException ex) {}
         return null;
    }
}

一些更多的交代:在Eclipse环境中的XML文件提取出来,这样你就可以直接访问它作为一个文件(因为它是一个“文件”)。现在,在一个罐子里的一切,所以你必须从JAR文件中提取的XML不存在,作为一个“文件”了。类装入器能够通过的getResourceAsStream这样做 - 就像它可以读取其他资源和类。因此,在本质上,这是什么做的是加载,如Java的XML加载的类。对于工作,resourcepath必须相对于类路径给出。以上仅InputStream的版本将工作(或一些其它的形式给出,例如使用路径和文件系统)

Usualy如果你在“资源/ userConfig.xml”有一个资源的路径是简单的“/userConfig.xml”。 (但是这取决于项目是如何组装的)

我只能猜测(取决于项目是如何组装)在您的情况,您需要:

Document document = XMLLib.getDocumentResource("/userConfig.xml");

重要提示:为InputStream版在罐子里,用提取的文件的文件(这是百达) - 只要它可以被加载器找到。

© www.soinside.com 2019 - 2024. All rights reserved.