【问题标题】:Why `javax.xml.parsers.DocumentBuilder.parse("filename.xml")` method looking for a `XML` file in Operating system's home directory, but not project's为什么`javax.xml.parsers.DocumentBuilder.parse("filename.xml")`方法在操作系统的主目录中寻找`XML`文件,而不是项目的
【发布时间】:2016-08-08 06:31:30
【问题描述】:

以下ModifyXML Java class 用于读取XML 文件并返回指定标签的“名称”属性的所有值。 对于下面的XML 文件,它应该返回一个包含tc_001tc_002ArrayList<String>

<root>
    <tc name="tc_001">
    </tc>
    <tc name="tc_002">
    </tc>
</root>

首先,我在Eclipse 中的一个单独的Java 项目中创建了该类,其中的main 方法创建了一个新的ModifyXML 对象并使用该对象调用getTCs() 方法。文件结构is this。在那个项目中,我直接使用文件路径作为“test.xml”,这在运行时不会导致错误。

public class ModifyXML {

    /*
     * constructor
     * initializing main objects
     */
    public ModifyXML() {

        //this is the file path i used
        filePath = "test.xml";              

        factory = DocumentBuilderFactory.newInstance();
        builder = factory.newDocumentBuilder();
        document = builder.parse(filePath);
    }


    /*
     *getTCs method
     */
    public ArrayList<String> getTCs(String tagType) {
        ArrayList<String> tcList = new ArrayList<>();
        String attributeName = "name";

        NodeList nodes = document.getElementsByTagName(tagType);
        int j = nodes.getLength();

        for(int i = 0; i < j; i++){
            Node tc = nodes.item(i);
            if(tc.getNodeType() == Node.ELEMENT_NODE){
                String tcName = tc.getAttributes().getNamedItem(attributeName).getNodeValue();
                tcList.add(tcName);
            }
        }

        Iterator<String> iter = tcList.iterator();
        while(iter.hasNext())
            System.out.println(iter.next());

        return tcList;
    }

public static void main(String[] args) {
        ModifyXML a = new ModifyXML();
        a.getTCs("tc");
    }

然后我将该类复制到Dynamic Web Page 项目的src 文件夹和test.xml 文件到Dynamic Web Page 项目,然后我删除了该类的主要方法。 Dynamic Web Page 项目is this. 的文件结构但是当我调用getTCs() 方法时,在servletservice() 方法中,发生了异常。

java.io.FileNotFoundException: /home/srinesh/test.xml (No such file or directory)

我使用的是 Ubuntu,/home/srinesh/ 是我的主目录。我的Dynamic Web Page 项目的项目目录是/home/dazz/Projects/workspace/Sanitizor/。为什么只有当该类位于 Dynamic Web Page 项目中时,该类才在我的主目录中查找 test.xml 文件?

Servlet 类如下所示。

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html");
    PrintWriter printWriter  = response.getWriter();

    ModifyXML xml = new ModifyXML("test.xml");
    ArrayList<String> tc = xml.getTCs("tc");

【问题讨论】:

    标签: java xml eclipse servlets


    【解决方案1】:

    使用相对路径不是一个好主意,正如您所看到的,有时您可能会从不同的目录运行项目。 所以要么使用文件的绝对路径("/some/path/to/your/file/file.xml"),要么使用类路径来读取它,例如:

    document = builder.parse(ModifyXML.class.getResourceAsStream("/" + filePath);
    

    在第二种情况下,您必须将文件放在类路径的根目录下。

    【讨论】:

    • 两个选项都没有先工作:org.xml.sax.SAXParseException; systemId:file:///home/dazz/Projects/workspace/Sanitizor/;行号:1;列号:1;序言中不能有内容。第二:java.lang.IllegalArgumentException: InputStream 不能为空
    • 那个错误信息听起来有点像你的 xml 文件有问题。
    猜你喜欢
    • 2017-04-12
    • 2012-08-08
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 2016-08-22
    • 2011-12-22
    • 1970-01-01
    相关资源
    最近更新 更多