解析xml dom sax

本文介绍如何使用DOM和SAX两种方式解析XML文件,并演示了如何通过Java实现XML文件的读写、节点的添加与修改等常见操作。

XML

student.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?><exam>
	<student examid="222" idcard="111">
		<name>张三</name>
		<location>沈阳</location>
		<grade>89</grade>
	</student>

	<student examid="444" idcard="333">
		<name>李四</name>
		<location>大连</location>
		<grade>97</grade>
	</student>

	
</exam>


 

 

 

dom

DomXmlAdmin.java

package com.dwt1220;

import java.io.FileOutputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
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;

public class DomXmlAdmin {
	public static void main(String[] args) throws Exception {
		/**************************** 创建Document类 *********************************************/
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		Document document = builder.parse("./src/student.xml");

		
		
		
///**************************** 添加student节点*********************************************/
//		 /**
//		 * ①创建节点
//		 * ②设置节点的值(包括属性)
//		 * ③获得节点插入的位置
//		 * ④插入节点
//		 * ⑤更新文件
//		 */
//		 /** ①创建节点 */
//		 /************ 创建student节点 **********/
//		 Element studentElement = document.createElement("student");
//		 /************ 创建name,location,grade节点 **********/
//		 Element nameElement = document.createElement("name");
//		 Element locationElement = document.createElement("location");
//		 Element gradeElement = document.createElement("grade");
//		 /** ②设置节点的值(包括属性) */
//		 /************ 设置name,location,grade节点的值 ******/
//		 nameElement.setTextContent("nameValue");
//		 locationElement.setTextContent("locationValue");
//		 gradeElement.setTextContent("gradeValue");
//		 /************ 设置student节点的属性 *******/
//		 studentElement.setAttribute("examid", "value");
//		 studentElement.setAttribute("idcard", "value");
//		 /** ③获得节点插入的位置 */
//		 /************ 获得XML的根节点 ******/
//		 Node rootNode = document.getElementsByTagName("exam").item(0);
//		 /** ④插入节点 */
//		 /************ 把student节点添加到根节点下 ******/
//		 rootNode.appendChild(studentElement);
//		 /************ 把name,locationt,gradet节点添加到student节点下 ******/
//		 studentElement.appendChild(nameElement);
//		 studentElement.appendChild(locationElement);
//		 studentElement.appendChild(gradeElement);
//		 /** ⑤更新文件 */
//		 TransformerFactory transformerFactory = TransformerFactory
//		 .newInstance();
//		 Transformer tf = transformerFactory.newTransformer();
//		 tf.transform(new DOMSource(document), new StreamResult(
//		 new FileOutputStream("./src/student.xml")));

		
		
		
		
		
///**************************** 修改name节点*********************************************/
//		 
//		/**
//		 * 把name值为nameValue修改成newValue
//		 *  ① 获得name节点的list 
//		 *  ②查找内容相符的name节点 
//		 *  ③修改节点内容
//		 *  ④更新文件
//		 */
//		 String updataValue = "nameValue";
//		 String newValue = "newValue";
//		
//		 /************ ① 获得需要修改的节点 **************/
//		 NodeList nameNodeList = document.getElementsByTagName("name");
//		
//		 /************ ②查找内容相符的节点 **************/
//		 for (int i = 0; i < nameNodeList.getLength(); i++) {
//		
//		 /************ ③修改节点内容 **************/
//		 if (updataValue.equals(nameNodeList.item(i).getTextContent())) {
//		 nameNodeList.item(i).setTextContent(newValue);
//		 }
//		 }
//		
//		 /** ④更新文件 */
//		 TransformerFactory transformerFactory = TransformerFactory
//		 .newInstance();
//		 Transformer tf = transformerFactory.newTransformer();
//		 tf.transform(new DOMSource(document), new StreamResult(
//		 new FileOutputStream("./src/student.xml")));

		
		
		
		
///***************************** 删除节点or替换节点****************************/
//
//		/***
//		 * 把name值为nameValue的Student节点删除 ① 获得name节点的list ②查找内容相符的name节点
//		 * ③获得name的Student父节点, 从Student的父节点删除student ④更新文件
//		 */
//		String delaValue = "nameValue";
//
//		/************ ① 获得name节点的list **************/
//		NodeList nameNodeList = document.getElementsByTagName("name");
//
//		/************ ②查找内容相符的name节点 **************/
//		for (int i = 0; i < nameNodeList.getLength(); i++) {
//			if (delaValue.equals(nameNodeList.item(i).getTextContent())) {
//				/************* ③获得name的Student父节点,从Student的父节点删除student**************/
//				nameNodeList.item(i).getParentNode().getParentNode().removeChild(nameNodeList.item(i).getParentNode());
//				/******* 如果要替换节点用.replaceChild(newChild, oldChild)方法 ************/
//			}
//		}
//
//		/** ④更新文件 */
//		TransformerFactory transformerFactory = TransformerFactory
//				.newInstance();
//		Transformer tf = transformerFactory.newTransformer();
//		tf.transform(new DOMSource(document), new StreamResult(
//				new FileOutputStream("./src/student.xml")));
		
		
		
		
		/************** 解析xml ************************/
		/**** 获得根节点 *****/
		Element rootElement = document.getDocumentElement();
		/**** 获得所有student节点 ****/
		NodeList studentNodeList = rootElement.getElementsByTagName("student");

		/**** 打印student的节点名,和值 ****/
		for (int i = 0; i < studentNodeList.getLength(); i++) {
			
			/**** 获得所有student下的所有子节点 ****/
			NodeList studentChildNodeList = studentNodeList.item(i)
					.getChildNodes();

			/**** 打印student下的所有字节点的,节点名 和值 ※回车算一个字text节点 ****/
			for (int j = 0; j < studentChildNodeList.getLength(); j++) {
				System.out.println(studentChildNodeList.item(j).getNodeName()
						+ "  " + studentChildNodeList.item(j).getTextContent());
			}

		}

	}
}


 

 

 

 


