Javaweb之Dom4j解析xml

所需Jar包:


第二个Jar包支持xPath查询

1.Dom4jUtils工具类

package zh.xml.demo;

import java.io.FileOutputStream;
import java.io.OutputStream;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

/**
 * Dom4jUtils
 * 
 * @author zh
 *
 */
public class Dom4jUtils {

	private Dom4jUtils() {

	}

	// 获取document
	public static Document getDocument(String xmlPath) {

		SAXReader reader = new SAXReader();
		Document document = null;
		try {
			document = reader.read(xmlPath);
		} catch (DocumentException e) {
			throw new RuntimeException("获取document失败", e);
		}
		return document;
	}

	// 回写,对xml的增删改操作均需要回写
	public static void writerDocument(Document document, String xmlPath) {

		try {
			OutputStream out = new FileOutputStream(xmlPath);
			//OutputFormat format = OutputFormat.createCompactFormat();//压缩格式
			OutputFormat format = OutputFormat.createPrettyPrint();
			XMLWriter xmlWriter = new XMLWriter(out, format);
			xmlWriter.write(document);
			xmlWriter.flush();
			xmlWriter.close();
		} catch (Exception e) {
			throw new RuntimeException("回写失败", e);
		}

	}

}

2.xml生成

package zh.xml.demo;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

/**
 * 生成xml
 * 
 * @author ZH
 *
 */
public class XmlMake {

	public static void main(String[] args) {
		// 创建document
		Document document = DocumentHelper.createDocument();
		// 添加根节点
		Element root = document.addElement("novels");
		for (int i = 1; i <= 3; i++) {
			// 添加子节点
			Element novel = root.addElement("novel");
			// 子节点添加属性
			novel.addAttribute("id", "" + i);
			novel.addAttribute("name", "" + i);
			novel.addAttribute("auther", "" + i);
			// 子节点添加子节点
			Element maleLead = novel.addElement("MaleLead");
			maleLead.addAttribute("name", "" + i);
			maleLead.addAttribute("age", "" + i);
			maleLead.addText("技能" + i);// 添加文本
			// 子节点添加子节点
			Element femaleLead = novel.addElement("FemaleLead");
			femaleLead.addAttribute("name", "" + i);
			femaleLead.addAttribute("age", "" + i);
			femaleLead.addText("技能" + i);// 添加文本
			// 子节点添加子节点
			Element boss = novel.addElement("Boss");
			boss.addAttribute("name", "" + i);
			boss.addAttribute("age", "" + i);
			boss.addText("技能"+i);// 添加文本
		}

		// 回写
		Dom4jUtils.writerDocument(document, "src\\novels1.xml");
		System.out.println("end...");

	}

}

结果:novels1.xml

<?xml version="1.0" encoding="UTF-8"?>

<novels>
  <novel id="1" name="1" auther="1">
    <MaleLead name="1" age="1">技能1</MaleLead>
    <FemaleLead name="1" age="1">技能1</FemaleLead>
    <Boss name="1" age="1">技能1</Boss>
  </novel>
  <novel id="2" name="2" auther="2">
    <MaleLead name="2" age="2">技能2</MaleLead>
    <FemaleLead name="2" age="2">技能2</FemaleLead>
    <Boss name="2" age="2">技能2</Boss>
  </novel>
  <novel id="3" name="3" auther="3">
    <MaleLead name="3" age="3">技能3</MaleLead>
    <FemaleLead name="3" age="3">技能3</FemaleLead>
    <Boss name="3" age="3">技能3</Boss>
  </novel>
</novels>

3.xml与string转换

package zh.xml.demo;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.junit.Test;
/**
 * xml <--> string
 * @author ZH
 *
 */
public class XmlString {

	@Test
	public void xmlToString() {
		// xml-->string
		Document document = Dom4jUtils.getDocument("src\\novels1.xml");
		String xmlString = document.asXML();
		System.out.println(xmlString);
		
	}
	
	@Test
	public void stringToXml(){
		// string-->xml
		String text = "<novels>"
						+ "<novel id='1' name='1' auther='1'>"
							+ "<MaleLead name='1' age='1'>技能1</MaleLead>"
						+ "</novel>"
						+ "<novel id='2' name='2' auther='2'>"
							+ "<MaleLead name='2' age='2'>技能2</MaleLead>"
						+ "</novel>"
						+ "<novel id='3' name='3' auther='3'>"
							+ "<MaleLead name='3' age='3'>技能3</MaleLead>"
						+ "</novel>"
					+ "</novels>";
		try {
			// 先解析为document
			Document document = DocumentHelper.parseText(text);
			// 再回写document
			Dom4jUtils.writerDocument(document, "src\\novels2.xml");
		} catch (Exception e) {
			throw new RuntimeException("转换失败", e);
		}
	}
	
}

xmlToString结果:

<?xml version="1.0" encoding="UTF-8"?>
<novels>
  <novel id="1" name="1" auther="1">
    <MaleLead name="1" age="1">技能1</MaleLead>
    <FemaleLead name="1" age="1">技能1</FemaleLead>
    <Boss name="1" age="1">技能1</Boss>
  </novel>
  <novel id="2" name="2" auther="2">
    <MaleLead name="2" age="2">技能2</MaleLead>
    <FemaleLead name="2" age="2">技能2</FemaleLead>
    <Boss name="2" age="2">技能2</Boss>
  </novel>
  <novel id="3" name="3" auther="3">
    <MaleLead name="3" age="3">技能3</MaleLead>
    <FemaleLead name="3" age="3">技能3</FemaleLead>
    <Boss name="3" age="3">技能3</Boss>
  </novel>
