博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java解析XML之DOM解析和SAX解析(包含CDATA的问题)
阅读量:7296 次
发布时间:2019-06-30

本文共 7151 字,大约阅读时间需要 23 分钟。

  Dom解析功能强大,可增删改查,操作时会将XML文档读到内存,因此适用于小文档;

  SAX解析是从头到尾逐行逐个元素解析,修改较为不便,但适用于只读的大文档;SAX采用事件驱动的方式解析XML。如同在电影院看电影一样,从头到尾看一遍,不能回退(Dom可来来回回读取),在看电影的过程中,每遇到一个情节,都会调用大脑去接收处理这些信息。SAX也是相同的原理,每遇到一个元素节点,都会调用相应的方法来处理。在SAX的解析过程中,读取到文档开头、文档结尾,元素的开头和元素结尾都会调用相应方法,我们可以在这些方法中进行相应事件处理。
github项目地址: github
Students.xml

小明
20
篮球
小红
21
篮球
小蓝
23
篮球
小白
19
篮球
小林子
18
篮球
小东子
20
篮球
小左子
21
篮球
小张
22
小明
23
篮球
小明
20
篮球

DOM解析

package cn.yangtze.domtext;import java.io.IOException;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import org.w3c.dom.Document;import org.w3c.dom.NamedNodeMap;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import org.xml.sax.SAXException;public class DomPractice {
public static void main(String[] args) { // TODO Auto-generated method stub // 创建一个DocumentBuilderFactory的对象 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); // 创建一个DocumentBuilder的对象 try { // 创建DocumentBuilder对象 DocumentBuilder db = dbf.newDocumentBuilder(); // 通过DocumentBuilder对象的parser方法加载books.xml文件到当前项目下 Document document = db.parse("Students.xml"); // 获取所有Student节点的集合 NodeList StudentList = document.getElementsByTagName("Student"); // 通过nodelist的getLength()方法可以获取StudentList的长度 System.out.println("DOM解析开始..."); // 遍历每一个Student节点 for (int i = 0; i < StudentList.getLength(); i++) { System.out.println("开始解析第" + (i + 1) + "个学生"); // 通过 item(i)方法 获取一个Student节点,nodelist的索引值从0开始 Node book = StudentList.item(i); // 获取Student节点的所有属性集合 NamedNodeMap attrs = book.getAttributes(); // 遍历Student的属性 for (int j = 0; j < attrs.getLength(); j++) { // 通过item(index)方法获取Student节点的某一个属性 Node attr = attrs.item(j); // 输出学生的属性名和属性值 System.out.println(attr.getNodeName() + ":" + attr.getNodeValue()); } NodeList childNodes = book.getChildNodes(); // 遍历childNodes获取每个节点的节点名和节点值 for (int k = 0; k < childNodes.getLength(); k++) { // 区分出text类型的node以及element类型的node if (childNodes.item(k).getNodeType() == Node.ELEMENT_NODE) { // 输出子节点的属性名和属性值 System.out.println(childNodes.item(k).getNodeName() + ":" + childNodes.item(k).getFirstChild().getNodeValue()); } } } } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } System.out.println("DOM解析结束..."); }}

SAX解析

SAXParserHandler.java

package cn.yangtze.saxtext;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;public class SAXParserHandler extends DefaultHandler {
private int StudentIndex = 0; // 解析开始的标志 @Override public void startDocument() throws SAXException { System.out.println("SAX解析开始..."); } // 解析结束的标志 @Override public void endDocument() throws SAXException { System.out.println("SAX解析结束..."); } // 用来遍历XML文件的开始标签 @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // 调用DefaultHandler类的startElement方法 super.startElement(uri, localName, qName, attributes); // 开始解析Student元素节点 if (qName.equals("Student")) { ++StudentIndex; System.out.println("开始解析第" + StudentIndex + "个学生"); //输出XML属性,也就是XML文件中的num属性,注意在因使用属性而引起的一些问题: /*1 ,属性无法包含多重的值(元素可以) 2,属性无法描述树结构(元素可以) 3,属性不易扩展(为未来的变化) 4,属性难以阅读和维护 5,请尽量使用元素来描述数据。而仅仅使用属性来提供与数据无关的信息。*/ for (int i = 0; i < attributes.getLength(); ++i) { System.out.println(attributes.getQName(i) + ":" + attributes.getValue(i)); } } else if (!qName.equals("Students")) { System.out.print(qName + ":");//输出元素值 } } // 用来遍历XML文件的结束标签 @Override public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); // 判断一个学生是否解析完 if (qName.equals("Student")) { System.out.println("结束解析第" + StudentIndex + "个学生"); } } @Override public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); String text = new String(ch, start, length); if (!text.trim().equals("")) { System.out.println(text); } // if }}

SAXDemo.java

//SAX解析XMLpackage cn.yangtze.saxtext;import java.io.File;import java.io.IOException;import javax.xml.parsers.ParserConfigurationException;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.SAXException;public class SAXDemo {
public static void main(String[] args) { File file =new File("Students.xml"); try { // 通过SAXParserFactory的静态方法newInstance()方法获取SAXParserFactory实例对象factory SAXParserFactory factory = SAXParserFactory.newInstance(); // 通过SAXParserFactory实例的newSAXParser()方法返回SAXParser实例parser SAXParser saxParser = factory.newSAXParser(); // 定义SAXParserHandler对象 SAXParserHandler handler = new SAXParserHandler(); // 解析XML文档 saxParser.parse(file, handler); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }}

转载地址:http://flwnm.baihongyu.com/

你可能感兴趣的文章
jquery validate.js 不能验证
查看>>
html的异步调用
查看>>
请教Ado.Net按文本读取CSV/Txt文件时,如何禁止将内容转换成数字
查看>>
电子电路基础——电感、磁珠
查看>>
Django tutorial part2
查看>>
loj10098 分离的路径
查看>>
超级详细找CALL写CALL教程[转]
查看>>
蓝桥杯:基础练习 特殊的数字
查看>>
Cairngorm3中文简介
查看>>
数据结构练手05 关于堆的up策略和down策略实现
查看>>
python-排序算法 冒泡和快速排序
查看>>
JAVA jdbc(数据库连接池)学习笔记(转)
查看>>
c#调用webservices
查看>>
学习进度条
查看>>
CentOS 网络设置修改
查看>>
删除重复项,保留最大值
查看>>
项目开发中的一些注意事项以及技巧总结
查看>>
JDK环境配置记录
查看>>
模型的深度探究
查看>>
xml解析原理一些想法
查看>>