所需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
<?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"));//小龙女 } }