dom4j读取xml
-----记录和回顾是一个比学习更重要的环节-----
一、首先,我们需要知道xml是做什么的
1.作为软件的配置文件
2.作为数据的载体(小型的数据库)
二、xml的语法
xml文件以xml后缀名结尾。
xml文件需要使用xml解析器去解析。浏览器内置了xml解析器。
1.标签
语法:<student></student> 开始标签 标签体内容 结束标签
1)<student/> 或 <student></student> 空标签。没有标签体内容
2)xml标签名称区分大小写。
3)xml标签一定要正确配对。
4)xml标签名中间不能使用空格
5)xml标签名不能以数字开头
6)注意: 在一个xml文档中,有且仅有一个根标签
2.属性
语法: <Student name="eric">student</Student>
注意:
1)属性值必须以引号包含,不能省略,也不能单双引号混用!!!
2)一个标签内可以有多个属性,但不能出现重复的属性名!!!
3.注释
语言: <!-- xml注释 -->
4.文档声明
语法: <?xml version="1.0" encoding="utf-8"?>
version: xml的版本号
encoding: 解析xml文件时查询的码表(解码过程时查询的码表)
注意:
1)如果在ecplise工具中开发xml文件,保存xml文件时自动按照文档声明的encoding来保存文 件。
2)如果用记事本工具修改xml文件,注意保存xml文件按照文档声明的encoding的码表来保存,保证xml文件保存的码表和encoding是一致的。
5.转义字符
在xml中内置了一些特殊字符,这些特殊字符不能直接被浏览器原样输出。如果希望把这些特殊字符按照原样输出到浏览器,对这些特殊字符进行转义。转义之后的字符就叫转义字节。
特殊字符 转义字符
< <
> >
" "
& &
空格 &nsbp;
三、dom4j解析xml
DOM解析原理:xml解析器一次性把整个xml文档加载进内存,然后在内存中构建一颗Document的对象树,通过Document对象,得到树上的节点对象,通过节点对象访问(操作)到xml文档的内容。
1 /** 2 * 遍历所有节点 3 * @throws Exception 4 * 5 */ 6 @Test 7 public void test2 () throws Exception{ 8 //1.创建一个xml解析器对象 9 SAXReader saxReader = new SAXReader(); 10 //2.读取xml文档,返回Document对象 11 Document read = saxReader.read(new File("./src/test.xml")); 12 Element rootElement = read.getRootElement(); 13 getElement(rootElement); 14 } 15 16 private void getElement(Element element){ 17 System.out.println(element.getName()); 18 Iterator<Node> it = element.nodeIterator(); 19 while (it.hasNext()) { 20 Node node = it.next(); 21 if (node instanceof Element) { 22 Element element2 = (Element)node; 23 getElement(element2); 24 } 25 } 26 }
输出结果:
students
student
name
age
student
name
age
获取属性:
1 /** 2 * 获取属性 3 * @throws Exception 4 */ 5 @Test 6 public void test4() throws Exception{ 7 SAXReader saxReader = new SAXReader(); 8 Document read = saxReader.read(new File("./src/test.xml")); 9 Element element = read.getRootElement().element("student"); 10 String attributeValue = element.attributeValue("id"); 11 System.out.println(attributeValue); 12 Attribute idattr = element.attribute("id"); 13 String name = idattr.getName(); 14 System.out.println("name:"+name+"\n"+"value:"+idattr.getValue()); 15 List<Attribute> idattrs = element.attributes(); 16 for(Attribute attribute : idattrs){ 17 System.out.println("name:"+attribute.getName()+" value:"+attribute.getValue()); 18 } 19 }
获取单标签
1 @Test 2 public void test3() throws Exception{ 3 //1.读取xml文件 4 SAXReader saxReader = new SAXReader(); 5 Document read = saxReader.read(new File("./src/test.xml")); 6 Element rootElement = read.getRootElement(); 7 /* System.out.println("rootElement:"+rootElement.getName()); 8 Element element = rootElement.element("student"); 9 System.out.println("element:"+element.getName()); 10 Iterator<Element> elemIt = rootElement.elementIterator("student"); 11 while(elemIt.hasNext()){ 12 Element next = elemIt.next(); 13 System.out.println(next.getName()); 14 }*/ 15 List<Element> elements = rootElement.elements(); 16 //list的三种遍历方式1.普通遍历2.强化for循环3.迭代器 17 //1.list的普通遍历 18 /* for(int i = 0 ;i < elements.size();i++) 19 { 20 Element element = elements.get(i); 21 System.out.println(element.getName()); 22 }*/ 23 //2.list的强化遍历 24 /* for(Element element :elements){ 25 System.out.println(element.getName()); 26 }*/ 27 //3.迭代器 28 /* Iterator<Element> it = elements.iterator(); 29 while(it.hasNext()){ 30 Element next = it.next(); 31 System.out.println(next.getName()); 32 }*/ 33 Element nameelement = read.getRootElement().element("student").element("name"); 34 System.out.println(nameelement.getName()); 35 }
获取文本
1 @Test 2 public void test5() throws Exception{ 3 SAXReader saxReader = new SAXReader(); 4 Document read = saxReader.read(new File("./src/test.xml")); 5 String text = read.getRootElement().element("student").element("name").getText(); 6 System.out.println(text); 7 }
demo:将test.xml文件中的内容封装在类中
test.xml
1 <?xml version="1.0" encoding="utf-8"?> 2 <students> 3 <student id = "001"> 4 <name>张三</name> 5 <age>20</age> 6 </student> 7 <student id = "002"> 8 <name>李四</name> 9 <age>25</age> 10 </student> 11 </students>
StudentTest.java
1 package xmlRead; 2 3 public class StudentTest { 4 public String id; 5 public String name; 6 public String age; 7 public String getId() { 8 return id; 9 } 10 public void setId(String id) { 11 this.id = id; 12 } 13 public String getName() { 14 return name; 15 } 16 public void setName(String name) { 17 this.name = name; 18 } 19 public String getAge() { 20 return age; 21 } 22 public void setAge(String age) { 23 this.age = age; 24 } 25 26 @Override 27 public String toString() { 28 return "id:"+this.id +" name:"+this.name+" age:"+this.age; 29 } 30 }
readStudent类
1 public class ReadStudent { 2 public static void main(String[] args) throws Exception { 3 SAXReader saxReader = new SAXReader(); 4 Document doc = saxReader.read(new File("./src/test.xml")); 5 Element rootElement = doc.getRootElement(); 6 Iterator<Element> eleIt = rootElement.elementIterator(); 7 while (eleIt.hasNext()) { 8 Element element = eleIt.next(); 9 StudentTest student = new StudentTest(); 10 student.setId(element.attributeValue("id")); 11 student.setName(element.elementText("name")); 12 student.setAge(element.elementText("age")); 13 System.out.println(student.toString()); 14 } 15 } 16 }
输出结果:
id:001 name:张三 age:20
id:002 name:李四 age:25
读取一个完整的test.xml文件(仅读内容)
1 /** 2 * 读取一个完整的xml文件。 3 * @author ihome 4 * 5 */ 6 public class readXMl { 7 @Test 8 public void test() throws Exception{ 9 SAXReader saxReader = new SAXReader(); 10 Document read = saxReader.read(new File("./src/test.xml")); 11 Element rootElement = read.getRootElement(); 12 StringBuffer sBuffer = new StringBuffer(); 13 getElementCild(rootElement,sBuffer); 14 System.out.println(sBuffer.toString()); 15 } 16 private void getElementCild(Element element,StringBuffer sBuffer){ 17 sBuffer.append("<"+element.getName()); 18 List<Attribute> attributes = element.attributes(); 19 for(Attribute attribute:attributes){ 20 sBuffer.append(" "+attribute.getName()+" = "+attribute.getValue()); 21 } 22 sBuffer.append(">"); 23 sBuffer.append(element.getText()); 24 Iterator<Element> eleIt = element.elementIterator(); 25 while(eleIt.hasNext()){ 26 Element next = eleIt.next(); 27 getElementCild(next,sBuffer); 28 } 29 sBuffer.append("</"+element.getName()+">"); 30 } 31 }