提交表单之后出现java.lang.IllegalArgumentException
# 具体遇到的问题
提交表单之后显示这个异常,java.lang.IllegalArgumentException: Adding text to an XML document must not be null,并且列表中原来每幅画的信息重复显示了一次
# 报错信息的截图


# 相关课程内容截图
# 尝试过的解决思路和结果
# 粘贴全部相关代码,切记添加代码注释(请勿截图)
package mgallary.utils;
import mgallary.entity.Painting;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import sun.plugin.dom.css.CSSCharsetRule;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.List;
/**
*数据源类,用于将XML文件解析为Java对象
*/
public class XmlDataSource{
//通过static静态关键字保证数据全局唯一
private static List<Painting> data = new ArrayList();
private static String dataFile;
static {
//得到pianting,xml文件完整物理路径
//如果路径中含有空格,会自动将空格转换为20%,但javaIO不会将地址中的20%识别为空格
dataFile=XmlDataSource.class.getResource("/painting.xml").getPath();
// System.out.println(dataFile);
reload();
}
private static void reload(){
URLDecoder decoder=new URLDecoder();
try {
dataFile=decoder.decode(dataFile,"UTF-8");
System.out.println(dataFile);
//利用Dom4j对XML进行解析
SAXReader reader=new SAXReader();
//1.获取Document文档对象
Document document=reader.read(dataFile);
//2.利用Xpath得到XML节点集合
List<Node> nodes=document.selectNodes("/root/painting");
for (Node node:nodes){
Element element=(Element)node;
String id=element.attributeValue("id");
String pname=element.elementText("pname");
Painting painting=new Painting();
painting.setId(Integer.parseInt(id));
painting.setPname(pname);
painting.setCategory(Integer.parseInt(element.elementText("category")));
painting.setPrice(Integer.parseInt(element.elementText("price")));
painting.setPreview(element.elementText("preview"));
painting.setDescription(element.elementText("description"));
data.add(painting);
// System.out.println(id+":"+pname);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取所有油画Painting对象
* @return Painting List
*/
public static List<Painting> getRawData(){
return data;
}
public static void append(Painting painting){
//1.读取XML文档,得到Document对象
SAXReader reader=new SAXReader();
Writer writer=null;
try {
Document document=reader.read(dataFile);
//2.创建新的painting节点
Element root=document.getRootElement();
Element p=root.addElement("painting");
//3.创建painting节点的各个子节点
p.addAttribute("id", String.valueOf(data.size()+1));
p.addElement("pname").setText(painting.getPname());
p.addElement("category").setText(painting.getCategory().toString());
p.addElement("price").setText(painting.getPrice().toString());
p.addElement("preview").setText(painting.getPreview());
p.addElement("description").setText(painting.getDescription());
//4.写入XML,写完追加操作
writer =new OutputStreamWriter(new FileOutputStream(dataFile),"UTF-8");
document.write(writer);
System.out.println(dataFile);
} catch (Exception e) {
e.printStackTrace();
}finally {
if (writer !=null){
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
reload();//内存与文件数据一致
}
}
public static void main(String[] args) {
/*List<Painting> ps=XmlDataSource.getRawData();
for(Painting p:ps){
System.out.println(p.getPname());
System.out.println(p.getDescribe());*/
Painting p=new Painting();
p.setPname("测试油画");
p.setCategory(1);
p.setPrice(2000);
p.setPreview("F:\\JAVA\\Idea workspace\\javaweb\\mgallary\\out\\artifacts\\mgallary_war_exploded\\upload\\770bc7bb-e093-4774-8b8b-26bd31bafc4a.jpg");
p.setDescription("ceshiyou");
append(p);
}
}================================
package mgallary.dao;
import mgallary.entity.Painting;
import mgallary.utils.PageModel;
import mgallary.utils.XmlDataSource;
import java.util.ArrayList;
import java.util.List;
public class PaintingDao {
/**
* 分页查询油画数据
* @param page 页号
* @param rows 每页记录数
* @return PageModel分页对象
*/
public PageModel pagination(int page,int rows){
//Painting油画对象集合
List<Painting> list=XmlDataSource.getRawData();
//PageModel分页处理得到分页数据及分页附加
PageModel pageModel =new PageModel(list,page,rows);
return pageModel;
}
public PageModel pagination(int category,int page,int rows){
List<Painting> list=XmlDataSource.getRawData();
List<Painting> categoryList=new ArrayList<>();
for (Painting p:list){
if (p.getCategory()==category){
categoryList.add(p);
}
}
PageModel pageModel =new PageModel(categoryList,page,rows);
return pageModel;
}
/**
* 数据新增
* @param painting 油画信息
*/
public void create(Painting painting){
XmlDataSource.append(painting);
}
public static void main(String[] args) {
XmlDataSource xmlDataSource=new XmlDataSource();
List<Painting> rawData = xmlDataSource.getRawData();
System.out.println(rawData.size());
}
}
18
收起
正在回答
1回答
同学你好,测试同学贴出的代码是可以正常添加的,根据报错信息显示,向XML文档添加文本不能为空,同学根据报错提示的位置,查看下报错是哪句代码,结合代码以及报错信息定位错误
如果还有问题建议同学将全部代码反馈到问答区,并说明报错代码
祝学习愉快
java工程师2020版
- 参与学习 人
- 提交作业 9410 份
- 解答问题 16556 个
综合就业常年第一,编程排行常年霸榜,无需脱产即可学习,北上广深月薪过万 无论你是未就业的学生还是想转行的在职人员,不需要基础,只要你有梦想,想高薪
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星