dom4j解析xml文件很多大牛都给出了完善的流程,这里贴一下自我觉得比较全面的大神写的链接dom4j解析xml文件及其乱码问题处理;解析及其乱码问题我就不过多赘述,下面给说一下我自己如何与后台数据交互的。
自我觉得xml文件存储数据与数据库存储类似,当然数据量不可相比,存取数据相对数据库,其实更加简便,不需要jdbc,dao,service,当然javaBean还是需要的,下面给出贴出具体代码:
需要解析的xml文件:我这里只需要<Fish/>的节点信息
<Config>
<Stock>
<key stockScore="0" increaseProbability="0"/>
<key stockScore="1" increaseProbability="0.1"/>
<key stockScore="5000000" increaseProbability="0.1"/>
<key stockScore="10000000" increaseProbability="1"/>
<key stockScore="20000000" increaseProbability="2"/>
<key stockScore="50000000" increaseProbability="3"/>
<key stockScore="100000000" increaseProbability="4"/>
<key stockScore="400000000" increaseProbability="5"/>
<key stockScore="500000000" increaseProbability="6"/>
<key stockScore="600000000" increaseProbability="7"/>
</Stock>
<Fish kind="0" name="蜗牛鱼" speed="5" multiple="5" BoundingBox="55,15" hitRadius="5" captureProbability="5"/>
<Fish kind="1" name="绿草鱼" speed="11" multiple="21" BoundingBox="60,25" hitRadius="51" captureProbability="0.6"/>
<Fish kind="2" name="黄草鱼" speed="5" multiple="3" BoundingBox="80,32" hitRadius="10" captureProbability="0.33"/>
<Fish kind="3" name="大眼鱼" speed="8" multiple="9" BoundingBox="70,43" hitRadius="12" captureProbability="0.33"/>
<Fish kind="4" name="黄扁鱼" speed="5" multiple="5" BoundingBox="80,54" hitRadius="10" captureProbability="0.18"/>
<Fish kind="5" name="小丑鱼" speed="5" multiple="6" BoundingBox="90,70" hitRadius="10" captureProbability="0.13"/>
<Fish kind="6" name="小刺鱼" speed="5" multiple="7" BoundingBox="90,40" hitRadius="10" captureProbability="0.12"/>
</Config>
保存各种鱼属性的javaBean:FishBean
public class FishBean {
private String kind;
private String name;
private String speed;
private String multiple;
private String hitRadius;
private String captureProbability;
public FishBean() {
super();
}
public FishBean(String kind, String name, String speed, String multiple, String hitRadius,
String captureProbability) {
super();
this.kind = kind;
this.name = name;
this.speed = speed;
this.multiple = multiple;
this.hitRadius = hitRadius;
this.captureProbability = captureProbability;
}
public String getKind() {
return kind;
}
public void setKind(String kind) {
this.kind = kind;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSpeed() {
return speed;
}
public void setSpeed(String speed) {
this.speed = speed;
}
public String getMultiple() {
return multiple;
}
public void setMultiple(String multiple) {
this.multiple = multiple;
}
public String getHitRadius() {
return hitRadius;
}
public void setHitRadius(String hitRadius) {
this.hitRadius = hitRadius;
}
public String getCaptureProbability() {
return captureProbability;
}
public void setCaptureProbability(String captureProbability) {
this.captureProbability = captureProbability;
}
}
原生servlet交互数据:FishServlet
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import com.qjs.model.FishBean;
/**
* Servlet implementation class FishGoldToadServlet
*/
@WebServlet("/FishGoldToadServlet")
public class FishGoldToadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
//提前声明好鱼的各种属性字段,避免后面赘写
private String name="";
private String speed="";
private String multiple="";
private String hitRadius="";
private String captureProbability="";
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session=request.getSession();
String task=request.getParameter("task");
if("queryFish".equals(task)) {
try {
SAXReader reader=new SAXReader();
//得到document对象,此处解析的本地xml文件
Document document = reader.read(new File("C:\\BaiduNetdiskDownload\\Server\\Gserver\\71107042_捕鱼2\\lkpy_config_71107042.xml"));
//获取根节点
Element root = document.getRootElement();
//获取element名称为Fish的子节点集合(参看上面的xml文件)
List<Element> fish = root.elements("Fish");
//实例化存储FishBean的list
for (Element element : fish) {
//由于<Fish></Fish>这个节点中没有text内容,只有各种属性,此处只获取其attributes
//获取属性集合,即kind,name,speed,multiple,BoundingBox,hitRadius,captureProbability
List<Attribute> attributes = element.attributes();
//遍历属性集合
for(int i=0;i<attributes.size();i++) {
//根据属性名,来获取该属性的值
kind=attributes.get(i).getStringValue();
}else if(attributes.get(i).getName().equals("name")) {
name= attributes.get(i).getStringValue();
}else if(attributes.get(i).getName().equals("speed")) {
speed=attributes.get(i).getStringValue();
}else if(attributes.get(i).getName().equals("multiple")) {
multiple=attributes.get(i).getStringValue();
}else if(attributes.get(i).getName().equals("hitRadius")) {
hitRadius=attributes.get(i).getStringValue();
}else if(attributes.get(i).getName().equals("captureProbability")) {
captureProbability=attributes.get(i).getStringValue();
}
}
//将遍历出来的属性值保存在javaBean中
FishBean fb=new FishBean(kind, name, speed, multiple, hitRadius, captureProbability);
//再将javaBean保存在list集合中
}
//将list集合保存在作用域中
session.setAttribute("FISH_LIST", list);
//跳转页面
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else if("querySingle".equals(task)) {//查询单条记录,根据鱼的kind,即鱼编号来查询
//获取页面中输入的kind
String kind=request.getParameter("fish_kind");
//从作用域中取出之前保存的list集合
List<FishBean> list=(List<FishBean>) session.getAttribute("FISH_LIST");
// 实例化javaBean
FishBean fb=new FishBean();
//从集合中取数据与页面传递的kind匹配,并获取其他属性
if(list.get(i).getKind().equals(kind)) {
name=list.get(i).getName();
speed=list.get(i).getSpeed();
multiple=list.get(i).getMultiple();
hitRadius=list.get(i).getHitRadius();
captureProbability=list.get(i).getCaptureProbability();
}
}
//将取出的数据保存在javaBean
fb.setName(name);
fb.setSpeed(speed);
fb.setMultiple(multiple);
fb.setHitRadius(hitRadius);
fb.setCaptureProbability(captureProbability);
//javaBean传递到作用域
session.setAttribute("FISH_SINGLE", fb);
//跳转页面
}else if("updateFish".equals(task)) {//在页面上修改数据,同步到xml文件,此处涉及xml的读取和写入,具体读写即解析过程开头所贴链接有详解
//设置编码,处理post提交乱码问题
request.setCharacterEncoding("utf-8");
//响应包含中文出现乱码问题
//设置文本字符编码
response.setCharacterEncoding("utf-8");
//设置网页的字符编码
response.setContentType("text/html;charset=utf-8");
//获取页面传递的参数
name=request.getParameter("fname");
speed=request.getParameter("speed");
multiple=request.getParameter("multiple");
hitRadius=request.getParameter("hitRadius");
captureProbability=request.getParameter("captureProbability");
try {
SAXReader reader=new SAXReader();//D:\workSpace\XmlTest1\src
Document document=reader.read(new File("C:\\BaiduNetdiskDownload\\Server\\Gserver\\71107042_捕鱼2\\lkpy_config_71107042.xml"));
//获取根节点
Element root = document.getRootElement();
//获取节点名为Fish的子节点集合
List<Element> list = root.elements("Fish");
//遍历Fish子节点
for(int i=0;i<list.size();i++) {
//获取某个Fish节点中的属性集合attributes
List<Attribute> attributes = list.get(i).attributes();
//遍历属性集合
if(list.get(i).attributeValue("kind").equals(kind)) {//确定需要修改的是哪一个Fish节点
/** 比如获取的kind=3,即<Fish kind="3" name="大眼鱼" speed="8" multiple="9" BoundingBox="70,43" hitRadius="12" captureProbability="0.33"/>这个节点 ;然后开始遍历这个节点下面的属性集合 */
for(int j=0;j<attributes.size();j++) {
if(attributes.get(j).getName().equals("speed")) {
//将页面获取的speed值设置进属性Name为speed的属性中
}else if(attributes.get(j).getName().equals("multiple")) {
attributes.get(j).setValue(multiple);
}else if(attributes.get(j).getName().equals("hitRadius")) {
attributes.get(j).setValue(hitRadius);
}else if(attributes.get(j).getName().equals("captureProbability")) {
attributes.get(j).setValue(captureProbability);
}
}
};
}
//相应节点的各个属性设置完成后,将document对象重新写入到本地xml文件,如同我们修改完数据,将数据保存在数据库中
writer.write(document);
writer.close();
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//重定向到查询所有的servlet
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
完!