</novels>

stringTOXml结果:

<?xml version="1.0" encoding="UTF-8"?>

<novels>
  <novel id="1" name="1" auther="1">
    <MaleLead name="1" age="1">技能1</MaleLead>
  </novel>
  <novel id="2" name="2" auther="2">
    <MaleLead name="2" age="2">技能2</MaleLead>
  </novel>
  <novel id="3" name="3" auther="3">
    <MaleLead name="3" age="3">技能3</MaleLead>
  </novel>
</novels>

4.xml遍历

novels3.xml

<?xml version="1.0" encoding="UTF-8"?>
<novels>

	<novel id="1" name="射雕英雄传" auther="金庸">
		<MaleLead name="郭靖" age="26">技能:降龙十八掌</MaleLead>
		<FemaleLead name="黄蓉" age="26">技能:打狗棍法</FemaleLead>
		<Boss name="欧阳锋" age="55">技能:蛤蟆功</Boss>
	</novel>

	<novel id="2" name="神雕侠侣" auther="金庸">
		<MaleLead name="杨过" age="22">技能:黯然销魂掌</MaleLead>
		<FemaleLead name="小龙女" age="21">技能:玉女心经</FemaleLead>
		<Boss name="金轮法王" age="55">技能:龙象波若功</Boss>
	</novel>

	<novel id="3" name="倚天屠龙记" auther="金庸">
		<MaleLead name="张无忌" age="24">技能:九阳神功</MaleLead>
		<FemaleLead name="赵敏" age="23">技能:未知</FemaleLead>
		<Boss name="周芷若" age="22">技能:九阴真经</Boss>
	</novel>

</novels>
package zh.xml.demo;

import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;

/**
 * xml遍历
 * 
 * @author ZH
 *
 */
public class XmlTraverse {

	public static void main(String[] args) {

		Document document = Dom4jUtils.getDocument("src\\novels3.xml");
		Element root = document.getRootElement();
		traverse(root);

	}

	private static void traverse(Element node) {
		// 输出节点名称
		System.out.println(node.getName());
		// 输出节点属性
		List<Attribute> attributes = node.attributes();
		for (Attribute attribute : attributes) {
			System.out.println(attribute.getName() + "=" + attribute.getValue());
		}
		// 输出节点内容
		String text = node.getText();
		if (!text.trim().isEmpty()) {
			System.out.println(node.getText());
		}
		// 递归遍历节点的子节点
		List<Element> elements = node.elements();
		for (Element element : elements) {
			traverse(element);
		}
	}

}

结果:

novels
novel
id=1
name=射雕英雄传
auther=金庸
MaleLead
name=郭靖
age=26
技能:降龙十八掌
FemaleLead
name=黄蓉
age=26
技能:打狗棍法
Boss
name=欧阳锋
age=55
技能:蛤蟆功
novel
id=2
name=神雕侠侣
auther=金庸
MaleLead
name=杨过
age=22
技能:黯然销魂掌
FemaleLead
name=小龙女
age=21
技能:玉女心经
Boss
name=金轮法王
age=55
技能:龙象波若功
novel
id=3
name=倚天屠龙记
auther=金庸
MaleLead
name=张无忌
age=24
技能:九阳神功
FemaleLead
name=赵敏
age=23
技能:未知
Boss
name=周芷若
age=22
技能:九阴真经

5.xml增加操作

package zh.xml.demo;

import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.junit.Test;

/**
 * xml-增加操作
 * 
 * @author ZH
 *
 */
public class XmlAdd {

	/*
	 * 在"根节点末尾"增加以下内容:
	 * <novel id="4" name="鹿鼎记" auther="金庸">
		<MaleLead name="韦小宝" age="27">技能:神行百变</MaleLead>
		<FemaleLead name="阿珂" age="26">技能:未知</FemaleLead>
		<Boss name="冯锡范" age="55">技能:一剑无血</Boss>
	   </novel>
	 */
	@Test
	public void add1() {
		
		Document document = Dom4jUtils.getDocument("src\\novels3.xml");
		Element root = document.getRootElement();// 获取根节点
		// 根节点末尾添加新节点novel
		Element novel = root.addElement("novel");
		// novel添加属性
		novel.addAttribute("id", "4").addAttribute("name", "鹿鼎记").addAttribute("auther", "金庸");
		// novel添加maleLead节点,maleLead添加属性和内容
		Element maleLead = novel.addElement("MaleLead");
		maleLead.addAttribute("name", "韦小宝").addAttribute("age", "27").addText("技能:神行百变");
		// novel添加femaleLead节点,femaleLead添加属性和内容
		Element femaleLead = novel.addElement("FemalLead");
		femaleLead.addAttribute("name", "阿珂").addAttribute("age", "26").addText("技能:未知");
		// novel添加boss节点,boss添加属性和内容
		Element boss = novel.addElement("Boss");
		boss.addAttribute("name", "冯锡范").addAttribute("age", "55").addText("技能:一剑无血");
		// 回写
		Dom4jUtils.writerDocument(document, "src\\novels31.xml");
		System.out.println("end...");
		
	}
	
