Java--xml-dom4j
Posted 人塞不能怨
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java--xml-dom4j相关的知识,希望对你有一定的参考价值。
Java-xml之dom4j
使用java-dom4j操作xml格式文件
1. 建立Maven工程并添加依赖
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.6</version>
</dependency>
2. 初始化配置
public class Dom4jDemo{
//文件路径
final String PATH;
//xml 文件内容字符编码
final String CODE = “UTF-8”;
//xml dom输出流缓存大小
final int BUFFER_SIZE = 8*1024*1024;
//日期格式化 年-月-日
SimpleDateFormat sdfDate;
//时间格式化 时:分:秒
SimpleDateFormate sdfTime;
//时间格式话 年-月-日 时:分:秒
SimpleDateFormate sdf;
//xml 文档对象
Document document;
//xml 文档根节点元素
Element root;
//xml dom输出流输出格式
OutputFormat pretty;
public Dom4jDemo(String path){
this.PATH = path;
sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
sdfDate = new SimpleDateFormat("yyyy-MM-dd");
sdfTime = new SimpleDateFormat("HH:mm:ss");
SAXReader sax = new SAXReader();
document = sax.read(new File(PATH));
root = document.getRootElement();
pretty = OutputFormat.createPrettyPrint();
pretty.setEncoding(CODE)
}
//写盘操作
public void write() throws IOException{
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(PATH),CODE),BUFFER_SIZE);
XMLWriter xml = new XMLWriter(bw,pretty);
xml.writer(document);
xml.close();
}
}
3. xml文件增删改查
3.1 添加节点和属性
public void add(){
Element e = root.addElement("record");
Date date = new Date();
e.addAttribute("date",sdfDate.format(new Date()));
e.addAttribute("time",sdfTime.format(new Date()));
e.addAttribute("article","ArrayList.txt");
e.addElement("wordCount").setText("460");
e.addElement("letterCount").setText("1111");
e.addElement("specialSignCount").setText("88");
e.addElement("speed").setText("205");
e.addElement("timeConsumption").setText("66");
e.addElement("accuracy").setText("0.98");
}
添加后的xml如下
<?xml version="1.0" encoding="UTF-8"?>
<records>
<record date="2021-04-29" time="18:19:13" article="ArrayList.txt">
<wordCount>460</wordCount>
<letterCount>1111</letterCount>
<specialSignCount>88</specialSignCount>
<speed>205</speed>
<timeConsumption>66</timeConsumption>
<accuracy>0.98</accuracy>
</record>
</records>
3.2 修改节点和属性
public void modify() throw IOException{
String date = "2021-04-28";
Node single = findSingle(date);
if(null == single){
System.out.println(date + "not exist");
return;
}
//为方便操作,将节点强转为元素
Element e = (Element)single;
//根据属性名获取e属性对象,并修改属性值
e.attribute("time").setValue("00:00:00");
e.attribute("article").setValue("Xxx.xx");
//根据子元素名称获取e子元素对象,并修改子元素文本内容
e.element("wordCount").setText("111");
e.element("letterCount").setText("222");
e.element("specialSignCount").setText("333");
e.element("speed").setText("444");
e.element("accuracy").setText("555");
e.element("timeConsumption").setText("6666");
write();
System.out.println(succeed);
}
3.3 移除节点
public void remove() throws IOException{
String date = "2021-04-28";
Node single = findSingle(date);
if(null == single) System.out.println(date + "not exist")
root.remove(single);
write();
System.out.println("succeed");
}
3.4 查找
//根据属性查找节点
public void findSingle(String date){
//xml-path绝对路径
//return document.selectSingleNode("/records/record[@date='" + date + "']");
return document.selectSingleNode("//record[@date='" + date + "']");
}
//查找所有
public void findAll() throws ParseException{
List<Element> elements = root.elements();
if(elements.size()==0){
System.out.println("element size zero");
return;
}
for(Record record : toRecords(elements)){
System.out.println(record);
}
}
//部分内容查找
public void findSome() throws ParseException{
String article = "HashMap.txt";
List<Element> elements =
//单条件查找
//document.selectNodes("//record[@article='"' + article + "']");
//document.selectNodes("//record[wordCount[text()='" + 460 + "']]");
//document.selectNodes("//record[wordCount[text()<'" + 460 + "']]");
//document.selectNode("//record[contains(@article,'.txt')]");
document.selectNode("//record[contains(@article,concat("","Set",""))]");
//双条件
//document.selectNodes("//record[wordCount[text()<'" + 460 + "']][speed[text(0<'" + 200 + "']]");
if(elements.size()==0){
System.err.println("element size zero");
return;
}
List<Record> records = toRecords(elements);
for(Record record : records){
System.out.println(record);
}
}
4. 节点和java对象映射
新建实体类Record
class Record{
private Date date;
private String article;
private int wordCount;
private int letterCount;
private int specialSignNumber;
private int speed;
private long timeConsumption;
private float accuracy;
public Record(String date, String article, String wordCount, String letterCount, String specialSignNumber, String speed, String timeConsumption, String accuracy) throws ParseException {
this.date = sdf.parse(date);
this.article = article;
this.wordCount = Integer.parseInt(wordCount);
this.letterCount = Integer.parseInt(letterCount);
this.specialSignNumber = Integer.parseInt(specialSignNumber);
this.speed = Integer.parseInt(speed);
this.timeConsumption = Long.parseLong(timeConsumption);
this.accuracy = Float.parseFloat(accuracy);
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public String getArticle() {
return article;
}
public void setArticle(String article) {
this.article = article;
}
public int getWordCount() {
return wordCount;
}
public void setWordCount(int wordCount) {
this.wordCount = wordCount;
}
public int getLetterCount() {
return letterCount;
}
public void setLetterCount(int letterCount) {
this.letterCount = letterCount;
}
public int getSpecialSignNumber() {
return specialSignNumber;
}
public void setSpecialSignNumber(int specialSignNumber) {
this.specialSignNumber = specialSignNumber;
}
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}
public long getTimeConsumption() {
return timeConsumption;
}
public void setTimeConsumption(long timeConsumption) {
this.timeConsumption = timeConsumption;
}
public float getAccuracy() {
return accuracy;
}
public void setAccuracy(float accuracy) {
this.accuracy = accuracy;
}
@Override
public String toString() {
return "Record{" +
"date=" + sdf.format(date) +
", article='" + article + '\\'' +
", wordCount=" + wordCount +
", letterCount=" + letterCount +
", specialSignNumber=" + specialSignNumber +
", speed=" + speed +
", timeConsumption=" + timeConsumption +
", accuracy=" + accuracy +
'}';
}
}
映射方法
//把文件内所有记录映射为Record类型列表
private List<Record> toRecords(List<Element> list) throws ParseException{
List<Record> items = new ArrayList<>();
for(Element e : list){
items.add(toRecord(e));
}
return items;
}
//Element => Record 映射
private Record toRecord(Element e) throws ParseException{
//提取属性
String date = e.attributeValue("date");
String time = e.attributeValue("time");
String article = e.attributeValue("article");
//提取子元素内容
String wordCount = e.elementText("wordCount");
String letterCount = e.elementText("letterCount");
String specialSignCount = e.elementText("specialSignCount");
String speed = e.elementText("speed");
String timeConsumption = e.elementText("timeConsumption");
String accuracy = e.elementText("accuracy");
//创建记录对象
return new Record(date+ " " + time,article,wordCount,letterCount,specialSignCount,speed,timeConsumption,accuracy);
}
//Record => Element 映射
private Element toElement(Record r){
Element e = root.addElement("record");
//添加属性并赋值
e.addAttribute("date",sdfDate.format(r.getDate()));
e.addAttribute("time",sdfTime.format(r.getDate()));
e.addAttribute("article", r.getArticle());
//添加子元素
e.addElement("wordCount").setText(r.getWordCount()+"");
e.addElement("letterCount").setText(r.getLetterCount()+"");
e.addElement("specialSignCount").setText(r.getSpecialSignNumber()+"");
e.addElement("speed").setText(r.getSpeed()+"");
e.addElement("timeConsumption").setText(r.getTimeConsumption()+"");
e.addElement("accuracy").setText(r.getAccuracy()+"");
return e;
}
以上是关于Java--xml-dom4j的主要内容,如果未能解决你的问题,请参考以下文章