目录
Jaxp解析器
- Jaxp解析器在jdk的
javax.xml.parsers
包内- 四个类: 分别针对DOM和SAX解析的类
- DOM:
DocumentBuilder
解析器类DocumentBuilderFactory
解析器工厂类
- SAX:
SAXParser
解析器类SAXParserFactory
解析器工厂类
DOM解析XML
-
DocumentBuilder
- 这是一个抽象类,不能new
- 这个类的实例可以从
DocumentBuilderFactory.newDocumentBuilder()
方法获取 - 解析xml使用
parse("xml文件路径")
方法, 返回Document整个文档, document是一个接口,父节点是Node,如果在document接口中找不到的方法,可以在Node接口中找. - document的方法
getElementsByTagName(String tagname)
返回一个标签集合 NodeList
createElement(String tagName)
创建一个标签
createTextNode(String data)
创建文本
appendChild(Node newChild)
把节点添加到标签下
removeChild(Node oldChild)
删除节点
getParentNode()
获取父节点 - NodeList的方法
getLength()
得到集合的长度
item(int index)
下表取到具体的值
getTextContent()
得到标签里的内容
-
DocumentBuilderFactory
- 抽象类
- 通过
newInstance()
获取DocumentBuilderFactory的实例.
Jaxp查询操作
// 查询所有name元素的值
private static void selectAll() throws Exception {
// 查询所有name元素的值
/*
* 1. 创建解析器工程
* 2. 根据解析器工厂创建解析器
* 3. 解析xml返回document
*
* */
// 创建解析器工厂
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
// 创建解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();
// 解析xml返回document
Document document = builder.parse("src/person.xml");
// 得到name元素
NodeList list = document.getElementsByTagName("name");
// 遍历集合
for (int i = 0; i < list.getLength(); i++) {
Node name1 = list.item(i);
// 得到name元素里面的值
String string = name1.getTextContent();
System.out.println(string);
}
}
Jaxp添加节点操作
// 在第一个p1下添加一个sex节点
public static void addSex() throws Exception{
/*
* 1. 创建解析器工程
* 2. 根据解析器工厂创建解析器
* 3. 解析xml返回document
* 4. 得到第一个p1, 得到所有的p1,通过item下标获取
* 5. 创建sex标签 createElement
* 6. 创建文本 createTextNode
* 7. 把文本添加到sex下面appendChild
* 8. 把sex添加到第一个p1下面
* 9. 回写xml操作
* */
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = builderFactory.newDocumentBuilder();
Document document = builder.parse("src/person.xml");
NodeList list = document.getElementsByTagName("p1");
Node pNode = list.item(0);
// 创建sex标签
Element sexElement = document.createElement("sex");
// 创建文本
Text textElemenText = document.createTextNode("nv");
// 把文本添加到sexElement下面
sexElement.appendChild(textElemenText);
// 把sexElement添加到p1下面
pNode.appendChild(sexElement);
// 回写xml
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));
}
Jaxp修改节点内容
// 修改sex节点的内容
public static void modifySex() throws Exception{
/*
* 1. 创建解析器工程
* 2. 根据解析器工厂创建解析器
* 3. 解析xml返回document
* 4. 得到sex item方法
* 5. 修改sex里面的值 sexTextContent方法
* 6. 回写xml操作
* */
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = builderFactory.newDocumentBuilder();
Document document = builder.parse("src/person.xml");
Node sex = document.getElementsByTagName("sex").item(0);
// 修改sex值
sex.setTextContent("nan");
// 回写xml
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));
}
Jaxp删除节点
// 删除sex节点
public static void deleteSex() throws Exception{
/*
* 1. 创建解析器工程
* 2. 根据解析器工厂创建解析器
* 3. 解析xml返回document
* 4. 得到sex元素
* 5. 获取sex的父节点 使用getParentNode方法
* 6. 使用父节点来删除sex节点, 使用removeChild方法
* 6. 回写xml操作
* */
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = builderFactory.newDocumentBuilder();
Document document = builder.parse("src/person.xml");
Node sex = document.getElementsByTagName("sex").item(0);
Node sexParentNode = sex.getParentNode();
sexParentNode.removeChild(sex);
// 回写xml
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));
}
遍历xml中的所有节点
// 遍历xml中的所有节点
public static void bianliList() throws Exception{
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = builderFactory.newDocumentBuilder();
Document document = builder.parse("src/person.xml");
list1(document);
}
// 递归操作
public static void list1(Node node) {
// 判断是元素类型才打印
if (node.getNodeType() == Node.ELEMENT_NODE) {
System.out.println(node.getNodeName());
}
// 得到一层子节点
NodeList list = node.getChildNodes();
// 遍历list
for (int i = 0; i < list.getLength(); i++) {
// 得到每一个节点
Node node1 = list.item(i);
// 递归操作
list1(node1);
}
}
SAX解析XML
- SAXParser
- 此类的实例可以从
SAXParserFactory.newSAXParse()
方法获取 - 解析xml使用
parse(File f, DefaultHandler dh)
arg1: xml路径 arg2: 事件处理器
- 此类的实例可以从
- SAXParserFactory
newInstance()
方法得到
- DefaultHandler
- void
startElement
(String uri, String localName, String qName, Attributes attributes) 接收元素开始的通知。qName
返回标签名称. - void
characters
(char[] ch, int start, int length) 接收元素内的字符数据通知。 - void
endElement
(String uri, String localName, String qName) 接收元素结尾的通知。
- void
- 当解析到开始标签的时候, 自动执行startElement方法
- 当解析到文本的时候, 自动执行characters方法
- 当解析到结束标签时候, 自动执行endElement方法
Demo
跳转到目录
TestSax.java
public class TestSax {
public static void main(String[] args) throws Exception{
/*
* 1. 创建解析器工厂
* 2. 创建解析器
* 3. 执行parse方法
* 4. 自己创建一个类, 继承DefaultHandler
* 5 重写类中的三个方法
*
* */
// 创建解析器工厂
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
// 创建解析器
SAXParser saxParser = saxParserFactory.newSAXParser();
// 执行parse方法
saxParser.parse("src/zy.xml", new MyDefaultHandler());
}
}
MyDefaultHandler.java
package com.sunny.jaxptest;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class MyDefaultHandler extends DefaultHandler{
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.out.print("<"+qName+">");
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
System.out.print(new String(ch, start, length));
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.print("</"+qName+">");
}
}