xml的解析简介
xml的解析方式(技术):dom 和 sax
dom解析和sax解析区别:
-
dom方式解析
- 根据xml的层级结构在内存中分配一个树形结构,
- 把xml的标签,属性和文本都封装成对象
- 缺点:如果文件过大,造成内存溢出
- 优点:很方便实现增删改操作
-
sax方式解析
- 采用事件驱动,边读边解析
- 从上到下,一行一行的解析,解析到某一个对象,返回对象名称
- 缺点:不能实现增删改操作
- 优点:如果文件过大,不会造成内存溢出,方便实现查询操作
想要解析xml,首先需要解析器
不同的公司和组织提供了 针对dom和sax方式的解析器,通过api方式提供
- sun公司提供了针对dom和sax解析器 jaxp
- dom4j组织,针对dom和sax解析器 dom4j (最多使用)
- jdom组织,针对dom和sax解析器 jdom (基本没人用)
jaxp解析器
jaxp是javase的一部分, jaxp解析器在jdk的javax.xml.parsers包里面
四个类:分别是针对dom和sax解析使用的类
dom: DocumentBuilder、DocumentBuilderFactory
sax: SAXParser 、 SAXParserFactory
DOM
*** dom: DocumentBuilder、DocumentBuilderFactory
DocumentBuilder : dom解析器类
- 这个类是一个抽象类,不能new,
此类的实例可以从 DocumentBuilderFactory.newDocumentBuilder() 方法获取
- 一个方法,可以解析xml parse("xml路径") 返回是 Document 整个文档
- 返回的document是一个接口,父节点是Node,如果在document里面找不到想要的方法,到Node里面去找
DocumentBuilderFactory: dom 解析器工厂
- 这个类也是一个抽象类,不能new
newInstance() 获取 DocumentBuilderFactory 的实例。
dom操作步骤
1、创建解析器工厂
DocumentBuilderFactory.newInstance();
2、根据解析器工厂创建解析器
builderFactory.newDocumentBuilder();
3、解析xml返回document
Document document = builder.parse("src/person.xml");
4、根据document的方法进行其他操作
--------- 在document里面方法 ---------
getElementsByTagName(String tagname)
-- 这个方法可以得到标签
-- 返回集合 NodeList
createElement(String tagName)
-- 创建标签
createTextNode(String data)
-- 创建文本
appendChild(Node newChild)
-- 把文本添加到标签下面
removeChild(Node oldChild)
-- 删除节点
getParentNode()
-- 获取父节点
NodeList list
- getLength() 得到集合的长度
- item(int index)下标取到具体的值
for(int i=0;i<list.getLength();i++) {
list.item(i)
}
getTextContent()
- 得到标签里面的内容
dom查询
dom添加节点
dom修改节点
dom删除节点
dom遍历节点的所有子节点
//遍历并缩进输出一个xml结点的所有子节点:
public static void printDocument(Node node) {
int n = 0;
if (node.getNodeType() == Node.ELEMENT_NODE) {
System.out.println(node.getNodeName());
}
NodeList list = node.getChildNodes();
n++;
for (int i = 0; i < list.getLength(); i++) {
printDocument(list.item(i),n);
}
}
public static void printDocument(Node node,int n) {
if (node.getNodeType() == Node.ELEMENT_NODE) {
for (int i = 0; i < n; i++) {
System.out.print(" ");
}
System.out.println(node.getNodeName());
}
NodeList list = node.getChildNodes();
n++;
for (int i = 0; i < list.getLength(); i++) {
printDocument(list.item(i),n);
}
}
SAX
*** sax:SAXParser、SAXParserFactory
SAXParser:sax解析器类
此类的实例可以从 SAXParserFactory.newSAXParser() 方法获得
- parse(File f, DefaultHandler dh)
* 两个参数
** 第一个参数:xml的路径
** 事件处理器
SAXParserFactory: 解析器工厂
实例 newInstance() 方法得到
sax执行过程
* 当解析到开始标签时候,自动执行startElement方法
* 当解析到文本时候,自动执行characters方法
* 当解析到结束标签时候,自动执行endElement方法