博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
xml的Dom4j解析规则
阅读量:6088 次
发布时间:2019-06-20

本文共 22868 字,大约阅读时间需要 76 分钟。

一,xml的样本

假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术之旅吧,详情请点击

1 
2
3
4
张三
5
20
6
134222223333
7
zhangsan@qq.com
8
432221111
9
10
11
李四
12
20
13
134222225555
14
lisi@qq.com
15
432222222
16
17

 二,Dom4j的读的套路

2.1,Dom4j解析xml获取整个文档的信息

1         //1.创建一个xml解析器对象2             SAXReader reader = new SAXReader();3             //2.读取xml文档,返回Document对象4             Document doc = reader.read(new File("./src/contact.xml"));5             6             System.out.println(doc);

 

 

 

2.2,Dom4j解析xml获取第一个子节点对象,(就是根节点的对象)

1         //1.读取xml文档,返回Document对象 2         SAXReader reader = new SAXReader(); 3         Document doc = reader.read(new File("./src/contact.xml")); 4          5         //2.nodeIterator: 得到当前节点下的所有子节点对象(不包含孙以下的节点) 6         Iterator
it = doc.nodeIterator(); 7 while(it.hasNext()){
//判断是否有下一个元素 8 Node node = it.next();//取出元素 9 String name = node.getName();//得到节点名称10 System.out.println(name); 11 System.out.println(node.getClass()); 12 }13 }

 

 

 

2.3,Dom4j解析xml获取根节点对象下一级的节点名称

1         //1.读取xml文档,返回Document对象 2         SAXReader reader = new SAXReader(); 3         Document doc = reader.read(new File("./src/contact.xml")); 4          5         //2.nodeIterator: 得到当前节点下的所有子节点对象(不包含孙以下的节点) 6         Iterator
it = doc.nodeIterator(); 7 while(it.hasNext()){
//判断是否有下一个元素 8 Node node = it.next();//取出元素 9 String name = node.getName();//得到节点名称10 //继续取出其下面的子节点11 //只有标签节点才有子节点12 //判断当前节点是否是标签节点13 if(node instanceof Element){14 Element elem = (Element)node;15 Iterator
it2 = elem.nodeIterator();16 while(it2.hasNext()){17 Node n2 = it2.next();18 System.out.println(n2.getName());19 }20 }21 }22 }

 

1 null2 contact3 null4 contact5 null

 

上面的null就是格式中的空格引起的。

2.4,Dom4j解析xml获取所有的节点

