返回信息流本来一般都是StackOverFlow查的,可这个真不知道怎么用英文描述。。
说一下前提条件,是页面传过来的utf-8编码的xml字符串
可是发现这个字符串传过来,虽然jsp页面声称request和response同时xml都声称utf-8编码,但实际上并不是
于是先把它进行了转码,用的是下面的代码:
[code]
String utf8Xml = new String(xml.getBytes(), "utf-8");
[/code]
于是消除了编码上的报错
给一个例xml吧:
[code]
//为了美观进行了换行,实际上字符串里面没有的
<?xml version="1.0" encoding="UTF-8"?>
<reports>
<report>
<date>report1date</date>
<project>report1project</project>
<hour>report1hour</hour>
<description>report1description</description>
</report>
</reports>
[/code]
下面是把xml字符串转化为Element对象,然后进行DOM解析,然后封装在对象里面
下面的代码主要看注释
[code]
//把xml字符串转化为Element对象
Element root = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(newByteArrayInputStream(utf8Xml.getBytes())).getDocumentElement();
//下面实际上就是一条一条解析了
NodeList reports = root.getChildNodes();
//调试发现对于上面的xml字符串,这个reports的length=4
if (reports != null) {
for (int i = 0, size = reports.getLength(); i < size; i++) {
Node report = reports.item(i);
//而实际上下面的输出字段只输出了一次
//而且,下面的对象产生了4个。。。
//这完全不符合逻辑好么(╯‵□′)╯︵┻━┻
System.out.println("this is the report "+i+" and it's name is "+report.getNodeName());
DisplayReports.Reports singleReport = (new DisplayReports()).new Reports();
for (Node node = report.getFirstChild(); node != null; node = node.getNextSibling()) {
if (node.getNodeType() == Node.ELEMENT_NODE) {
if (node.getNodeName().equals("date")) {
String date = node.getFirstChild().getNodeValue();
singleReport.date = date;
}
if (node.getNodeName().equals("project")) {
String project = node.getFirstChild().getNodeValue();
singleReport.project = project;
}
if (node.getNodeName().equals("hour")) {
String hour = node.getFirstChild().getNodeValue();
singleReport.hour = Double.parseDouble(hour);
}
if (node.getNodeName().equals("description")) {
String description = node.getFirstChild().getNodeValue();
singleReport.description = description;
}
}
result.add(singleReport);
[/code]
我自己单独处理自建的字符串是没有问题的。。
有些怀疑是不是编码的问题?
求大神们指条明路。。。
这是一条镜像帖。来源:北邮人论坛 / java / #27341同步于 2013/10/14
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
【求助】把xml字符串转化为对象扔进数据中遇见了问题
liuqiji
2013/10/14镜像同步12 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
String utf8Xml = new String(xml.getBytes(), "utf-8");
这一行不对(虽然很多人这样做,而且很多时候可以工作)。
这一行的意思是先按当前系统编码编成byte[],然后按utf-8解码。但这显然不是你想做的:你应该让xml从一开始就是正确的编码。
先回答几个问题吧:
1. XML如何传递进当前页面?用GET方式还是POST方式?具体说说请求的格式大概是什么样的。
2. 你用的是什么Web服务器?Tomcat?Jetty?
大神你好~!么么哒!
这句话是在StackOverFlow捡过来的
post方式从jsp传到tomcat服务器
就ajax把这个xml字符串传了过来,同时传了一个用户id
就是"xml="+xml+"&&userId="+userId传过来的
能声明的都声明了utf-8的编码
这该怎么搞。。
【 在 nuanyangyang 的大作中提到: 】
: String utf8Xml = new String(xml.getBytes(), "utf-8");
: 这一行不对(虽然很多人这样做,而且很多时候可以工作)。
: 这一行的意思是先按当前系统编码编成byte[],然后按utf-8解码。但这显然不是你想做的:你应该让xml从一开始就是正确的编码。
: ...................
感觉不像是编码问题
贴的代码不完整
建议在好好检查下逻辑
【 在 liuqiji 的大作中提到: 】
: 本来一般都是StackOverFlow查的,可这个真不知道怎么用英文描述。。
: 说一下前提条件,是页面传过来的utf-8编码的xml字符串
: 可是发现这个字符串传过来,虽然jsp页面声称request和response同时xml都声称utf-8编码,但实际上并不是
: ...................
首先我测试的结果是这段代码出了问题
但是单独测试(就是设定好xml字符串是什么那种)又没有问题
而jsp那边传过来的字符串console出来也没有问题
就开始怀疑是不是编码的问题了。。
代码不能说把jsp页面全贴上来吧。。
你想看哪段。。
【 在 yanxuan 的大作中提到: 】
: 感觉不像是编码问题
: 贴的代码不完整
: 建议在好好检查下逻辑
//把xml字符串转化为Element对象
//打印下utf8Xml 看看是否符合你的预期
Element root = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(newByteArrayInputStream(utf8Xml.getBytes())).getDocumentElement();
//下面实际上就是一条一条解析了
NodeList reports = root.getChildNodes();
//调试发现对于上面的xml字符串,这个reports的length=4
//在确认下reports的length=4还是1
if (reports != null) {
for (int i = 0, size = reports.getLength(); i < size; i++) {
Node report = reports.item(i);
//而实际上下面的输出字段只输出了一次
//而且,下面的对象产生了4个。。。
//这完全不符合逻辑好么(╯‵□′)╯︵┻━┻
//输出一次因为reports的length=1,对象只产生一个,只不过往result里add了四次这个对象
System.out.println("this is the report "+i+" and it's name is "+report.getNodeName());
DisplayReports.Reports singleReport = (new DisplayReports()).new Reports();
for (Node node = report.getFirstChild(); node != null; node = node.getNextSibling()) {
if (node.getNodeType() == Node.ELEMENT_NODE) {
if (node.getNodeName().equals("date")) {
String date = node.getFirstChild().getNodeValue();
singleReport.date = date;
}
if (node.getNodeName().equals("project")) {
String project = node.getFirstChild().getNodeValue();
singleReport.project = project;
}
if (node.getNodeName().equals("hour")) {
String hour = node.getFirstChild().getNodeValue();
singleReport.hour = Double.parseDouble(hour);
}
if (node.getNodeName().equals("description")) {
String description = node.getFirstChild().getNodeValue();
singleReport.description = description;
}
}
result.add(singleReport);
【 在 liuqiji 的大作中提到: 】
: 首先我测试的结果是这段代码出了问题
: 但是单独测试(就是设定好xml字符串是什么那种)又没有问题
: 而jsp那边传过来的字符串console出来也没有问题
: ...................
【 在 liuqiji 的大作中提到: 】
: 大神你好~!么么哒!
: 这句话是在StackOverFlow捡过来的
: post方式从jsp传到tomcat服务器
: ...................
不知道我理解得对不对,我理解:用户首先打开一个页面,这个页面是用jsp写的,上面有个表单(或者某个按钮什么的)。用户提交这个表单(或者按了按钮什么的,或者发生了什么事件),这个页面通过AJAX向服务器发送POST请求,请求以UTF-8编码,其中有一个参数的内容是XML。是这样吗?
那么接受请求的是什么?是另一个用jsp写的页面吗?还是一个Servlet?
没错
是用servlet接受的
【 在 nuanyangyang 的大作中提到: 】
:
: 不知道我理解得对不对,我理解:用户首先打开一个页面,这个页面是用jsp写的,上面有个表单(或者某个按钮什么的)。用户提交这个表单(或者按了按钮什么的,或者发生了什么事件),这个页面通过AJAX向服务器发送POST请求,请求以UTF-8编码,其中有一个参数的内容是XML。是这样吗?
: 那么接受请求的是什么?是另一个用jsp写的页面吗?还是一个Servlet?