一、JAXP简单介绍
jaxp是javaSE的一部分,它的解析器在JDK的javax.xml.parsers包里面。
四个类:分别是针对dom和sax解析使用的类
dom:
DocumentBuilder:解析器类
这是一个抽象类,不能new。此类的实例可以从DocumentBuderFactory.newDocumentBuilder()方法获取。包含一个方法,可以解析xml(parse("xml路径");)返回类型为Document。因为返回的Document是一个接口,Document父节点是Node,所以在Document里面找不到想要的方法,可以到Node里面去找。
DocumentBuderFactory:解析器工厂
抽象类,不能newInstance方法获取。
sax:
SAXParser:解析器类
SAXParserFactory:解析器工厂
一、JAXP使用实例
此次实例使用的xml文件为:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><person>
<p1>
<name>张三</name>
<age>20</age>
</p1>
<p1>
<name>李四</name>
<age>30</age>
</p1>
</person>
使用JAXP查询节点
代码(操作过程均详细描述)
public class Testjaxp {
public static void main(String[] args) throws Exception {
selectAll();
}
private static void selectAll() throws ParserConfigurationException, SAXException, IOException {
// 查询所有name元素的值
/*
* 1、创建解析器工厂
* 2、根据解析器工厂创建解析器
* 3、解析xml返回document
*/
// 1、创建解析器工厂
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
// 2、根据解析器工厂创建解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();
// 3、解析xml放回document
Document document = builder.parse("./WebContent/person.xml");
// 得到name元素
NodeList list = document.getElementsByTagName("name");
// 遍历集合
for (int i = 0; i < list.getLength(); i++) {
Node name1 = list.item(i);
// 得到标签里的内容
String s = name1.getTextContent();
System.out.println(s);
}
}
}
操作结果
使用JAXP查询节点
代码
public class Testjaxp {
public static void main(String[] args) throws Exception {
selectSingle();
}
private static void selectSingle() throws ParserConfigurationException, SAXException, IOException {
// 查询xml中第一个name元素的值
/*
* 1、创建解析器工厂 2、根据解析器工厂创建解析器 3、解析xml放回document
*
* 4、得到所有的name元素 5、使用返回集合,里面方法item下标获取具体的元素 6、得到具体的值,使用getTextContent
*/
// 1、创建解析器工厂
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
// 2、根据解析器工厂创建解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();
// 3、解析xml放回document
Document document = builder.parse("./WebContent/person.xml");
// 4、得到name元素
NodeList list = document.getElementsByTagName("name");
// 5、得到第一个元素
Node name1 = list.item(0);
String s = name1.getTextContent();
System.out.println("第一个name元素值为:" + s);
}
}
操作结果
使用JAXP查添加节点
代码
public class Testjaxp {
public static void main(String[] args) throws Exception {
updateNode();
}
private static void updateNode() throws Exception {
//在第一个p1下面(末尾)添加<sex></sex>
/*
* 1、创建解析器工厂
* 2、根据解析器工厂创建解析器
* 3、解析xml放回document
* 4、得到所有的p1,然后得到第一个p1,使用item方法下标得到
* 5、创建sex标签createElement
* 6、创建文本createTextNode
* 7、把文本添加到sex下面appendChild
* 8、把sex添加到第一个p1下面
* 9、回写xml(重要!!!)
*/
// 1、创建解析器工厂
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
// 2、根据解析器工厂创建解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();
// 3、解析xml放回document
Document document = builder.parse("./WebContent/person.xml");
//得到所有的p1
NodeList list = document.getElementsByTagName("p1");
// 5、得到第一个元素
Node p1 = list.item(0);
//6、创建标签
Element sex1=document.createElement("sex");
//7、创建文本
Text text1=document.createTextNode("nv");
//8、把文本添加到sex1下面
sex1.appendChild(text1);
p1.appendChild(sex1);
//9、回写xml
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer=transformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("./WebContent/person.xml"));
}
}
操作结果
使用JAXP修改节点
代码
public class Testjaxp {
public static void main(String[] args) throws Exception {
updateNode();
}
public static void updateNode() throws Exception {
// 1、创建解析器工厂
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
// 2、根据解析器工厂创建解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();
// 3、解析xml放回document
Document document = builder.parse("./WebContent/person.xml");
// 4、得到sex item方法
NodeList list = document.getElementsByTagName("sex");
Node sex1 = list.item(0);
sex1.setTextContent("male");
// 5、回写xml
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("./WebContent/person.xml"));
System.out.println("执行完成!!!");
}
}
操作结果
使用JAXP删除节点
代码
public class Testjaxp {
public static void main(String[] args) throws Exception {
deleteNode();
}
private static void deleteNode()throws Exception{
// 1、创建解析器工厂
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
// 2、根据解析器工厂创建解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();
// 3、解析xml放回document
Document document = builder.parse("./WebContent/person.xml");
// 4、得到sex item方法
Node sex1 = document.getElementsByTagName("sex").item(0);
// 5、 获取sex的父节点
Node p1 =sex1.getParentNode();
// 6、 删除使用父节点删除 removeChild方法
p1.removeChild(sex1);
// 7、回写xml
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("./WebContent/person.xml"));
System.out.println("执行完成!!!");
}
}
操作结果
使用JAXP遍历节点
代码
public class Testjaxp {
public static void main(String[] args) throws Exception {
listElement();
}
// 遍历节点把xml所有元素的名称打印出来
private static void listElement() throws Exception {
// TODO Auto-generated method stub
// 1、创建解析器工厂
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
// 2、根据解析器工厂创建解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();
// 3、解析xml放回document
Document document = builder.parse("./WebContent/person.xml");
// 4、得到根结点
list1(document);
// 5、 得到根节点子节点
// 6、 得到根节点的子节点
}
private static void list1(Node node) {
// 判断是元素类型时候才打印
if (node.getNodeType() == node.ELEMENT_NODE) {
System.out.println(node.getNodeName());
}
// 得到一层子节点
NodeList list = node.getChildNodes();
// 遍历
for (int i = 0; i < list.getLength(); i++) {
//得到每一个节点
Node node1 = list.item(i);
list1(node1);
}
}
}
操作结果
最后,需要导的包如下:
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;