	/*
	 * 在"第一个<novel>节点"后面增加以下内容:
	 * <novel id="11" name="小李飞刀" auther="古龙">
		<MaleLead name="李寻欢" age="29">技能:小李飞刀</MaleLead>
		<FemaleLead name="林诗音" age="28">技能:未知</FemaleLead>
		<Boss name="忘记了" age="55">技能:忘记了</Boss>
	   </novel>
	 */
	@Test
	public void add2(){
		
		Document document = Dom4jUtils.getDocument("src\\novels3.xml");
		Element root = document.getRootElement();
		// 获取根节点下面的所有子节点novel
		List<Element> novels = root.elements();
		//创建新节点novel,添加属性
		Element novel = DocumentHelper.createElement("novel");
		novel.addAttribute("id", "11").addAttribute("name", "小李飞刀").addAttribute("auther", "古龙");
		// novel添加maleLead节点,maleLead添加属性和内容
		Element maleLead = novel.addElement("MaleLead");
		maleLead.addAttribute("name", "李寻欢").addAttribute("age", "29").addText("技能:小李飞刀");
		// novel添加femaleLead节点,femaleLead添加属性和内容
		Element femaleLead = novel.addElement("FemalLead");
		femaleLead.addAttribute("name", "林诗音").addAttribute("age", "28").addText("技能:未知");
		// novel添加boss节点,boss添加属性和内容
		Element boss = novel.addElement("Boss");
		boss.addAttribute("name", "忘记了").addAttribute("age", "55").addText("技能:忘记了");
		// 在指定索引处添加元素:list.add(index, element)
		novels.add(1, novel);
		// 回写
		Dom4jUtils.writerDocument(document, "src\\novels32.xml");
		System.out.println("end...");
		
	}
	
	/*
	 * 在以下内容中添加<Bird name="神雕" age="66">技能:横扫千军</Bird>
	 * <novel id="2" name="神雕侠侣" auther="金庸">
		<MaleLead name="杨过" age="22">技能:黯然销魂掌</MaleLead>
		<FemaleLead name="小龙女" age="21">技能:玉女心经</FemaleLead>
		<Boss name="金轮法王" age="44"></Boss>
	   </novel>
	 */
	@Test
	public void add3(){
		
		Document document = Dom4jUtils.getDocument("src\\novels3.xml");
		Element root = document.getRootElement();
		List<Element> novels = root.elements();
		// 找到指定节点
		Element novel2 = novels.get(1);
		// 创建新节点并添加属性和内容
		novel2.addElement("Bird").addAttribute("name", "神雕").addAttribute("age", "66").addText("技能:横扫千军");
		// 回写
		Dom4jUtils.writerDocument(document, "src\\novels33.xml");
		System.out.println("end...");
		
	}
	
}

add1()结果:novels31.xml

<?xml version="1.0" encoding="UTF-8"?>

<novels> 
  <novel id="1" name="射雕英雄传" auther="金庸"> 
    <MaleLead name="郭靖" age="26">技能:降龙十八掌</MaleLead>  
    <FemaleLead name="黄蓉" age="26">技能:打狗棍法</FemaleLead>  
    <Boss name="欧阳锋" age="55">技能:蛤蟆功</Boss> 
  </novel>  
  <novel id="2" name="神雕侠侣" auther="金庸"> 
    <MaleLead name="杨过" age="22">技能:黯然销魂掌</MaleLead>  
    <FemaleLead name="小龙女" age="21">技能:玉女心经</FemaleLead>  
    <Boss name="金轮法王" age="55">技能:龙象波若功</Boss> 
  </novel>  
  <novel id="3" name="倚天屠龙记" auther="金庸"> 
    <MaleLead name="张无忌" age="24">技能:九阳神功</MaleLead>  
    <FemaleLead name="赵敏" age="23">技能:未知</FemaleLead>  
    <Boss name="周芷若" age="22">技能:九阴真经</Boss> 
  </novel>  
  <novel id="4" name="鹿鼎记" auther="金庸">
    <MaleLead name="韦小宝" age="27">技能:神行百变</MaleLead>
    <FemalLead name="阿珂" age="26">技能:未知</FemalLead>
    <Boss name="冯锡范" age="55">技能:一剑无血</Boss>
  </novel>
</novels>

add2()结果:novels32.xml

<?xml version="1.0" encoding="UTF-8"?>

<novels> 
  <novel id="1" name="射雕英雄传" auther="金庸"> 
    <MaleLead name="郭靖" age="26">技能:降龙十八掌</MaleLead>  
    <FemaleLead name="黄蓉" age="26">技能:打狗棍法</FemaleLead>  
    <Boss name="欧阳锋" age="55">技能:蛤蟆功</Boss> 
  </novel>  
  <novel id="11" name="小李飞刀" auther="古龙">
    <MaleLead name="李寻欢" age="29">技能:小李飞刀</MaleLead>
    <FemalLead name="林诗音" age="28">技能:未知</FemalLead>
    <Boss name="忘记了" age="55">技能:忘记了</Boss>
  </novel>
  <novel id="2" name="神雕侠侣" auther="金庸"> 
    <MaleLead name="杨过" age="22">技能:黯然销魂掌</MaleLead>  
    <FemaleLead name="小龙女" age="21">技能:玉女心经</FemaleLead>  
    <Boss name="金轮法王" age="55">技能:龙象波若功</Boss> 
  </novel>  
  <novel id="3" name="倚天屠龙记" auther="金庸"> 
    <MaleLead name="张无忌" age="24">技能:九阳神功</MaleLead>  
    <FemaleLead name="赵敏" age="23">技能:未知</FemaleLead>  
    <Boss name="周芷若" age="22">技能:九阴真经</Boss> 
  </novel> 
