Java中使用DOM解析XML文件时Servlet读取无输出问题排查
问题原因与解决方案
1 XML文件路径配置错误
你代码中Document doc = builder.parse("/movies.xml");使用的是操作系统根目录的绝对路径,无法读取到Web应用内部的XML文件,解析时会直接抛出文件找不到异常。你仅在catch块中将异常栈打印到服务端控制台,没有向前端输出任何错误信息,所以浏览器看起来没有任何反馈。
正确读取Web应用内部资源的方式如下,需要先将movies.xml放到Web应用根目录(与WEB-INF文件夹同级):
// 替换原有的parse代码行 InputStream is = getServletContext().getResourceAsStream("/movies.xml"); Document doc = builder.parse(is);
如果XML文件放在WEB-INF目录下,路径修改为/WEB-INF/movies.xml即可。
2 DOM节点读取逻辑错误
DOM解析器会把XML标签之间的换行、空白字符识别为独立的文本节点,你直接用getChildNodes().item(0)获取到的不是<Name>标签,而是<Movie>和<Name>标签之间的空白文本节点,拿到的内容是空值,自然不会显示有效内容。
不要通过固定索引获取子节点,应该通过标签名精准获取,同时补充缺失的字段输出逻辑:
// 替换原有的遍历逻辑 for(int i = 0; i < elements.getLength(); i++){ Element movie = (Element) elements.item(i); // 读取属性id String id = movie.getAttribute("id"); // 按标签名读取各字段内容,trim()可以去掉多余的空白字符 String name = movie.getElementsByTagName("Name").item(0).getTextContent().trim(); String genre = movie.getElementsByTagName("Genre").item(0).getTextContent().trim(); String director = movie.getElementsByTagName("Director").item(0).getTextContent().trim(); String releaseDate = movie.getElementsByTagName("releaseDate").item(0).getTextContent().trim(); String trailer = movie.getElementsByTagName("Trailer").item(0).getTextContent().trim(); // 输出完整的表格行 out.println("<tr>" + "<td>" + id + "</td>" + "<td>" + name + "</td>" + "<td>" + genre + "</td>" + "<td>" + director + "</td>" + "<td>" + releaseDate + "</td>" + "<td>" + trailer + "</td>" + "</tr>"); }
3 补充异常提示逻辑
可以在catch块中增加前端错误输出,方便排查问题:
catch (Exception e) { e.printStackTrace(); out.println("<p>读取电影信息失败:" + e.getMessage() + "</p>"); }
内容的提问来源于stack exchange,提问作者Mohammed Hamdoon
相关产品推荐
相关产品推荐

