苦尽甘来 一个月学通JavaWeb(五 XML)
夜光序言:
世界上没有快乐或痛苦;只有一种状况与另一种状况的比较,只是如此而已~~
正文:微微一笑~~累么,累就对了,但是呢,活着本来就这样
DOM4J
DOM4J概述
1 DOM4J是什么
DOM4J是针对Java开发人员专门提供的XML文档解析规范,它不同与DOM,但与DOM相似。DOM4J针对Java开发人员而设计,所以对于Java开发人员来说,使用DOM4J要比使用DOM更加方便。
DOM4J对DOM和SAX提供了支持,使用DOM4J可以把org.dom4j.document转换成org.w3c.Document,DOM4J也支持基于SAX的事件驱动处理模式。
使用者需要注意,DOM4J解析的结果是org.dom4j.Document,而不是org.w3c.Document。DOM4J与DOM一样,只是一组规范(接口与抽象类组成),底层必须要有DOM4J解析器的实现来支持。
DOM4J使用JAXP来查找SAX解析器,然后把XML文档解析为org.dom4j.Document对象。它还支持使用org.w3c.Document来转换为org.dom4j.Docment对象。
2 DOM4J中的类结构【夜光:有点帅~~】
在DOM4J中,也有Node、Document、Element等接口,结构上与DOM中的接口比较相似。但还是有很多的区别:
在DOM4J中,所有XML组成部分都是一个Node,其中Branch表示可以包含子节点的节点,例如Document和Element都是可以有子节点的,它们都是Branch的子接口。
Attribute是属性节点,CharacterData是文本节点,文本节点有三个子接口,分别是CDATA、Text、Comment。
3 DOM4J获取Document对象
使用DOM4J来加载XML文档,需要先获取SAXReader对象,然后通过SAXReader对象的read()方法来加载XML文档:
SAXReader reader = new SAXReader(); // reader.setValidation(true); 夜光 Document doc = reader.read("src/students.xml"); |
4 DOM4J保存Document对象
保存Document对象需要使用XMLWriter对象的write()方法来完成,在创建XMLWriter时还可以为其指定XML文档的格式(缩进字符串以及是否换行),这需要使用OutputFormat来指定。
doc.addDocType("students", "", "students.dtd"); OutputFormat format = new OutputFormat("\t", true); format.setEncoding("UTF-8"); XMLWriter writer = new XMLWriter(new FileWriter(xmlName), format); writer.write(doc); writer.close(); |
5 DOM4J创建Document对象
DocumentHelper类有很多的createXXX()方法,用来创建各种Node对象。
Document doc = DocumentHelper.createDocument(); |
Document操作 (*****)
1 遍历students.xml
涉及的相关方法:
- Element getRootElement():Document的方法,用来获取根元素;
- List elements():Element的方法,用来获取所有子元素;
- String attributeValue(String name):Element的方法,用来获取指定名字的属性值;
- Element element(String name):Element的方法,用来获取第一个指定名字的子元素;
- Element elementText(String name):Element的方法,用来获取第一个指定名字的子元素的文本内容。
洒脱一笑~~
生命里总有那么个人,惊艳了时光,让你念念不忘;哭红了眼眶,却还笑着原谅。
分析步骤:
- 获取Document对象;
- 获取root元素;
- 获取root所有子元素
- 遍历每个student元素;
- 打印student元素number属性;
- 打印student元素的name子元素内容;
- 打印student元素的age子元素内容;
- 打印student元素的sex子元素内容。
2 给学生元素添加<score>子元素
涉及的相关方法:
- Element addElement(String name):Element的方法,为当前元素添加指定名字子元素。返回值为新建元素对象;
- setText(String text):Element的方法,为当前元素设置文本内容。
分析步骤:
- 获取Document对象;
- 获取root对象;
- 获取root所有子元素;
- 遍历所有学生子元素;
- 创建<score>元素,为<score>添加文本内容;
- 把<score>元素添加到学生元素中。
- 保存Document对象。
3 为A添加friend属性,指定为B学号
涉及方法:
- addAttribute(String name, String value):Element的方法,为当前元素添加属性。
分析步骤:
- 获取Document对象;
- 获取root对象;
- 获取root所有子元素;
- 创建两个Element引用:AEle、BEle,赋值为null;
- 遍历所有学生子元素;
- 如果AEle和BEle都不是null,break;
- 判断当前学生元素的name子元素文本内容是A,那么把当前学生元素赋给AEle;
- 判断当前学生元素的name子元素文本内容是B,那么把当前学生元素赋给BEle。
- 判断AEle和BEle都不为null时:
- 获取BEle的number属性。
- 为AEle添加friend属性,属性值为B的number属性值。
- 保存Document对象。
4 删除number为ID_1003的学生元素
涉及方法:
- boolean remove(Element e):Element和Document的方法,移除指定子元素;
- Element getParent():获取父元素,根元素的父元素为null。
分析步骤:
- 获取Document对象;
- 获取root对象;
- 获取root所有子元素;
- 遍历所有学生子元素;
- 判断当前学生元素的number属性是否为ID_1003;
- 获取当前元素的父元素;
- 父元素中删除当前元素;
- 保存Document对象.
5 通过List<Student>生成Document并保存
涉及方法:
- DocumentHelper.createDocument():创建Document对象;
- DocumentHelper.createElement(String name):创建指定名称的Element元素。
分析步骤:
- 创建Document对象;
- 为Document添加根元素<students>;
- 循环遍历学生集合List<Student>;
- 把当前学生对象转换成Element元素;
- 把Element元素添加到根元素中;
- 保存Document对象。
把学生转换成Element步骤分析:
- 创建Element对象;
- 为Element添加number属性,值为学生的number;
- 为Element添加name子元素,文本内容为学生的name;
- 为Element添加age子元素,文本内容为学生的age;
- 为Element添加sex子元素,文本内容为学生的sex。
6 新建C学生元素,插入到B之前
涉及方法:
- int indexOf(Node node):Branch的方法,查找指定节点,在当前Branch的子节点集合中的下标位置。
分析步骤:
- 创建C学生对象;
- 通过学生对象创建C学生元素;
- 通过名称查找B元素;
- 查看B元素在其父元素中的位置;
- 获取学生子元素List;
- 将C元素插入到List中。
通过名字查找元素:
- 获取Document;
- 获取根元素;
- 获取所有学生元素;
- 遍历学生元素;
- 获取学生元素name子元素的文本内容,与指定名称比较;
- 返回当前学生元素。
7 其它方法介绍[夜光:了解即可,会用就行~~]
Node方法:
- String asXML():把当前节点转换成字符串,如果当前Node是Document,那么就会把整个XML文档返回;
- String getName():获取当前节点名字;Document的名字就是绑定的XML文档的路径;Element的名字就是元素名称;Attribute的名字就是属性名;
- Document getDocument():返回当前节点所在的Document对象;
- short getNodeType():获取当前节点的类型;
- String getNodeTypeName():获取当前节点的类型名称,例如当前节点是Document的话,那么该方法返回Document;
- String getStringValue():获取当前节点的子孙节点中所有文本内容连接成的字符串;
- String getText():获取当前节点的文本内容。如果当前节点是Text等文本节点,那么本方法返回文本内容;例如当前节点是Element,那么当前节点的内容不是子元素,而是纯文本内容,那么返回文本内容,否则返回空字符串;
- void setDocument(Document doc):给当前节点设置文档元素;
- void setParent(Element parent):给当前节点设置父元素;
- void setText(String text):给当前节点设置文本内容;
Branch方法:
- void add(Element e):添加子元素;
- void add(Node node):添加子节点;
- void add(Comment comment):添加注释;
- Element addElement(String eleName):通过名字添加子元素,返回值为子元素对象;
- void clearContent():清空所有子内容;
- List content():获取所有子内容,与获取所有子元素的区别是,<name>liSi</name>元素没有子元素,但有子内容;
- Element elementById(String id):如果元素有名为“ID”的属性,那么可以使用这个方法来查找;
- int indexOf(Node node):查找子节点在子节点列表中的下标位置;
- Node node(int index):通过下标获取子节点;
- int nodeCount():获取子节点的个数;
- Iterator nodeIterator():获取子节点列表的迭代器对象;
- boolean remove(Node node):移除指定子节点;
- boolean remove(Commont commont):移除指定注释;
- boolean remove(Element e):移除指定子元素;
- void setContent(List content) :设置子节点内容;
Document方法:
- Element getRootElement():获取根元素;
- void setRootElement():设置根元素;
- String getXmlEncoding():获取XML文档的编码;
- void setXmlEncoding():设置XML文档的编码;
Element方法:
- void add(Attribute attr):添加属性节点;
- void add(CDATA cdata):添加CDATA段节点;
- void add(Text Text):添加Text节点;
- Element addAttribute(String name, String value):添加属性,返回值为当前元素本身;
- Element addCDATA(String cdata):添加CDATA段节点;
- Element addComment(String comment):添加属性节点;
- Element addText(String text):添加Text节点;
- void appendAttributes(Element e):把参数元素e的所有属性添加到当前元素中;
- Attribute attribute(int index):获取指定下标位置上的属性对象;
- Attribute attribute(String name):通过指定属性名称获取属性对象;
- int attributeCount():获取属性个数;
- Iterator attributeIterator():获取当前元素属性集合的迭代器;
- List attributes():获取当前元素的属性集合;
- String attributeValue(String name):获取当前元素指定名称的属性值;
- Element createCopy():clone当前元素对象,但不会copy父元素。也就是说新元素没有父元素,但有子元素;
- Element element(String name):获取当前元素第一个名称为name的子元素;
- Iterator elementIterator():获取当前元素的子元素集合的迭代器;
- Iterator elementIterator(String name):获取当前元素中指定名称的子元素集合的迭代器;
- List elements():获取当前元素子元素集合;
- List elements(String name):获取当前元素指定名称的子元素集合;
- String elementText(String name):获取当前元素指定名称的第一个元素文件内容;
- String elementTextTrime(String name):同上,只是去除了无用空白;
- boolean isTextOnly():当前元素是否为纯文本内容元素;
- boolean remove(Attribute attr):移除属性;
- boolean remove(CDATA cdata):移除CDATA;
- boolean remove(Text text):移除Text。
DocumentHelper静态方法介绍:
- static Document createDocument():创建Dcoument对象;
- static Element createElement(String name):创建指定名称的元素对象;
- static Attribute createAttrbute(Element owner, String name, String value):创建属性对象;
- static Text createText(String text):创建属性对象;
- static Document parseText(String text):通过给定的字符串生成Document对象;