</novels>

add3()结果:novels33.xml

扫描二维码关注公众号,回复: 1058002 查看本文章
<?xml version="1.0" encoding="UTF-8"?>

<novels> 
  <novel id="1" name="射雕英雄传" auther="金庸"> 
    <MaleLead name="郭靖" age="26">技能:降龙十八掌</MaleLead>  
    <FemaleLead name="黄蓉" age="26">技能:打狗棍法</FemaleLead>  
    <Boss name="欧阳锋" age="55">技能:蛤蟆功</Boss> 
  </novel>  
  <novel id="2" name="神雕侠侣" auther="金庸"> 
    <MaleLead name="杨过" age="22">技能:黯然销魂掌</MaleLead>  
    <FemaleLead name="小龙女" age="21">技能:玉女心经</FemaleLead>  
    <Boss name="金轮法王" age="55">技能:龙象波若功</Boss>  
    <Bird name="神雕" age="66">技能:横扫千军</Bird>
  </novel>  
  <novel id="3" name="倚天屠龙记" auther="金庸"> 
    <MaleLead name="张无忌" age="24">技能:九阳神功</MaleLead>  
    <FemaleLead name="赵敏" age="23">技能:未知</FemaleLead>  
    <Boss name="周芷若" age="22">技能:九阴真经</Boss> 
  </novel> 
</novels>

6.xml删除操作

package zh.xml.demo;

import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.junit.Test;

/**
 * xml-删除操作
 * 
 * @author ZH
 *
 */
public class XmlDelete {

	/*
	 * 删除第1个节点里面的所有子节点
	 <novel id="1" name="射雕英雄传" auther="金庸">
		<MaleLead name="郭靖" age="26">技能:降龙十八掌</MaleLead>
		<FemaleLead name="黄蓉" age="26">技能:打狗棍法</FemaleLead>
		<Boss name="欧阳锋" age="55">技能:蛤蟆功</Boss>
	 </novel>
	 */
	@Test
	public void delete1(){
		
		Document document = Dom4jUtils.getDocument("src\\novels3.xml");
		Element root = document.getRootElement();
		// 获得根节点下所有子节点
		List<Element> novels = root.elements();
		// 找到指定节点
		Element novel1 = novels.get(0);
		// 获得指定节点下所有子节点
		List<Element> elements = novel1.elements();
		for(Element element : elements ){
			// 通过父节点删除子节点
			boolean remove = novel1.remove(element);
			System.out.println(remove);
		}
		// 回写
		Dom4jUtils.writerDocument(document, "src\\novels34.xml");
		
	}
	
	
	/*
	 * 删除第3个节点里面的<MaleLead>和<FemaleLead>
	 <novel id="3" name="倚天屠龙记" auther="金庸">
		<MaleLead name="张无忌" age="24">技能:九阳神功</MaleLead>
		<FemaleLead name="赵敏" age="23">技能:未知</FemaleLead>
		<Boss name="周芷若" age="22">技能:九阴真经</Boss>
	 </novel>
	 */
	@Test
	public void delete2(){
		
		Document document = Dom4jUtils.getDocument("src\\novels3.xml");
		Element root = document.getRootElement();
		List<Element> novels = root.elements();
		//找到指定节点
		Element novel3 = novels.get(2);
		// 获得指定节点下指定名称的子节点
		Element maleLead = novel3.element("MaleLead");
		Element femaleLead = novel3.element("FemaleLead");
		// 通过父节点删除子节点
		boolean remove1 = novel3.remove(maleLead);
		boolean remove2 = novel3.remove(femaleLead);
		System.out.println(remove1 + "," + remove2);
		// 回写
		Dom4jUtils.writerDocument(document, "src\\novels35.xml");
		
	}
	
	
	/*
	 * 删除第2个节点
	 * <novel id="2" name="神雕侠侣" auther="金庸">
		<MaleLead name="杨过" age="22">技能:黯然销魂掌</MaleLead>
		<FemaleLead name="小龙女" age="21">技能:玉女心经</FemaleLead>
		<Boss name="金轮法王" age="55"></Boss>
	   </novel>
	 */
	@Test
	public void delete3(){
		
		Document document = Dom4jUtils.getDocument("src\\novels3.xml");
		Element root = document.getRootElement();
		List<Element> novels = root.elements();
		// 找到指定节点
		Element novel2 = novels.get(1);
		// 获得指定节点的父节点
		Element parent = novel2.getParent();
		// 通过父节点删除指定节点
		boolean remove = parent.remove(novel2);
		System.out.println(remove);
		// 回写
		Dom4jUtils.writerDocument(document, "src\\novels36.xml");
		
	}
	
