浅析dom4j解析xml文件及其乱码问题以及与后台数据进行交互

本文介绍使用dom4j解析XML文件的方法,并演示了如何读取XML中的特定节点信息及更新XML内容。通过实例展示了如何将XML数据映射到JavaBean,并提供了与后台数据交互的具体代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 kind="";
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

List<FishBean> list=new ArrayList<>();

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++) {

        //根据属性名,来获取该属性的值

if(attributes.get(i).getName().equals("kind")) {
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.add(fb);
}
//将list集合保存在作用域中

session.setAttribute("FISH_LIST", list);

        //跳转页面

request.getRequestDispatcher("back/fish.jsp").forward(request, response);

} 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匹配,并获取其他属性

for(int i=0;i<list.size();i++) {
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.setKind(kind);
fb.setName(name);
fb.setSpeed(speed);
fb.setMultiple(multiple);
fb.setHitRadius(hitRadius);

fb.setCaptureProbability(captureProbability);

        //javaBean传递到作用域

session.setAttribute("FISH_SINGLE", fb);

        //跳转页面

request.getRequestDispatcher("back/fishSingle.jsp").forward(request, response);
}else if("updateFish".equals(task)) {//在页面上修改数据,同步到xml文件,此处涉及xml的读取和写入,具体读写即解析过程开头所贴链接有详解
//设置编码,处理post提交乱码问题
request.setCharacterEncoding("utf-8");
//响应包含中文出现乱码问题
//设置文本字符编码
response.setCharacterEncoding("utf-8");
//设置网页的字符编码

response.setContentType("text/html;charset=utf-8");

        //获取页面传递的参数

kind=request.getParameter("kind");
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"/>这个节点 ;然后开始遍历这个节点下面的属性集合  */

//System.out.println("success");
for(int j=0;j<attributes.size();j++) {

if(attributes.get(j).getName().equals("speed")) {

        //将页面获取的speed值设置进属性Name为speed的属性中

attributes.get(j).setValue(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文件,如同我们修改完数据,将数据保存在数据库中

XMLWriter writer=new XMLWriter(new FileOutputStream("C:\\BaiduNetdiskDownload\\Server\\Gserver\\71107042_捕鱼2\\lkpy_config_71107042.xml"), OutputFormat.createPrettyPrint());
writer.write(document);
writer.close();
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();

}

        //重定向到查询所有的servlet

response.sendRedirect(request.getContextPath()+"/FishGoldToadServlet?task=queryFish");;
}
}


protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

doGet(request, response);
}


}

完!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值