BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #27341同步于 2013/10/14
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

【求助】把xml字符串转化为对象扔进数据中遇见了问题

liuqiji
2013/10/14镜像同步12 回复
本来一般都是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] 我自己单独处理自建的字符串是没有问题的。。 有些怀疑是不是编码的问题? 求大神们指条明路。。。
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
zhang9647610机器人#1 · 2013/10/14
你这是用什么解析xml啊,dom4j?
liuqiji机器人#2 · 2013/10/14
就是dom解析 不是dom4j 【 在 zhang9647610 的大作中提到: 】 : 你这是用什么解析xml啊,dom4j?
nuanyangyang机器人#3 · 2013/10/14
String utf8Xml = new String(xml.getBytes(), "utf-8"); 这一行不对(虽然很多人这样做,而且很多时候可以工作)。 这一行的意思是先按当前系统编码编成byte[],然后按utf-8解码。但这显然不是你想做的:你应该让xml从一开始就是正确的编码。 先回答几个问题吧: 1. XML如何传递进当前页面?用GET方式还是POST方式?具体说说请求的格式大概是什么样的。 2. 你用的是什么Web服务器?Tomcat?Jetty?
liuqiji机器人#4 · 2013/10/14
大神你好~!么么哒! 这句话是在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从一开始就是正确的编码。 : ...................
yanxuan机器人#5 · 2013/10/14
感觉不像是编码问题 贴的代码不完整 建议在好好检查下逻辑 【 在 liuqiji 的大作中提到: 】 : 本来一般都是StackOverFlow查的,可这个真不知道怎么用英文描述。。 : 说一下前提条件,是页面传过来的utf-8编码的xml字符串 : 可是发现这个字符串传过来,虽然jsp页面声称request和response同时xml都声称utf-8编码,但实际上并不是 : ...................
liuqiji机器人#6 · 2013/10/14
首先我测试的结果是这段代码出了问题 但是单独测试(就是设定好xml字符串是什么那种)又没有问题 而jsp那边传过来的字符串console出来也没有问题 就开始怀疑是不是编码的问题了。。 代码不能说把jsp页面全贴上来吧。。 你想看哪段。。 【 在 yanxuan 的大作中提到: 】 : 感觉不像是编码问题 : 贴的代码不完整 : 建议在好好检查下逻辑
yanxuan机器人#7 · 2013/10/14
//把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出来也没有问题 : ...................
nuanyangyang机器人#8 · 2013/10/14
【 在 liuqiji 的大作中提到: 】 : 大神你好~!么么哒! : 这句话是在StackOverFlow捡过来的 : post方式从jsp传到tomcat服务器 : ................... 不知道我理解得对不对,我理解:用户首先打开一个页面,这个页面是用jsp写的,上面有个表单(或者某个按钮什么的)。用户提交这个表单(或者按了按钮什么的,或者发生了什么事件),这个页面通过AJAX向服务器发送POST请求,请求以UTF-8编码,其中有一个参数的内容是XML。是这样吗? 那么接受请求的是什么?是另一个用jsp写的页面吗?还是一个Servlet?
liuqiji机器人#9 · 2013/10/14
没错 是用servlet接受的 【 在 nuanyangyang 的大作中提到: 】 : : 不知道我理解得对不对,我理解:用户首先打开一个页面,这个页面是用jsp写的,上面有个表单(或者某个按钮什么的)。用户提交这个表单(或者按了按钮什么的,或者发生了什么事件),这个页面通过AJAX向服务器发送POST请求,请求以UTF-8编码,其中有一个参数的内容是XML。是这样吗? : 那么接受请求的是什么?是另一个用jsp写的页面吗?还是一个Servlet?