XML简介 jaxp解析XML dom4j解析XML
文章目录
xml的解析简介jaxp解析器DOMdom查询dom添加节点dom修改节点dom删除节点dom遍历节点的所有子节点
SAX
xml的解析简介
xml的解析方式(技术):dom 和 sax
dom解析和sax解析区别:
dom方式解析
根据xml的层级结构在内存中分配一个树形结构,把xml的标签,属性和文本都封装成对象缺点:如果文件过大,造成内存溢出优点:很方便实现增删改操作
sax方式解析
采用事件驱动,边读边解析从上到下,一行一行的解析,解析到某一个对象,返回对象名称缺点:不能实现增删改操作优点:如果文件过大,不会造成内存溢出,方便实现查询操作
想要解析xml,首先需要解析器 不同的公司和组织提供了 针对dom和sax方式的解析器,通过api方式提供
sun公司提供了针对dom和sax解析器 jaxpdom4j组织,针对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遍历节点的所有子节点
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方法