	/*
	 * 删除<novel>的所有属性
	 */
	@Test
	public void delete4(){
		
		Document document = Dom4jUtils.getDocument("src\\novels3.xml");
		Element root = document.getRootElement();
		// 获得根节点下所有novel节点
		List<Element> novels = root.elements();
		for(Element novel : novels){
			// 获得novel节点的所有属性
			List<Attribute> attributes = novel.attributes();
			// 删除所有属性
			//attributes.clear();
			// 或者 集合遍历,集合删除
			for(int i = 0; i < attributes.size(); i++){
				attributes.remove(i);
				i--;
			}
		}
		// 回写
		Dom4jUtils.writerDocument(document, "src\\novels37.xml");
		System.out.println("end...");
		
	}
	
	/*
	 * 删除<novel>的id属性和auther属性
	 */
	@Test
	public void delete5(){
		
		Document document = Dom4jUtils.getDocument("src\\novels3.xml");
		Element root = document.getRootElement();
		// 获得根节点下所有novel节点
		List<Element> novels = root.elements();
		for(Element novel : novels){
			List<Attribute> attributes = novel.attributes();
			for(int i = 0; i < attributes.size(); i++){
				Attribute attribute = attributes.get(i);
				if("id".equals(attribute.getName())
					||"auther".equals(attribute.getName())){
					attributes.remove(i);
					i--;
				}
			}
		}
		// 回写
		Dom4jUtils.writerDocument(document, "src\\novels38.xml");
		System.out.println("end...");
		
	}

}

delete1()结果:novels34.xml

<?xml version="1.0" encoding="UTF-8"?>

<novels> 
  <novel id="1" name="射雕英雄传" auther="金庸"></novel>  
  <novel id="2" name="神雕侠侣" auther="金庸"> 
    <MaleLead name="杨过" age="22">技能:黯然销魂掌</MaleLead>  
    <FemaleLead name="小龙女" age="21">技能:玉女心经</FemaleLead>  
    <Boss name="金轮法王" age="55">技能:龙象波若功</Boss> 
  </novel>  
  <novel id="3" name="倚天屠龙记" auther="金庸"> 
    <MaleLead name="张无忌" age="24">技能:九阳神功</MaleLead>  
    <FemaleLead name="赵敏" age="23">技能:未知</FemaleLead>  
    <Boss name="周芷若" age="22">技能:九阴真经</Boss> 
  </novel> 
</novels>

delete2()结果:novels35.xml

<?xml version="1.0" encoding="UTF-8"?>

<novels> 
  <novel id="1" name="射雕英雄传" auther="金庸"> 
    <MaleLead name="郭靖" age="26">技能:降龙十八掌</MaleLead>  
    <FemaleLead name="黄蓉" age="26">技能:打狗棍法</FemaleLead>  
    <Boss name="欧阳锋" age="55">技能:蛤蟆功</Boss> 
  </novel>  
  <novel id="2" name="神雕侠侣" auther="金庸"> 
    <MaleLead name="杨过" age="22">技能:黯然销魂掌</MaleLead>  
    <FemaleLead name="小龙女" age="21">技能:玉女心经</FemaleLead>  
    <Boss name="金轮法王" age="55">技能:龙象波若功</Boss> 
  </novel>  
  <novel id="3" name="倚天屠龙记" auther="金庸"> 
    <Boss name="周芷若" age="22">技能:九阴真经</Boss> 
  </novel> 
</novels>

delete3()结果:novels36.xml

<?xml version="1.0" encoding="UTF-8"?>

<novels> 
  <novel id="1" name="射雕英雄传" auther="金庸"> 
    <MaleLead name="郭靖" age="26">技能:降龙十八掌</MaleLead>  
    <FemaleLead name="黄蓉" age="26">技能:打狗棍法</FemaleLead>  
    <Boss name="欧阳锋" age="55">技能:蛤蟆功</Boss> 
  </novel>  
  <novel id="3" name="倚天屠龙记" auther="金庸"> 
    <MaleLead name="张无忌" age="24">技能:九阳神功</MaleLead>  
    <FemaleLead name="赵敏" age="23">技能:未知</FemaleLead>  
    <Boss name="周芷若" age="22">技能:九阴真经</Boss> 
  </novel> 
</novels>

delete4()结果:novels37.xml

<?xml version="1.0" encoding="UTF-8"?>

<novels> 
  <novel> 
    <MaleLead name="郭靖" age="26">技能:降龙十八掌</MaleLead>  
    <FemaleLead name="黄蓉" age="26">技能:打狗棍法</FemaleLead>  
    <Boss name="欧阳锋" age="55">技能:蛤蟆功</Boss> 
  </novel>  
  <novel> 
    <MaleLead name="杨过" age="22">技能:黯然销魂掌</MaleLead>  
    <FemaleLead name="小龙女" age="21">技能:玉女心经</FemaleLead>  
    <Boss name="金轮法王" age="55">技能:龙象波若功</Boss> 
  </novel>  
  <novel> 
    <MaleLead name="张无忌" age="24">技能:九阳神功</MaleLead>  
    <FemaleLead name="赵敏" age="23">技能:未知</FemaleLead>  
    <Boss name="周芷若" age="22">技能:九阴真经</Boss> 
  </novel> 
</novels>

delete5()结果:novels38.xml

<?xml version="1.0" encoding="UTF-8"?>

