为什么在解析java中的xml文件时需要包含ClassLoader.getSystemResourcesAsStream()?

时间:2014-01-07 03:45:16

标签: java xml

所以我正在学习如何用Java解析XML文件,我从这开始:

public class XMLParser {
    public static void main(String args[]) throws Exception {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document doc = builder.parse(ClassLoader.getSystemResourceAsStream("yql.xml"));


    }
}

我不确定为什么我需要使用ClassLoader.getSystemResourceAsStream(“yql.xml”)。我在网上找到了这个解决方案,因为我不能只使用builder.parse(“yql.xml”)。我的问题是:为什么我在阅读xml文件时需要包含这一行?它做了什么,是否有更简单的方法使用DOM读取XML而不使用ClassLoader?

2 个答案:

答案 0 :(得分:2)

您应该将XML读作InputStream以将其传递给DOM解析器。

唯一的一点是XML文件所在的位置,根据每个位置,您可以使用不同的机制。

如果您知道XML文件的确切位置,并且想要在应用程序中对其进行硬编码,则可以执行以下操作:

InputSteram is = new FileInputStream("/path/to/xml/file.xml");

如果要将XML存储在类路径中(在类之间或类路径中包含的JAR文件中),您应该通过适当的ClassLoader找到它。

InputSream is = ClassLoader.getSystemResourceAsStream("yql.xml");

如果您正在开发一个WEB应用程序而您的XML是您的WEB-INF文件夹,那么您应该使用以下内容:

InputStream is = servletContext.getResourceAsStream("/WEB-INF/relative/path/to/xml/file.xml");

等等(可能还有其他解决方案,例如从URL检索XML,从ZIP文件读取,以及......)。

因此使用ClassLoader不是必须的,这完全取决于您的项目+ XML文件布局。

答案 1 :(得分:0)

ClassLoader.getSystemResourceAsStream(String name)

用于从类路径中将资源读取为流。使用它的一个优点是它允许避免硬编码文件的路径。所以当你使用这个状态时:

ClassLoader.getSystemResourceAsStream("yql.xml")

您实际上没有提供yql.xml的完整/相对路径。如果您的文件存在于类路径中,则将获取该文件。