我想使用以下jsp脚本解析xml文件:
<%@ page contentType="text/html; charset=utf-8" language="java" %>
<%@ page import="javax.xml.parsers.DocumentBuilderFactory" %>
<%@ page import="javax.xml.parsers.DocumentBuilder" %>
<%@ page import="org.xml.sax.SAXParseException" %>
<%@ page import="java.io.File" %>
<%@ page import="java.io.InputSource" %>
<%@ page import="java.io.StringReader" %>
<%@ page import="org.w3c.dom.Document" %>
<%
try
{
String xmlFileURI = "test\\foo.xml";
File file = new File (xmlFileURI);
if (file.exists ())
{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance ();
DocumentBuilder builder = factory.newDocumentBuilder ();
InputSource is = new InputSource (new StringReader (xmlFileURI));
Document document = builder.parse (is);
}
}
catch (IOException ioEx)
{
out.println ("<p>");
out.println("IOException: " + ioEx.getMessage ());
}
catch (SAXParseException saxEx)
{
out.println ("<p>");
out.println("SAXParseException: " + saxEx);
}
%>
然而,
行builder.parse (is);
始终抛出此异常:
org.xml.sax.SAXParseException; lineNumber:1; columnNumber:1; prolog中不允许使用内容。
我发现很多其他人已经遇到过这个问题,但他们似乎主要是因为他们的xml文件中有BOM。我打印出文件的十六进制值,它以
开头3c 3f 78 6d 20 76等。
所以我看起来很好。
我的xml看起来像这样
<?xml version="1.0" encoding="UTF-8"?>
<foo>
<bar>asdf</bar>
<foobar>asdf</foobar>
</foo>
位于C:\Tomcat8.0\test
。我也尝试使用xmlFileURI
的绝对路径,但结果相同。
任何想法我做错了什么?
答案 0 :(得分:0)
看起来Java StringReader
接受字符串,而不是URI 到一个文件,其内容将被读作字符串。所以在这种情况下,你的代码将值“test \ foo.xml”传递给builder.parse()
,而不是传递'foo.xml'文件的字符串内容,因此错误。
也就是说,使用builder.parse(file)
*代替:
String xmlFileURI = "test\\foo.xml";
File file = new File (xmlFileURI);
if (file.exists ())
{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(file);
}
*)不是Java程序员,从here得到了这个想法。并且不要忘记像OP提到的那样重启Tomcat,以使这些更改生效。