<novels> 
  <novel name="射雕英雄传"> 
    <MaleLead name="郭靖" age="26">技能:降龙十八掌</MaleLead>  
    <FemaleLead name="黄蓉" age="26">技能:打狗棍法</FemaleLead>  
    <Boss name="欧阳锋" age="55">技能:蛤蟆功</Boss> 
  </novel>  
  <novel name="神雕侠侣"> 
    <MaleLead name="杨过" age="22">技能:黯然销魂掌</MaleLead>  
    <FemaleLead name="小龙女" age="21">技能:玉女心经</FemaleLead>  
    <Boss name="金轮法王" age="55">技能:龙象波若功</Boss> 
  </novel>  
  <novel name="倚天屠龙记"> 
    <MaleLead name="张无忌" age="24">技能:九阳神功</MaleLead>  
    <FemaleLead name="赵敏" age="23">技能:未知</FemaleLead>  
    <Boss name="周芷若" age="22">技能:九阴真经</Boss> 
  </novel> 
</novels>

7.xml修改操作

package zh.xml.demo;

import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.junit.Test;

/**
 * xml-修改
 * 
 * @author ZH
 *
 */
public class XmlUpdate {

	/*
	 * 修改所有<novel>的id属性值
	 */
	@Test
	public void update1() {

		Document document = Dom4jUtils.getDocument("src\\novels3.xml");
		Element root = document.getRootElement();
		List<Element> novels = root.elements();
		// 遍历novel节点
		for (int i = 0; i < novels.size(); i++) {
			// 获得novel节点的id属性
			Attribute idAttr = novels.get(i).attribute("id");
			// 修改id属性的值
			idAttr.setValue("000" + i);
		}
		// 回写
		Dom4jUtils.writerDocument(document, "src\\novels39.xml");
		System.out.println("end...");

	}
	
	
	/*
	 * 修改 <MaleLead name="杨过" age="22">技能:黯然销魂掌</MaleLead>
	 * 中age=20
	 * <novel id="2" name="神雕侠侣" auther="金庸">
		<MaleLead name="杨过" age="22">技能:黯然销魂掌</MaleLead>
		<FemaleLead name="小龙女" age="21">技能:玉女心经</FemaleLead>
		<Boss name="金轮法王" age="55">技能:龙象波若功</Boss>
	   </novel>
	 */
	@Test
	public void update2(){
		
		Document document = Dom4jUtils.getDocument("src\\novels3.xml");
		Element root = document.getRootElement();
		List<Element> novels = root.elements();
		Element novel2 = novels.get(1);
		// 找到属性所在的节点
		Element maleLead = novel2.element("MaleLead");
		// 找到属性
		Attribute maleLeadAttr = maleLead.attribute("age");
		// 修改属性
		maleLeadAttr.setValue("20");
		// 回写
		Dom4jUtils.writerDocument(document, "src\\novels310.xml");
		System.out.println("end...");
		
	}

	
	/*
	 * 修改文本内容:技能:九阴白骨爪
	 * <novel id="3" name="倚天屠龙记" auther="金庸">
		<MaleLead name="张无忌" age="24">技能:九阳神功</MaleLead>
		<FemaleLead name="赵敏" age="23">技能:未知</FemaleLead>
		<Boss name="周芷若" age="22">技能:九阴真经</Boss>
	   </novel>
	 */
	@Test
	public void update3(){
		
		Document document = Dom4jUtils.getDocument("src\\novels3.xml");
		Element root = document.getRootElement();
		List<Element> novels = root.elements("novel");
		Element novel3 = novels.get(2);
		Element boss = novel3.element("Boss");
		boss.setText("技能:九阴白骨爪");
		// 回写
		Dom4jUtils.writerDocument(document, "src\\novels311.xml");
		System.out.println("end...");
				
	}
	
}

update1()结果:novels39.xml

<?xml version="1.0" encoding="UTF-8"?>

<novels> 
  <novel id="0000" name="射雕英雄传" auther="金庸"> 
    <MaleLead name="郭靖" age="26">技能:降龙十八掌</MaleLead>  
    <FemaleLead name="黄蓉" age="26">技能:打狗棍法</FemaleLead>  
    <Boss name="欧阳锋" age="55">技能:蛤蟆功</Boss> 
  </novel>  
  <novel id="0001" name="神雕侠侣" auther="金庸"> 
    <MaleLead name="杨过" age="22">技能:黯然销魂掌</MaleLead>  
    <FemaleLead name="小龙女" age="21">技能:玉女心经</FemaleLead>  
    <Boss name="金轮法王" age="55">技能:龙象波若功</Boss> 
  </novel>  
  <novel id="0002" name="倚天屠龙记" auther="金庸"> 
    <MaleLead name="张无忌" age="24">技能:九阳神功</MaleLead>  
    <FemaleLead name="赵敏" age="23">技能:未知</FemaleLead>  
    <Boss name="周芷若" age="22">技能:九阴真经</Boss> 
  </novel> 
</novels>

update2()结果:novels310.xml

<?xml version="1.0" encoding="UTF-8"?>

<novels> 
  <novel id="1" name="射雕英雄传" auther="金庸"> 
    <MaleLead name="郭靖" age="26">技能:降龙十八掌</MaleLead>  
    <FemaleLead name="黄蓉" age="26">技能:打狗棍法</FemaleLead>  
    <Boss name="欧阳锋" age="55">技能:蛤蟆功</Boss> 
  </novel>  
  <novel id="2" name="神雕侠侣" auther="金庸"> 
    <MaleLead name="杨过" age="20">技能:黯然销魂掌</MaleLead>  
    <FemaleLead name="小龙女" age="21">技能:玉女心经</FemaleLead>  
    <Boss name="金轮法王" age="55">技能:龙象波若功</Boss> 
  </novel>  
  <novel id="3" name="倚天屠龙记" auther="金庸"> 
    <MaleLead name="张无忌" age="24">技能:九阳神功</MaleLead>  
    <FemaleLead name="赵敏" age="23">技能:未知</FemaleLead>  
    <Boss name="周芷若" age="22">技能:九阴真经</Boss> 
  </novel> 
