现在先谈下关于XML的一些概念吧 ! xml是一种通用的数据交换的格式,为实现计算机之间的文档交换而设计的文档内容编写规范,语法与HTML相似.XML的作用:统一信息的结构,实现不同系统之间的相互通信
目前许多系统的配置文件都使用XML格式,例如现在流行的SSH框架的配置文件都用的是xml的格式,配置文件就是记录应用程序的配置信息的文件。XML 是一种标记语言,通过使用标记来说明文本的意义和所代表的信息。XML 没有固定的标记,允许用户随便发明和创建自己的标记。XML文档是树形结构的。以下是xml基本语法的注意事项,下面将用个正确的例子做为参考!元素和属性:
1.XML 文档的主体由元素组成。一个XML元素由一个标记来定义,包括开始和结束标记以及其中的内容
2.没有嵌套在其他元素内的元素叫做根元素
3.若元素中没有嵌套子元素和数据,这样的元素叫做空元素
4.所有的标记都必须有结束标记或者使用空元素的结束说明
5.XML 中不允许使用标签交叉来破坏文档的结构化层次关系
6.XML标记名称区分大小写
7.XML标记名称中不能包括空格
8.可以为 XML 标签设置属性,XML中的属性也可以随便定义。一个标签可以有多个属性,每个属性都有名称和取值
9.XML 中属性值一定要用双引号或单引号引起来
例题:<?xml version="1.0" encoding="UTF-8"?>
<customers>
<customer id="101" sex="man">
<name>Tom</name>
<age>12</age>
<email>[email protected]</email>
</customer>
<customer id="102" sex="women">
<name>Jerry</name>
<age>22</age>
<email>[email protected]</email>
</customer>
</customers>
现在再来介绍下DOM4J,我初开始看到这个名词的时候,把它读成了“动物世界”,呵,其实这个读法是错误的,4只能读成four!佟老师说,这样才算专业的!不过再说DOM4J自己前先介绍下xml的四种解析技术与比较:
1.DOM:DOM 解析器把 XML 文档转化为一个包含其内容的树,并能够对树进行遍历。用 DOM 解析模型的长处是编程容易,能够很容易的添加和修改树中的元素。然而由于使用 DOM 解析器的时候需要处理整个 XML 文档,所以对性能和内存的需要比较高,尤其是碰到很大的 XML 文档的时候。
2.SAX:SAX 解析器采用了基于事件的模型(在解析 XML 文档的时候能够触发一系列的事件,当发现给定的tag的时候,他能够激活一个回调方法,告诉该方法定制的标签已找到)。因为他让程序员自己来决定所要处理的tag,所以当只需要处理文档中所包含的部分数据时,SAX 有良好的表现。但用 SAX 解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。
3.JDOM:JDOM的目的是成为 Java 特定文档模型,他简化和 XML 的交互并且比使用 DOM 实现更快。
4.DOM4J:DOM4J 是很优秀的Java XML API,具备性能优异、功能强大和极端易用使用的特点,同时他也是个开放源代码的软件。如今越来越多的 Java 软件都在使用 DOM4J 来读写 XML
以上可以看出DOM4J解析技术的巨大优势了!
Document对象相关
1.读取XML文件,获得document对象.
SAXReader reader = new SAXReader();
Document document = reader.read(new File("input.xml"));
2.解析XML形式的文本,得到document对象.
String text = "<members></members>";
Document document = DocumentHelper.parseText(text);
3.主动创建document对象.
Document document = DocumentHelper.createDocument(); //创建根节点
Element root = document.addElement("members");
节点相关
1.获取文档的根节点.
Element rootElm = document.getRootElement();
2.取得某节点的单个子节点.
//"member"是节点名
Element memberElm=root.element("member");
3.取得节点的文字
String text=memberElm.getText();
也可以:
//这个是取得根节点下的name字节点的文字.
String text=root.elementText("name");
4.取得某节点下名为"member"的所有字节点并进行遍历.
List nodes = rootElm.elements("member");
for (Iterator it = nodes.iterator(); it.hasNext();) {
Element elm = (Element) it.next();
// do something
}
5.对某节点下的所有子节点进行遍历.
for(Iterator it=root.elementIterator();it.hasNext();){
Element element = (Element) it.next();
// do something
}
6.在某节点下添加子节点.Element ageElm = newMemberElm.addElement("age");
7.设置节点文字.ageElm.setText("29");
8.删除某节点.//childElm是待删除的节点,parentElm是其父节点
parentElm.remove(childElm);
9.添加一个CDATA节点.
Element contentElm = infoElm.addElement("content");
contentElm.addCDATA(diary.getContent());
属性相关
1.取得某节点下的某属性 Element root=document.getRootElement(); //属性名name
Attribute attribute=root.attribute("size");
2.取得属性的文字 String text=attribute.getText();
也可以://这个是取得根节点下name字节点的属性firstname的值.
String text2=root.element("name").attributeValue("firstname");
3.遍历某节点的所有属性 Element root=document.getRootElement();
for(Iterator it=root.attributeIterator();
it.hasNext();){
Attribute attribute = (Attribute) it.next();
String text=attribute.getText();
System.out.println(text); }
4.设置某节点的属性和文字. newMemberElm.addAttribute("name", "sitinspring");
5.设置属性的文字. Attribute attribute=root.attribute("name");
attribute.setText("sitinspring");
6.删除某属性 //属性名name
Attribute attribute=root.attribute("size"); root.remove(attribute);
将文档写入XML文件
1.文档中全为英文,不设置编码,直接写入的形式.
XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));
writer.write(document);
writer.close();
2.文档中含有中文,设置编码格式写入的形式.OutputFormat format = OutputFormat.createPrettyPrint();// 指定XML编码
format.setEncoding("GBK");
XMLWriter writer = new XMLWriter(newFileWriter("output.xml"),format);
writer.write(document);
writer.close();
现在就Dom4j解析xml的一些语法做出例子分析;先通过写一个类将上篇的xml文件解析出来。 package cn.itcast.dom4j;
import java.io.File;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
//1. 将 dom4j.jar 文件加入到当前 Java 工程的 classPath 下
public class HelloDom4j {
public static void main(String[] args) throws DocumentException {
//2. 在 Dom4j 中, xml 文档对应 Document 对象
//a. 得到 xml 文档代表的 Document 对象
Document document = null;
File file = null;
file = new File("customers.xml");
SAXReader reader = new SAXReader();
document = reader.read(file);
//System.out.println(document);
//b. 得到 xml 文档的根元素
Element root = ()document.getRootElement;
String rootName = root.getName();
//System.out.println("rootName: " + rootName);
System.out.println("<" + rootName + ">");
//c. 得到根结点的所有子节点
List<Element> rootChildren = null;
rootChildren = root.elements();
//System.out.println("rootChildren.size: " + rootChildren.size());
//d. 对所有的子节点进行遍历
for(int i = 0; i < rootChildren.size(); i++){
Element customerEle = rootChildren.get(i);
//System.out.println(customerEle.getName());
System.out.println("\t<" + customerEle.getName() + ">");
Iterator<Element> it = customerEle.elementIterator();
while(it.hasNext()){
Element ele = it.next();
//System.out.println(ele.getName());
//得到元素的名字
String eleName = ele.getName();
//得到元素的文本值
String eleText = ele.getText();
System.out.println("\t\t<" + eleName + ">" +
eleText +
"</" + eleName + ">");
}
System.out.println("\t</" + customerEle.getName() + ">");
}
System.out.println("</" + rootName + ">");
}
}
最后运行的结果也就是上篇的xml文档。体会:在这个类中,我们不难发现,在解析文档的时候是根据xml的树结构进行解析的,而不是杂乱的。这个类中的四 个步骤将是以后的增,改,删的基本步骤!其实能够深刻的理解这一思想,我们也就不难理解Dom4j解析xml的真正原理,在以后的WEB开发中用起来会如 鱼的水!
现在再看下增加属性值及文本值的一个例子:
package cn.itcast.dom4j;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
//任务:为 customers.xml 文档的 id = 102 的 Customer 节点添加一个 address 子节点<address>Shanghai</address>
public class InsertElement {
public static void main(String[] args) throws DocumentException, IOException {
// TODO Auto-generated method stub
//1. 得到 customers.xml 代表的 Document 对象
SAXReader reader = null;
File file = null;
Document document = null;
reader = new SAXReader();
file = new File("customers.xml");
document = reader.read(file);
//2. 得到 id = 102 的 Customer 节点
Element custEle = null;
List<Attribute> idAttrs = document.selectNodes("//customers/customer/@id ");
for(int i = 0; i < idAttrs.size(); i++){
String idValue = idAttrs.get(i).getValue();
if(idValue != null && idValue.equals("102")){
custEle = idAttrs.get(i).getParent();
}
}
System.out.println(custEle);
//3. 为 custEle 添加一个子节点: <address></address>
Element address = custEle.addElement("address");
//4. 设置该节点的文本值
address.setText("Shanghai");
//4.1 设置子节点的属性
address.addAttribute("id", "021");
//5. 把更新后的 Document 对象写入到 customers.xml 文件中
//5.1设置输出方式, 获取 OutputFormat 对象
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("GB2312");
//5.2 获取 XMLWriter 对象
XMLWriter writer = new XMLWriter(new FileWriter( "customers.xml" ), format);
//5.2 写入到文件中
writer.write(document);
//5.4 关闭 io 流
writer.close();
}
}