Java 从doPost HttpServletRequest读取xml时出错

Java 从doPost HttpServletRequest读取xml时出错,java,xml,servlets,Java,Xml,Servlets,我正在尝试使用httpdoPost方法读取正在发布的XML文件。使用SAXParser进行分析时,会引发异常: Content is not allowed in prolog. doPost代码为: protected void doPost(HttpServletRequest request, HttpServletResponse response) { ServletInputStream httpIn = request.getInputStream();

我正在尝试使用http
doPost
方法读取正在发布的XML文件。使用SAXParser进行分析时,会引发异常:

Content is not allowed in prolog.
doPost代码为:

protected void doPost(HttpServletRequest request, HttpServletResponse response)
{    
    ServletInputStream httpIn = request.getInputStream();        
    byte[] httpInData = new byte[request.getContentLength()];
    StringBuffer readBuffer = new StringBuffer();
    int retVal = -1;
    while ((retVal = httpIn.read(httpInData)) != -1)
    {
        for (int i=0; i<retVal; i++)
        {
            readBuffer.append(Character.toString((char)httpInData[i]));
        }                   
    }

    System.out.println("XML Received" + readBuffer);
    try 
    {
        SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
        ByteArrayInputStream inputStream = new ByteArrayInputStream(
            readBuffer.toString().getBytes("UTF-8"));
        final XmlParser xmlParser = new XmlParser();
        parser.parse(inputStream, xmlParser);               
    }
    catch (Exception e)
    {
        System.out.println("Exception parsing the xml request" + e);
    }
}
这是在SAXparser中引发异常:

我做错了什么?我是以错误的方式发送XML还是以错误的方式读取XML?

您认为

httpInData[i]
是一个字符,而它是一个字节。你的内容是UTF-8,这会有很大的不同。改用读卡器

然后,对XML进行URL编码,这是无用的,因为它是一个POST数据。不要对其进行编码,只需发送数据即可

替换

urlParameters = URLEncoder.encode(buffer.toString(), "UTF-8");

此外,名称urlparmeter选择不当,因为这是一个单独的帖子正文,不在url中,也不是一个真正的参数。

httpInData[i]
是一个字符,而它是一个字节。你的内容是UTF-8,这会有很大的不同。改用读卡器

然后,对XML进行URL编码,这是无用的,因为它是一个POST数据。不要对其进行编码,只需发送数据即可

替换

urlParameters = URLEncoder.encode(buffer.toString(), "UTF-8");


此外,url参数名称选择不当,因为这是一个单独的帖子正文,不在url中,也不是真正的参数。

您混合了几个基本概念。只有当您以
application/x-www-form-urlencoded
格式发送数据时,才需要URL编码,例如
name1=value1&name2=value2&name3=value3
(就像每个HTML
一样)。因此,如果您发送类似于
XML=…
的XML,那么您确实应该对值进行URL编码,但不应该使用
request.getInputStream()
,而应该使用
request.getParameter(“XML”)
直接将其作为字符串获取。还可以看到,您混合了几个基本概念。只有当您以
application/x-www-form-urlencoded
格式发送数据时,才需要URL编码,例如
name1=value1&name2=value2&name3=value3
(就像每个HTML
一样)。因此,如果您发送类似于
XML=…
的XML,那么您确实应该对值进行URL编码,但不应该使用
request.getInputStream()
,而应该使用
request.getParameter(“XML”)
直接将其作为字符串获取。另见
urlParameters = buffer.toString();