xml的解析一

jaxp是javase的一部分

jaxp解析器在jdk的javax.xml.parsers包里面

四个类:分别是针对dom和sax解析使用的类

dom:

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 list getLength() 得到集合的长度 item(int index)下标取到具体的值
  • getTextContent(),得到标签里面的内容
DocumentBuilderFactory: 解析器工厂,这个类也是一个抽象类,不能new,newInstance() 获取 DocumentBuilderFactory 的实例。
案例:
<?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>
package com.java.xml;

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;

public class TestJaxp {

	public static void main(String[] args) 
			throws ParserConfigurationException, SAXException, IOException, TransformerException {
//		selectAll();
//		selectSingle();
//		addSex();
//		modifySex();
//		deleteSex();
		listElements();
	}
	/**
	 * 查询所有name元素的值
	 * @throws ParserConfigurationException 
	 * @throws IOException 
	 * @throws SAXException 
	 */
	public static void selectAll() throws ParserConfigurationException, SAXException, IOException {
		/*
		 * 1.创建解析器工厂
		 * 2.根据解析器工厂创建解析器
		 * 3.解析xml返回document
		 * 4.得到所有的name元素
		 * 5.返回集合,遍历集合
		 */
		//创建解析器工厂
		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++) {
			//得到每一个name元素
			Node name1 = list.item(i);
			String s = name1.getTextContent();
			System.out.println(s);
		}
	}
	/**
	 * 查询xml第一个name元素的值
	 * @throws ParserConfigurationException 
	 * @throws IOException 
	 * @throws SAXException 
	 */
	public static void selectSingle() throws ParserConfigurationException, SAXException, IOException {
		/**
		 * 1.创建解析器工厂
		 * 2.根据解析器工厂创建解析器
		 * 3.解析xml返回document
		 * 4.得到所有的name元素
		 * 5.使用返回集合里面的方法item,根据下标获取具体的元素
		 * 6.得到具体的值,使用getTextContent()方法
		 */
		//创建解析器工厂
		DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
		//创建解析器
		DocumentBuilder builder = builderFactory.newDocumentBuilder();
		//解析xml得到document
		Document document = builder.parse("src/person.xml");
		//得到所有的name元素
		NodeList list = document.getElementsByTagName("name");
		//使用下标得到第一个name元素
		Node name1 = list.item(0);
		//取得name元素的值
		String s = name1.getTextContent();
		System.out.println(s);
	}
	/**
	 * 在第一个p1下面添加<sex>nv</sex>
	 * @throws ParserConfigurationException 
	 * @throws IOException 
	 * @throws SAXException 
	 * @throws TransformerException 
	 */
	public static void addSex() throws ParserConfigurationException, SAXException, IOException, TransformerException {
		/*
		 * 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();
		//解析xml得到document
		Document document = builder.parse("src/person.xml");
		//得到所有的p1
		NodeList list = document.getElementsByTagName("p1");
		//得到第一个p1
		Node p1 = list.item(0);
		//创建标签
		Element sex = document.createElement("sex");
		//创建文本
		Text text = document.createTextNode("nv");
		//把文本添加到sex下
		sex.appendChild(text);
		//把sex添加到p1下
		p1.appendChild(sex);
		//回写xml
		TransformerFactory transformerFactory = TransformerFactory.newInstance();
		Transformer transformer = transformerFactory.newTransformer();
		transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));
	}
	/**
	 * 修改第一个p1下面的sex内容是nan
	 * @throws ParserConfigurationException 
	 * @throws IOException 
	 * @throws SAXException 
	 * @throws TransformerException 
	 */
	public static void modifySex() throws ParserConfigurationException, SAXException, IOException, TransformerException {
		/*
		 * 1.创建解析器工厂
		 * 2.创建解析器
		 * 3.解析xml得到document
		 * 4.得到sex,使用item方法
		 * 5.修改sex中的值,使用setTextContent方法
		 * 6.回写xml
		 */
		//创建解析器工厂
		DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
		//创建解析器
		DocumentBuilder builder = builderFactory.newDocumentBuilder();
		//解析xml得到document
		Document document = builder.parse("src/person.xml");
		//得到sex
		Node sex = document.getElementsByTagName("sex").item(0);
		//修改sex中的值
		sex.setTextContent("男");
		//回写xml
		TransformerFactory transformerFactory = TransformerFactory.newInstance();
		Transformer transformer = transformerFactory.newTransformer();
		transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));
	}
	/**
	 * 删除<sex></sex>节点
	 * @throws ParserConfigurationException 
	 * @throws IOException 
	 * @throws SAXException 
	 * @throws TransformerException 
	 */
	public static void deleteSex() throws ParserConfigurationException, SAXException, IOException, TransformerException {
		/*
		 * 1.创建解析器工厂
		 * 2.根据解析器工厂创建解析器
		 * 3.解析xml得到document
		 * 4.获取sex元素
		 * 5.获取sex的父节点
		 * 6.删除使用父节点的removeChild方法
		 * 7.回写xml
		 */
		//创建解析器工厂
		DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
		//创建解析器
		DocumentBuilder builder = builderFactory.newDocumentBuilder();
		//解析xml得到document
		Document document = builder.parse("src/person.xml");
		//获取sex元素
		Node sex = document.getElementsByTagName("sex").item(0);
		//得到sex的父节点
		Node p1 = sex.getParentNode();
		//删除操作
		p1.removeChild(sex);
		//回写xml
		TransformerFactory transformerFactory = TransformerFactory.newInstance();
		Transformer transformer = transformerFactory.newTransformer();
		transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));
	}
	/**
	 * 遍历节点,把所有元素名称打印出来
	 * @throws ParserConfigurationException 
	 * @throws IOException 
	 * @throws SAXException 
	 */
	public static void listElements() throws ParserConfigurationException, SAXException, IOException {
		/*
		 * 1.创建解析器工厂
		 * 2.根据解析器工厂创建解析器
		 * 3.解析xml得到document
		 * ======使用递归=======
		 * 4.得到根节点
		 * 5.得到根节点子节点
		 * 6.得到根节点子节点的子节点
		 */
		//创建解析器工厂
		DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
		//创建解析器
		DocumentBuilder builder = builderFactory.newDocumentBuilder();
		//解析xml得到document
		Document document = builder.parse("src/person.xml");
		//编写一个方法实现遍历操作
		list(document);
	}
	/**
	 * 递归遍历的方法
	 * @param document
	 */
	public static void list(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);
			//继续得到node1的子节点
			list(node1);
		}
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值