【发布时间】:2021-11-15 18:50:59
【问题描述】:
我在 java 中创建了一个 XML 文件,该 XML 文件由电影名称、发行日期和预告片组成,编写 XML 文件不是问题,但是当我尝试使用 servlet 从 XML 文件中读取时浏览器没有显示 XML 文件中的任何信息,没有出现错误,代码正在运行,但由于某种原因它没有从文件中读取,我正在使用 DOM 解析器方法来读取和写入,任何人都可以请告诉我读取 XML 文件的方式有什么问题?
这是 XML 文件:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<cinema>
<Movie id="10">
<Name>Army of Thieves</Name>
<Genre>Comedy/Action</Genre>
<Director>Matthias Schweighöfer</Director>
<releaseDate>29/10/2021</releaseDate>
<Trailer>https://www.youtube.com/watch?v=Ith2WetKXlg</Trailer>
</Movie>
<Movie id="11">
<Name>Dune</Name>
<Genre>Sci-Fi/Adventure</Genre>
<Director> Denis Villeneuve</Director>
<releaseDate>16/09/2021</releaseDate>
<Trailer>https://www.youtube.com/watch?v=n9xhJrPXop4</Trailer>
</Movie>
</cinema>
这是 servlet:
import java.io.*;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.w3c.dom.*;
import javax.xml.parsers.*;
public class HelloServlet extends HttpServlet {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
public void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException,IOException {
response.setContentType("text/html");
try {
PrintWriter out = response.getWriter();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse("/movies.xml"); //put the xml path here
NodeList elements = doc.getDocumentElement().getElementsByTagName("Movie");
out.println("<table><tr><th>ID</th><th>Name</th><th>Genre</th><th>Director</th>
<th>releaseDate</th><th>Trailer</th></tr>");
if(elements.getLength() == 0){
out.println("<tr><td>No information</td></tr>");
}
else{
for(int i = 0; i < elements.getLength(); i++){
out.println("<tr>
<td>"+elements.item(i).getAttributes().item(0).getTextContent()+"</td>"+
"
<td>"+elements.item(i).getChildNodes().item(0).getTextContent()+"</td>"+
"
<td>"+elements.item(i).getChildNodes().item(1).getTextContent()+"</td></tr>");
}
}
out.println("</table>");
} catch (Exception e) {
e.printStackTrace();
}
}
}
【问题讨论】:
-
我建议使用调试器逐步完成此操作,以了解发生了什么。
-
首先,您应该将 e.printStackTrace() 更改为
throw new RuntimeException(e);。这样,您将确定是否发生错误。其次,不要使用getAttributes()或getChildNodes()。有时文档解析器会添加属性,而子节点不仅仅是元素。使用getAttribute("id")、getElementByTagName("Name")、getElementByTagName("Genre")等