1     public void test2() throws Exception{ 2         //1.读取xml文档,返回Document对象 3         SAXReader reader = new SAXReader(); 4         Document doc = reader.read(new File("./src/contact.xml")); 5          6         //得到根标签 7         Element rooElem = doc.getRootElement(); 8          9         getChildNodes(rooElem);10 11     }12     13     /**14      * 获取 传入的标签下的所有子节点15      * @param elem16      */17     private void getChildNodes(Element elem){18         System.out.println(elem.getName());19         20         //得到子节点21         Iterator
it = elem.nodeIterator();22 while(it.hasNext()){23 Node node = it.next();24 25 //1.判断是否是标签节点,因为只有标签节点才有子节点26 if(node instanceof Element){27 Element el = (Element)node;28 //递归29 getChildNodes(el);30 }31 };32 }33

 

1 contactList 2 contact 3 name 4 age 5 phone 6 email 7 qq 8 contact 9 name10 age11 phone12 email13 qq

 

2.5,Dom4j解析xml获取根标签的另一种方式

1         //1.读取xml文档,返回Document对象2         SAXReader reader = new SAXReader();3         Document doc = reader.read(new File("./src/contact.xml"));4         5         //2.得到根标签6         Element  rootElem = doc.getRootElement();7         //得到标签名称8         String name = rootElem.getName();9         System.out.println(name);

contactList

 

2.6,Dom4j解析xml获取根标签下的第一个子标签的另一种方式

1     //1.读取xml文档,返回Document对象 2         SAXReader reader = new SAXReader(); 3         Document doc = reader.read(new File("./src/contact.xml")); 4          5         //2.得到根标签 6         Element  rootElem = doc.getRootElement(); 7         //得到标签名称 8         String name = rootElem.getName(); 9         10         //3.得到当前标签下指定名称的第一个子标签11 12         Element contactElem = rootElem.element("contact");13         System.out.println(contactElem.getName());

 

contact

2.7,Dom4j解析xml获取指定标签下的所有的子标签

1         //1.读取xml文档,返回Document对象 2         SAXReader reader = new SAXReader(); 3         Document doc = reader.read(new File("./src/contact.xml"));         4         //2.得到根标签 5         Element  rootElem = doc.getRootElement(); 6         //得到标签名称 7         //4.得到当前标签下指定名称的所有子标签     8         Iterator
it = rootElem.elementIterator("contact"); 9 while(it.hasNext()){10 Element elem = it.next();11 System.out.println(elem.getName());12 }

 

contact

contact

2.8,Dom4j解析xml获取更标签下的所有字标签,这个是没有指定的,就是更标签下面的,可能是contact,也可能是abc之类的。

1         //1.读取xml文档,返回Document对象 2         SAXReader reader = new SAXReader(); 3         Document doc = reader.read(new File("./src/contact.xml"));         4         //2.得到根标签 5         Element  rootElem = doc.getRootElement();     6         //5.得到当前标签下的的所有子标签 7         List
list = rootElem.elements(); 8 //遍历List的方法 9 //1)传统for循环 2)增强for循环 3)迭代器10 /*for(int i=0;i
it = list.iterator(); //ctrl+2 松开 l20 while(it.hasNext()){21 Element elem = it.next();22 System.out.println(elem.getName());23 }*/

 

contact

contact

2.9,Dom4j解析xml获取更深一层次的标签

1         //1.读取xml文档,返回Document对象2         SAXReader reader = new SAXReader();3         Document doc = reader.read(new File("./src/contact.xml"));4         //获取更深层次的标签(方法只能一层层地获取)5         Element nameElem = doc.getRootElement().6                     element("contact").element("name");7         System.out.println(nameElem.getName());

 

name

2.10,Dom4j解析xml获取指定属性的属性值

1         SAXReader reader = new SAXReader(); 2         Document doc = reader.read(new File("./src/contact.xml")); 3          4         //获取属性:(先获的属性所在的标签对象,然后才能获取属性) 5         //1.得到标签对象 6         Element contactElem = doc.getRootElement().element("contact"); 7         //2.得到属性 8         //2.1  得到指定名称的属性值 9         String idValue = contactElem.attributeValue("id");10         System.out.println(idValue);

 

001

2.11,Dom4j解析xml获取指定属性的属性值和属性名(指定标签有一个属性)

1         SAXReader reader = new SAXReader(); 2         Document doc = reader.read(new File("./src/contact.xml")); 3          4         //获取属性:(先获的属性所在的标签对象,然后才能获取属性) 5         //1.得到标签对象 6         Element contactElem = doc.getRootElement().element("contact"); 7  8         //2.2 得到指定属性名称的属性对象 9         Attribute idAttr = contactElem.attribute("id");10         //getName: 属性名称    getValue:属性值11         System.out.println(idAttr.getName() +"=" + idAttr.getValue());

 

id=001

2.12,Dom4j解析xml获取标签的所有的属性的属性值和属性名(指定标签有多个属性)

1         //1.读取xml文档,返回Document对象 2         SAXReader reader = new SAXReader(); 3         Document doc = reader.read(new File("./src/contact.xml")); 4          5         //获取属性:(先获的属性所在的标签对象,然后才能获取属性) 6         //1.得到标签对象 7         Element contactElem = doc.getRootElement().element("contact"); 8  9         10         //2.3 得到所有属性对象,返回LIst集合11         List
list = contactElem.attributes();12 //遍历属性13 for (Attribute attr : list) {14 System.out.println(attr.getName()+"="+attr.getValue());15 }

id=001

 

2.13,Dom4j解析xml获取所有的属性的属性值和属性名(指定标签有多个属性)

1         //1.读取xml文档,返回Document对象 2         SAXReader reader = new SAXReader(); 3         Document doc = reader.read(new File("./src/contact.xml")); 4          5         //获取属性:(先获的属性所在的标签对象,然后才能获取属性) 6         //1.得到标签对象 7         Element contactElem = doc.getRootElement().element("contact"); 8  9         //2.4 得到所有属性对象,返回迭代器10         Iterator
it = contactElem.attributeIterator();11 while(it.hasNext()){12 Attribute attr = it.next();13 System.out.println(attr.getName()+"="+attr.getValue());14 }

 

id=001

2.14,Dom4j解析xml获取指定标签的文本内容

1         //1.读取xml文档,返回Document对象2         SAXReader reader = new SAXReader();3                     4         Document doc = reader.read(new File("./src/contact.xml"));5         Element nameELem = 6             doc.getRootElement().element("contact").element("name");7         //1. 得到文本8         String text = nameELem.getText();9         System.out.println(text);

 

张三

2.15,Dom4j解析xml获取指定标签的文本内容

1         //1.读取xml文档,返回Document对象 2         SAXReader reader = new SAXReader(); 3                      4         Document doc = reader.read(new File("./src/contact.xml")); 5         //2. 得到指定子标签名的文本内容 6         String text2 =  7             doc.getRootElement().element("contact").elementText("phone"); 8         System.out.println(text2); 9         10     }

 

134222223333

三,案例一(原模原样的输出xml格式的数据)

3.1,获取整个xml文档,并且格式保持不变

1     @Test 2     public void test() throws Exception{ 3         //读取xml文档 4         SAXReader reader = new SAXReader(); 5         Document doc =  6                 reader.read(new File("./src/contact.xml")); 7          8         //读取根标签 9         Element rootELem = doc.getRootElement();10         11         StringBuffer sb = new StringBuffer();12         13         getChildNodes(rootELem,sb);14         15         System.out.println(sb.toString());16         17     }18     19     /**20      * 获取当前标签的所有子标签21      */22     private void getChildNodes(Element elem,StringBuffer sb){23         //System.out.println(elem.getName());24         25         //开始标签26         sb.append("<"+elem.getName());27         28         //得到标签的属性列表29         List
attrs = elem.attributes();30 if(attrs!=null){31 for (Attribute attr : attrs) {32 //System.out.println(attr.getName()+"="+attr.getValue());33 sb.append(" "+attr.getName()+"=\""+attr.getValue()+"\"");34 }35 }36 sb.append(">");37 38 //得到文本39 //String content = elem.getText();40 //System.out.println(content);41 Iterator
it = elem.nodeIterator();42 while(it.hasNext()){43 Node node = it.next();44 45 //标签46 if(node instanceof Element){47 Element el = (Element)node;48 getChildNodes(el,sb);49 }50 51 //文本52 if(node instanceof Text){53 Text text = (Text)node;54 sb.append(text.getText());55 }56 }57 58 //结束标签59 sb.append("
");60 61 62 63 64 }
1 
2
3
张三
4
20
5
134222223333
6
zhangsan@qq.com
7
432221111
8
9
10
李四
11
20
12
134222225555
13
lisi@qq.com
14
432222222
15
16

 

会原模原样的把上面的输出的。

四,案例二,把xml的属性值封装到对象中来。

4.1,讲解

1 public class Contact { 2     private String id; 3     private String name; 4     private String age; 5     private String phone; 6     private String email; 7     private String qq; 8     public String getId() { 9         return id;10     }11     public void setId(String id) {12         this.id = id;13     }14     public String getName() {15         return name;16     }17     public void setName(String name) {18         this.name = name;19     }20     public String getAge() {21         return age;22     }23     public void setAge(String age) {24         this.age = age;25     }26     public String getPhone() {27         return phone;28     }29     public void setPhone(String phone) {30         this.phone = phone;31     }32     public String getEmail() {33         return email;34     }35     public void setEmail(String email) {36         this.email = email;37     }38     public String getQq() {39         return qq;40     }41     public void setQq(String qq) {42         this.qq = qq;43     }44     @Override45     public String toString() {46         return "Contact [age=" + age + ", email=" + email + ", id=" + id47                 + ", name=" + name + ", phone=" + phone + ", qq=" + qq + "]";48     }
1 public static void main(String[] args) throws Exception{ 2             List
list = new ArrayList
(); 3 4 //读取xml,封装对象 5 SAXReader reader = new SAXReader(); 6 Document doc = reader.read(new File("./src/contact.xml")); 7 //读取contact标签 8 Iterator
it = doc.getRootElement().elementIterator("contact"); 9 while(it.hasNext()){10 Element elem = it.next();11 //创建Contact12 Contact contact = new Contact();13 contact.setId(elem.attributeValue("id"));14 contact.setName(elem.elementText("name"));15 contact.setAge(elem.elementText("age"));16 contact.setPhone(elem.elementText("phone"));17 contact.setEmail(elem.elementText("email"));18 contact.setQq(elem.elementText("qq"));19 list.add(contact);20 }21 22 for (Contact contact : list) {23 System.out.println(contact);24 }25 26 27 }
1 Contact [age=20, email=zhangsan@qq.com, id=001, name=张三, phone=134222223333, qq=432221111]2 Contact [age=20, email=lisi@qq.com, id=002, name=李四, phone=134222225555, qq=432222222]

 

五,Dom4j的写的套路

5.1,Dom4j解析xml写出没有改变任何东西的输出

1         //一、读取或创建一个Document对象 2         //读取day07项目的xm文件 3         Document doc = new SAXReader().read(new File("./src/contact.xml")); 4          5          6         //二、修改Document对象内容 7          8          9         //三、把修改后的Document对象写出到xml文档中10         //指定文件输出的位置11         FileOutputStream out = new FileOutputStream("e:/contact.xml");12         //1.创建写出对象13         XMLWriter writer = new XMLWriter(out);14         15         //2.写出对象16         writer.write(doc);17         //3.关闭流18         writer.close();19     }

5.2,Dom4j解析xml写出改变输出格式的输出

1         Document doc = new SAXReader().read(new File("./src/contact.xml")); 2         //指定文件输出的位置 3         FileOutputStream out = new FileOutputStream("e:/contact.xml"); 4         /** 5          * 1.指定写出的格式 6          */ 7         OutputFormat format = OutputFormat.createCompactFormat(); //紧凑的格式.去除空格换行.项目上线的时候 8         //OutputFormat format = OutputFormat.createPrettyPrint(); //漂亮的格式.有空格和换行.开发调试的时候 9 10         11         //1.创建写出对象12         XMLWriter writer = new XMLWriter(out,format);13         14         //2.写出对象15         writer.write(doc);16         //3.关闭流17         writer.close();18     }

 

 

5.3,Dom4j解析xml写出改变编码的输出

1     Document doc = new SAXReader().read(new File("./src/contact.xml")); 2         //指定文件输出的位置 3         FileOutputStream out = new FileOutputStream("e:/contact.xml"); 4         /** 5          * 1.指定写出的格式 6          */ 7         OutputFormat format = OutputFormat.createCompactFormat(); //紧凑的格式.去除空格换行.项目上线的时候 8         //OutputFormat format = OutputFormat.createPrettyPrint(); //漂亮的格式.有空格和换行.开发调试的时候 9         /**10          * 2.指定生成的xml文档的编码11          *    同时影响了xml文档保存时的编码  和  xml文档声明的encoding的编码(xml解析时的编码)12          *    结论: 使用该方法生成的xml文档避免中文乱码问题。13          */14         format.setEncoding("utf-8");15         16         17         //1.创建写出对象18         XMLWriter writer = new XMLWriter(out,format);19         20         //2.写出对象21         writer.write(doc);22         //3.关闭流23         writer.close();

 

 

5.4,Dom4j解析xml写出增加标签属性

1     public void test1() throws Exception{ 2         /** 3          * 1.创建文档 4          */ 5         Document doc = DocumentHelper.createDocument(); 6         /** 7          * 2.增加标签 8          */ 9         Element rootElem = doc.addElement("contactList");10         //doc.addElement("contactList");11         Element contactElem = rootElem.addElement("contact");12         contactElem.addElement("name");13         /**14          * 3.增加属性15          */16         contactElem.addAttribute("id", "001");17         contactElem.addAttribute("name", "eric");18         19         //把修改后的Document对象写出到xml文档中20         FileOutputStream out = new FileOutputStream("e:/contact.xml");21         OutputFormat format = OutputFormat.createPrettyPrint();22         format.setEncoding("utf-8");23         XMLWriter writer = new XMLWriter(out,format);24         writer.write(doc);25         writer.close();26     }

 

 

5.5,Dom4j解析xml写出修改属性值和文本

1 @Test 2     public void test2()    throws Exception{ 3         Document doc = new SAXReader().read(new File("./src/contact.xml")); 4          5         /** 6          * 方案一: 修改属性值   1.得到标签对象 2.得到属性对象 3.修改属性值 7          */ 8         //1.1  得到标签对象 9         /*10         Element contactElem = doc.getRootElement().element("contact");11         //1.2 得到属性对象12         Attribute idAttr = contactElem.attribute("id");13         //1.3 修改属性值14         idAttr.setValue("003");15         */16         /**17          * 方案二: 修改属性值18          */19         //1.1  得到标签对象20         /*21         Element contactElem = doc.getRootElement().element("contact");22         //1.2 通过增加同名属性的方法,修改属性值23         contactElem.addAttribute("id", "004");24         */25         26         /**27          * 修改文本 1.得到标签对象 2.修改文本28          */29         Element nameElem = doc.getRootElement().30             element("contact").element("name");31         nameElem.setText("李四");32         33         34         35         FileOutputStream out = new FileOutputStream("e:/contact.xml");36         OutputFormat format = OutputFormat.createPrettyPrint();37         format.setEncoding("utf-8");38         XMLWriter writer = new XMLWriter(out,format);39         writer.write(doc);40         writer.close();41     }42

 

 

5.6,Dom4j解析xml写出删除标签和属性

1     @Test 2     public void test3() throws Exception{ 3         Document doc = new SAXReader().read(new File("./src/contact.xml")); 4          5         /** 6          * 1.删除标签     1.1 得到标签对象  1.2 删除标签对象     7          */ 8         // 1.1 得到标签对象 9         /*10         Element ageElem = doc.getRootElement().element("contact")11                     .element("age");12         13         //1.2 删除标签对象14         ageElem.detach();15         //ageElem.getParent().remove(ageElem);16         */17         /**18          * 2.删除属性   2.1得到属性对象  2.2 删除属性19          */20         //2.1得到属性对象21         //得到第二个contact标签22         Element contactElem = (Element)doc.getRootElement().23             elements().get(1);24         //2.2 得到属性对象25         Attribute idAttr = contactElem.attribute("id");26         //2.3 删除属性27         idAttr.detach();28         //idAttr.getParent().remove(idAttr);29         30         FileOutputStream out = new FileOutputStream("e:/contact.xml");31         OutputFormat format = OutputFormat.createPrettyPrint();32         format.setEncoding("utf-8");33         XMLWriter writer = new XMLWriter(out,format);34         writer.write(doc);35         writer.close();36     }

 

 

5.7,Dom4j解析xml写出生成指定的xml文件

1 @Test 2     public void test1() throws Exception{ 3         //1.内存创建xml文档 4         Document doc = DocumentHelper.createDocument(); 5          6         //2.写入内容 7         Element rootElem = doc.addElement("Students"); 8          9         //2.1 增加标签10         Element studentElem1 = rootElem.addElement("Student");11         //2.2 增加属性12         studentElem1.addAttribute("id", "1");13         //2.3 增加标签,同时设置文本14         studentElem1.addElement("name").setText("张三");15         studentElem1.addElement("gender").setText("男");16         studentElem1.addElement("grade").setText("计算机1班");17         studentElem1.addElement("address").setText("广州天河");18         19         //2.1 增加标签20         Element studentElem2 = rootElem.addElement("Student");21         //2.2 增加属性22         studentElem2.addAttribute("id", "2");23         //2.3 增加标签,同时设置文本24         studentElem2.addElement("name").setText("李四");25         studentElem2.addElement("gender").setText("女");26         studentElem2.addElement("grade").setText("计算机2班");27         studentElem2.addElement("address").setText("广州越秀");28         29         30         //3.内容写出到xml文件31         //3.1 输出位置32         FileOutputStream out = new FileOutputStream("e:/student.xml");33         //3.2 指定格式34         OutputFormat format = OutputFormat.createPrettyPrint();35         // 设置编码36         format.setEncoding("utf-8");37         XMLWriter writer = new XMLWriter(out,format);38         //3.3 写出内容39         writer.write(doc);40         //3.4关闭资源41         writer.close();42         43     }44

 

5.8,Dom4j解析xml写出修改id为2的的学生的姓名

1 @Test 2     public void test2() throws Exception{ 3         //1.查询到id为2的学生 4         Document doc = new SAXReader().read(new File("e:/student.xml")); 5         //1.1 找到所有的Student标签 6         Iterator
it = doc.getRootElement().elementIterator("Student"); 7 while(it.hasNext()){ 8 Element stuElem = it.next(); 9 //1.2 查询id为id的学生标签10 if(stuElem.attributeValue("id").equals("2")){11 stuElem.element("name").setText("王丽");12 break;13 }14 }15 16 17 //3.1 输出位置18 FileOutputStream out = new FileOutputStream("e:/student.xml");19 //3.2 指定格式20 OutputFormat format = OutputFormat.createPrettyPrint();21 // 设置编码22 format.setEncoding("utf-8");23 XMLWriter writer = new XMLWriter(out,format);24 //3.3 写出内容25 writer.write(doc);26 //3.4关闭资源27 writer.close();28 }

 

5.9,Dom4j解析xml写出删除id为2的学生的

 

1 public void test3() throws Exception{ 2         //1.查询到id为2的学生 3         Document doc = new SAXReader().read(new File("e:/student.xml")); 4         //1.1 找到所有的Student标签 5         Iterator
it = doc.getRootElement().elementIterator("Student"); 6 while(it.hasNext()){ 7 Element stuElem = it.next(); 8 //1.2 查询id为id的学生标签 9 if(stuElem.attributeValue("id").equals("2")){10 //1.3 删除该学生标签11 stuElem.detach();12 break;13 }14 }15 16 17 //3.1 输出位置18 FileOutputStream out = new FileOutputStream("e:/student.xml");19 //3.2 指定格式20 OutputFormat format = OutputFormat.createPrettyPrint();21 // 设置编码22 format.setEncoding("utf-8");23 XMLWriter writer = new XMLWriter(out,format);24 //3.3 写出内容25 writer.write(doc);26 //3.4关闭资源27 writer.close();28 }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载地址:http://cgpwa.baihongyu.com/

你可能感兴趣的文章
vim学习与理解
查看>>
DIRECTSHOW在VS2005中PVOID64问题和配置问题
查看>>
MapReduce的模式,算法以及用例
查看>>
《Advanced Linux Programming》读书笔记(1)
查看>>
zabbix agent item
查看>>
一步一步学习SignalR进行实时通信_7_非代理
查看>>
AOL重组为两大业务部门 全球裁员500人
查看>>
字符设备与块设备的区别
查看>>
为什么我弃用GNOME转向KDE(2)
查看>>
Redis学习记录初篇
查看>>
爬虫案例若干-爬取CSDN博文,糗事百科段子以及淘宝的图片
查看>>
Web实时通信技术
查看>>
第三章 计算机及服务器硬件组成结合企业运维场景 总结
查看>>
IntelliJ IDEA解决Tomcal启动报错
查看>>
默认虚拟主机设置
查看>>
php中的短标签 太坑人了
查看>>
[译] 可维护的 ETL:使管道更容易支持和扩展的技巧
查看>>
### 继承 ###
查看>>
数组扩展方法之求和
查看>>
astah-professional-7_2_0安装
查看>>