sax

SAXXmladmin.java

package com.dwt1220;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

public class SAXXmladmin extends DefaultHandler {
	public static void main(String[] args) throws Exception {
		/**
		 * 1.创建解析工厂 SAXParserFactory 2.得到解析器 SAXParser 3.得到读取器 XMLReader
		 * 4.设置内容处理 xMLReader.setContentHandler(handler)
		 * 传入一个继承了ContentHandler,并重写了其中方法的类 (一般继承实现了ContentHandler,
		 * DefaultHandler类) 5.读取xml文档内容
		 */

		/******************** 1.创建解析工厂 *************************/
		SAXParserFactory factory = SAXParserFactory.newInstance();
		/******************** 2.得到解析器 *************************/
		SAXParser sp = factory.newSAXParser();
		/******************** 3.得到读取器 *************************/
		XMLReader reader = sp.getXMLReader();
		/******ListHandler得到xml文档所有内容
		 * TagValueHandler得到xml文档指定内容 *************************/
		ContentHandler handler = new TagValueHandler();
		/******************** 4.设置内容处理 *************************/
		reader.setContentHandler(handler);
		/******************** 5.读取xml文档内容 *************************/
		reader.parse("src/student.xml");
	}
}

/******* 得到xml文档所有内容 ************/
class ListHandler extends DefaultHandler {

	@Override
	public void startDocument() throws SAXException {
		System.out.println("startDocument");
	}

	@Override
	public void endDocument() throws SAXException {
		System.out.println("endDocument");
	}

	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		/**
		 * uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。 localName -
		 * 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。 qName-标签名 attributes-属性,
		 * attributes.getQName(i)提前属性名 etValue(i)提取属性值
		 */
		System.out.print("<" + qName + "  ");
		for (int i = 0; attributes != null && i < attributes.getLength(); i++) {
			System.out.print(attributes.getQName(i) + "=\""
					+ attributes.getValue(i) + "\"  ");
		}
		System.out.println(">");

	}

	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		System.out.println("</" + qName + ">");
	}

	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		/**
		 * ch - 字符 start - 字符数组中的开始位置 length - 从字符数组中使用的字符数。
		 */
		System.out.println(new String(ch, start, length));
	}

}

/******* 得到xml文档指定内容 ************/
class TagValueHandler extends DefaultHandler {
	private String currentTag;// 记住当前解析到的是什么标签
	private int needNumbe = 2; // 记住想获取第几个作者标签的值
	private int currentNumber=0;// 当前解析到的是第几个

	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		/**
		 * uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。 localName -
		 * 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。 qName-标签名 attributes-属性,
		 * attributes.getQName(i)提前属性名 etValue(i)提取属性值
		 */
		currentTag = qName;
		if (currentTag.equals("name")) {
			currentNumber++;
		}
	}

	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		currentTag = null;
	}

	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		/**
		 * ch - 字符 start - 字符数组中的开始位置 length - 从字符数组中使用的字符数。
		 */
		/*********("name").equals(currentTag)一定要("name")在前********************/
		if (("name").equals(currentTag) && currentNumber == needNumbe) {
			System.out.println("name:" + new String(ch, start, length));
		}
	}

}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dwt1220

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值