</novels>

update3()结果:novels311.xml

<?xml version="1.0" encoding="UTF-8"?>

<novels> 
  <novel id="1" name="射雕英雄传" auther="金庸"> 
    <MaleLead name="郭靖" age="26">技能:降龙十八掌</MaleLead>  
    <FemaleLead name="黄蓉" age="26">技能:打狗棍法</FemaleLead>  
    <Boss name="欧阳锋" age="55">技能:蛤蟆功</Boss> 
  </novel>  
  <novel id="2" name="神雕侠侣" auther="金庸"> 
    <MaleLead name="杨过" age="22">技能:黯然销魂掌</MaleLead>  
    <FemaleLead name="小龙女" age="21">技能:玉女心经</FemaleLead>  
    <Boss name="金轮法王" age="55">技能:龙象波若功</Boss> 
  </novel>  
  <novel id="3" name="倚天屠龙记" auther="金庸"> 
    <MaleLead name="张无忌" age="24">技能:九阳神功</MaleLead>  
    <FemaleLead name="赵敏" age="23">技能:未知</FemaleLead>  
    <Boss name="周芷若" age="22">技能:九阴白骨爪</Boss> 
  </novel> 
</novels>

8.xml查询操作

novels3.xml

<?xml version="1.0" encoding="UTF-8"?>
<novels>

	<novel id="1" name="射雕英雄传" auther="金庸">
		<MaleLead name="郭靖" age="26">技能:降龙十八掌</MaleLead>
		<FemaleLead name="黄蓉" age="26">技能:打狗棍法</FemaleLead>
		<Boss name="欧阳锋" age="55">技能:蛤蟆功</Boss>
	</novel>

	<novel id="2" name="神雕侠侣" auther="金庸">
		<MaleLead name="杨过" age="22">技能:黯然销魂掌</MaleLead>
		<FemaleLead name="小龙女" age="21">技能:玉女心经</FemaleLead>
		<Boss name="金轮法王" age="55">技能:龙象波若功</Boss>
	</novel>

	<novel id="3" name="倚天屠龙记" auther="金庸">
		<MaleLead name="张无忌" age="24">技能:九阳神功</MaleLead>
		<FemaleLead name="赵敏" age="23">技能:未知</FemaleLead>
		<Boss name="周芷若" age="22">技能:九阴真经</Boss>
	</novel>

</novels>

novels4.xml

<?xml version="1.0" encoding="UTF-8"?>
<novels>

	<novel id="1" name="射雕英雄传" auther="金庸">
		<MaleLead name="郭靖" age="26">技能:降龙十八掌</MaleLead>
		<FemaleLead name="黄蓉" age="26">技能:打狗棍法</FemaleLead>
		<Boss name="欧阳锋" age="55">技能:蛤蟆功</Boss>
	</novel>

	<novel name="神雕侠侣" auther="金庸">
		<MaleLead name="杨过" age="22">技能:黯然销魂掌</MaleLead>
		<FemaleLead name="小龙女" age="21">技能:玉女心经</FemaleLead>
		<Boss name="金轮法王" age="55">技能:龙象波若功</Boss>
	</novel>

	<novel id="3" name="倚天屠龙记" auther="金庸">
		<MaleLead name="张无忌" age="24">技能:九阳神功</MaleLead>
		<FemaleLead name="赵敏" age="23">技能:未知</FemaleLead>
		<Boss name="周芷若" age="22">技能:九阴真经</Boss>
	</novel>
	
	<MaleLead age="10">技能:暂无</MaleLead>
	<MaleLead age="11">技能:暂无</MaleLead>
	<FemaleLead age="13">技能:暂无</FemaleLead>
	<FemaleLead age="14">技能:暂无</FemaleLead>
	<Boss age="15">技能:暂无</Boss>
	<Boss age="16">技能:暂无</Boss>

</novels>
package zh.xml.demo;

import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.junit.Test;

/**
 * xml-查询操作
 * 
 * @author ZH
 *
 */
public class XmlQuery {

	/*
	 * novels3.xml
	 * 查询所有<FemaleLead>,输出属性和文本内容
	 */
	@Test
	public void query1(){
		
		Document document = Dom4jUtils.getDocument("src\\novels3.xml");
		Element root = document.getRootElement();
		// 获得根节点下所有novel节点
		List<Element> novels = root.elements("novel");
		for(Element  novel : novels){
			// 获得novel下的FemaleLead节点
			Element femaleLead = novel.element("FemaleLead");
			// 输出FemaleLead节点名称
			System.out.println(femaleLead.getName());
			// 获得FemaleLead的所有属性
			List<Attribute> attributes = femaleLead.attributes();
			for(Attribute attribute : attributes){
				// 输出属性和值
				System.out.println(attribute.getName()+"="+attribute.getValue());
			}
			String text = femaleLead.getText();
			// 输出FemaleLead的文本内容
			System.out.println(text);
			System.out.println("-----------------------");
		}
		
	}
	
