什么是XML文件?
XML文件叫做可扩展标签化语言,据说是为了取代HTML而产生的,从我们可以在XML中配合CSS样式来完成基本界面框架可以看出来还是有那么点意思。XML在语法和html语法差别不大,但是比HTML语法要严谨许多,可能没HTML那么灵活。当然啦,从HTML现在的广泛程度来看,XML可能没有完成取代HTML的任务,所以它常常用来做以下任务:
1.写配置文件用
2.一个小型的“数据库”
什么是DOM解析?
DOM:文件对象编程
BOM: 浏览器对象编程
XML文件的解析方式?
1.DOM解析:
JAXP,JDOM工具,以及dom4j工具(流传最广)
2.SAX解析
怎么解析?
我们可以发现XML文件是只有一个根标签但是却可以拥有无数个子标签的,就类似于树的结构,所以我们可以将XML文档解析成Document对象(在dom4j中有这个类),然后通过Document对象可以得到其下面的其他节点对象,通过节点对象访问xml文档的内容(标签,属性,内容,注释)。
DOM解析原理:
xml解释器一次性把整个xml文件加载进内存,然后在内存中构造一棵Document的对象树,通过Document对象得到树上的节点对象,通过节点对象访问(或者操作)xml文档的内容。
如何解析XML文件?
在eclipse中导入dom4j的jar包
(1)将xml文件解析成Document对象:
package cn.weilylab.dom4j_test;
import java.io.File;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
public class ReadXML {
public static void main(String[] args) {
//1.创建一个xml解析器
SAXReader reader=new SAXReader();
try {
//读取这个文件对象
Document doc =reader.read(new File("./src/test.xml"));
System.out.println(doc);
} catch (DocumentException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
(2)如何获得xml的每个标签?
package cn.weilylab.dom4j_test;
/*
这个实例用了两种方式来输出xml中的节点,其中因为只有标签节点中才有子节点
方法1:使用迭代器遍历遍历每个节点判断是否是element然后输出这个element的名字
方法2:先得到根标签,在递归中使用迭代器来遍历节点但是选择了使用了递归的方式来输出每一层的节点
*/
import java.io.File;
import java.util.Iterator;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.jupiter.api.Test;
public class ReadXMLdetails{
@Test
public void test1() throws Exception{
SAXReader reader=new SAXReader();
Document doc =reader.read(new File("./src/test.xml"));
Iterator<Node> it= doc.nodeIterator();
while(it.hasNext()) {
Node node=it.next();
String name=node.getName();
System.out.println(name);
if(node instanceof Element) {
Element elem=(Element)node;
Iterator<Node> it2=elem.nodeIterator();
while(it2.hasNext()) {
Node node2=it2.next();
System.out.println(node2.getName());
}
}
}
}
/**
* 遍历文档中所有子节点
*/
@Test
public void test2() throws Exception{
SAXReader reader=new SAXReader();
Document doc=reader.read(new File("./src/test.xml"));
//得到根标签
Element rootElme=doc.getRootElement();
getChildNodes(rootElme);
}
private void getChildNodes(Element elem) {
System.out.println(elem.getName());
//得到子节点
Iterator<Node> it =elem.nodeIterator();
while(it.hasNext()) {
Node node =it.next();
if(node instanceof Element) {
Element el=(Element)node;
//递归
getChildNodes(el);
}
}
}
}
当然在dom4j中有很多的接口。针对于节点,标签,属性,文本都有不同的方法,类似于上面的方法一样,所以可以做到在Java中完全地将配置文件读取出来,相当于一模一样的读取一份出来。鉴于这一块在目前而言不是重点,所以在此不做深究。