JSP:SAXParseException - prolog中不允许使用内容

时间:2016-05-11 10:52:14

标签: xml jsp

我想使用以下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的绝对路径,但结果相同。

任何想法我做错了什么?

1 个答案:

答案 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,以使这些更改生效。