	/*
	 * novels3.xml
	 * 查询第二个<novel>中<Boss>,输出name属性和文本内容
	 * <novel id="2" name="神雕侠侣" auther="金庸">
		<MaleLead name="杨过" age="22">技能:黯然销魂掌</MaleLead>
		<FemaleLead name="小龙女" age="21">技能:玉女心经</FemaleLead>
		<Boss name="金轮法王" age="55">技能:龙象波若功</Boss>
	   </novel>
	 */
	@Test
	public void query2(){
		
		Document document = Dom4jUtils.getDocument("src\\novels3.xml");
		Element root = document.getRootElement();
		List<Element> novels = root.elements("novel");
		// 找到节点
		Element novel2 = novels.get(1);
		// 找到子节点
		Element boss = novel2.element("Boss");
		// 找到name属性
		Attribute nameAttr = boss.attribute("name");
		// 输出属性和值
		System.out.println(nameAttr.getName()+"="+nameAttr.getValue());
		// 获得文本并输出
		String text = boss.getText();
		System.out.println(text);
		
	}
	
	/*
	 * novels4.xml
	 * xPath查询
	 */
	@Test
	public void xpathQuery(){
		
		Document document = Dom4jUtils.getDocument("src\\novels4.xml");
		Element root = document.getRootElement();
		
		//查询根节点 
		List<Node> nodes1 = root.selectNodes("/novels");
		System.out.println(nodes1.size());//1
		System.out.println(nodes1.get(0).getName());//novels
		
		// 查询novel节点
		List<Node> nodes2 = root.selectNodes("/novels/novel");
		for(Node node : nodes2){
			System.out.println(node.getName());
		}
		//		输出
		//		novel
		//		novel
		//		novel
		
		// 查询指定层级下的Boss节点(1)
		List<Node> nodes3 = root.selectNodes("/novels/novel/Boss");
		for(Node node : nodes3){
			System.out.println(node.getName());
		}
		//		输出
		//		Boss
		//		Boss
		//		Boss

		// 查询指定层级下的Boss节点(2)
		List<Node> nodes33 = root.selectNodes("//novel/Boss");
		for(Node node : nodes33){
			System.out.println(node.getName());
		}
		//		输出
		//		Boss
		//		Boss
		//		Boss
		
		// 查询所有Boss,无论层级关系
		List<Node> nodes4 = root.selectNodes("//Boss");
		for(Node node : nodes4){
			System.out.println(node.getName());
		}
		//		输出
		//		Boss
		//		Boss
		//		Boss
		//		Boss
		//		Boss

		// 查询novel节点的所有子节点
		List<Node> nodes5 = root.selectNodes("//novel/*");
		System.out.println(nodes5.size());//9
		for(Node node : nodes5){
			System.out.println(node.getName());
		}
		//      输出
		//		MaleLead
		//		FemaleLead
		//		Boss
		//		MaleLead
		//		FemaleLead
		//		Boss
		//		MaleLead
		//		FemaleLead
		//		Boss
		
		// 查询第一个novel,输出属性值
		//List<Node> novel1s = root.selectNodes("/novels/novel[1]");
		//System.out.println(novel1s.size());//1
		Element novel1 = (Element) root.selectSingleNode("/novels/novel[1]");
		List<Attribute> attributes1 = novel1.attributes();
		for(Attribute attribute : attributes1){
			System.out.println(attribute.getName()+"="+attribute.getValue());
		}
		//		输出
		//		id=1
		//		name=射雕英雄传
		//		auther=金庸
		
		// 查询最后一个novel,输出属性值
		Element lastNovel = (Element) root.selectSingleNode("/novels/novel[last()]");
		List<Attribute> attributes2 = lastNovel.attributes();
		for(Attribute attribute  : attributes2){
			System.out.println(attribute.getName()+"="+attribute.getValue());
		}
		//		输出
		//		id=3
		//		name=倚天屠龙记
		//		auther=金庸

		// 查询所有id属性
		List<Node> nodes6 = root.selectNodes("//@id");
		System.out.println(nodes6.size());
		for(Node node : nodes6){
			System.out.println(node.getName());
		}
		//		输出
		//		id
		//		id
		//		id
		
		// 查询带有id属性的novel节点
		List<Element> novels1 = root.selectNodes("//novel[@id]");
		for(Element novel : novels1){
			System.out.println(novel.attribute("id").getValue());
		}
		//		输出
		//		1
		//		3
		
		// 查询带有name属性的MaleLead节点
		List<Element> maleLeads = root.selectNodes("//MaleLead[@name]");
		for(Element maleLead : maleLeads){
			System.out.println(maleLead.attributeValue("name"));
		}
		//		输出
		//		郭靖
		//		杨过
		//		张无忌
		
		// 查询id属性为"3"的novel节点
		Element novel3 = (Element) root.selectSingleNode("//novel[@id='3']");
		System.out.println(novel3.attributeValue("id"));//3
		
		// 查询name属性为"小龙女"的FemaleLead节点
		Element femaleLead = (Element) root.selectSingleNode("//FemaleLead[@name='小龙女']");
		System.out.println(femaleLead.attributeValue("name"));//小龙女
		
	}
	
}

猜你喜欢

转载自blog.csdn.net/qq_41706150/article/details/80112256