四种解析和创建方式(DOM,SAX,DOM4J,JDOM)
一、先导入jar包
DOM基于树形,SAX基于事件,DOM4J和JDOM基于底层API
二、代码如下
1 package com.sxt.test; import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; import javax.naming.spi.DirStateFactory.Result;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.sax.TransformerHandler;
import javax.xml.transform.stream.StreamResult; import org.dom4j.DocumentException;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.jdom2.Attribute;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl; import com.sxt.bean.Book;
import com.sxt.bean.SAXParserHandler; public class Demo1 { private ArrayList<Book> booksList = new ArrayList<Book>(); /*
* DOM解析
*/
@Test
public void testfun1() throws ParserConfigurationException, SAXException,
IOException {
// 创建DocumentBuilderFactory对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// 创建DocumentBuilder对象
DocumentBuilder db = dbf.newDocumentBuilder();
// 通过DocumentBuilder对象的parser方法加载books.xml文件到当前的目录下
Document document = db.parse("src/com/sxt/test/bookes.xml");
// 获取所有的book节点集合
NodeList bookList = document.getElementsByTagName("book");
// 通过nodelist的getLength()方法可以获取bookList的长度
System.out.println("一共有" + bookList.getLength() + "本书");
// 遍历每一个book节点
for (int i = ; i < bookList.getLength(); i++) {
System.out.println("============开始遍历==================");
/*
* //通过item(i)方法获取一个book节点,nodelist的索引值从0开始 Node book =
* bookList.item(i); //获取book节点的所有属性集合 NamedNodeMap attr =
* book.getAttributes();
* System.out.println("第"+(i+1)+"本书共有"+attr.getLength()+"个属性");
* //遍历book属性 for(int j=0;j<attr.getLength();j++){
* //通过item(index)方法获取book节点的某一个属性 Node at = attr.item(j); //获取属性名
* System.out.println("属性名:"+at.getNodeName()); //获取属性值
* System.out.println("属性值:"+at.getNodeValue()); }
*/
Element book = (Element) bookList.item(i);
/*
* String attrValue = book.getAttribute("id");
* System.out.println("属性值为:"+attrValue);
*/
// 解析book节点的子节点
NodeList childnNode = book.getChildNodes();
System.out.println("第" + (i + ) + "本书共有" + childnNode.getLength()
+ "个子节点");
for (int k = ; k < childnNode.getLength(); k++) {
// 区分出text类型的node以及element类型的node
if (childnNode.item(k).getNodeType() == Node.ELEMENT_NODE) {
// 获取element类型节点的节点名
System.out.println(childnNode.item(k).getNodeName());
// System.out.println(childnNode.item(k).getFirstChild().getNodeValue());
System.out.println(childnNode.item(k).getTextContent());
}
}
System.out.println("============结束遍历==================");
}
} /*
* DOM创建XML文件
*/
@Test
public void testfun6() throws ParserConfigurationException,
TransformerException {
// 创建DocumentBuilderFactory对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// 创建DocumentBuilder对象
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.newDocument();
document.setXmlStandalone(true);
Element bookstore = document.createElement("bookStore");
// 向bookstore根节点中添加子节点
Element book = document.createElement("book");
Element name = document.createElement("name");
// name.setNodeValue("小王子");
name.setTextContent("小王子");
book.appendChild(name);
book.setAttribute("id", "");
bookstore.appendChild(book);
document.appendChild(bookstore); // 创建TransformerFactory对象
TransformerFactory tff = TransformerFactory.newInstance();
// 创建Transformer对象
Transformer tf = tff.newTransformer();
tf.setOutputProperty(OutputKeys.INDENT, "yes");
tf.transform(new DOMSource(document), new StreamResult(new File(
"src/com/sxt/test/book.xml"))); } /*
* SAX解析
*/
@Test
public void testfun2() throws ParserConfigurationException, SAXException,
IOException {
// 获取一个SAXParserFactory的实例
SAXParserFactory factory = SAXParserFactory.newInstance();
// 通过factory获取SAXParser实例
SAXParser parser = factory.newSAXParser();
// 创建SAXParserHandler对象
SAXParserHandler handler = new SAXParserHandler();
parser.parse("src/com/sxt/test/bookes.xml", handler);
System.out.println("~~~~~~共有" + handler.getBookList().size());
for (Book book : handler.getBookList()) {
System.out.println(book.getId());
System.out.println(book.getAuthor());
System.out.println(book.getName());
System.out.println(book.getLanguage());
System.out.println(book.getPrice());
System.out.println(book.getYear());
} } public ArrayList<Book> parseXML() throws Exception {
// 获取一个SAXParserFactory的实例
SAXParserFactory factory = SAXParserFactory.newInstance();
// 通过factory获取SAXParser实例
SAXParser parser = factory.newSAXParser();
// 创建SAXParserHandler对象
SAXParserHandler handler = new SAXParserHandler();
parser.parse("src/com/sxt/test/bookes.xml", handler); return handler.getBookList(); } /*
* SAX创建XML文件
*/
@Test
public void testfun7() throws Exception {
ArrayList<Book> bookList = parseXML();
//创建一个TransformerFactory类的对象
SAXTransformerFactory tff = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
//通过SAXTransformerFactory对象创建一个TransformerHandler对象
TransformerHandler handler = tff.newTransformerHandler();
//通过handler对象创建一个Transformer对象
Transformer tr = handler.getTransformer();
//通过Transformer对象对生成的XML文件进行设置(编码)
tr.setOutputProperty(OutputKeys.ENCODING,"UTF-8");
//通过Transformer对象进行换行
tr.setOutputProperty(OutputKeys.INDENT,"yes");
//创建一个Result对象
File f = new File("src/com/sxt/test/booke.xml");
if(!f.exists()){
f.createNewFile();
}
//创建一个Result对象,并且使其与handler关联
StreamResult result = new StreamResult(new FileOutputStream(f));
handler.setResult(result);
//打开document
handler.startDocument();
AttributesImpl attr = new AttributesImpl();
handler.startElement("", "", "bookstore", attr);
for(Book book:bookList){
attr.clear();
attr.addAttribute("", "", "id", "", book.getId());
handler.startElement("", "", "book", attr); if(book.getName()!=null&& !book.getName().trim().equals("")){
attr.clear();
//创建name节点
handler.startElement("", "", "name", attr);
handler.characters(book.getName().toCharArray(), , book.getName().length());
handler.endElement("", "", "name");
}
if(book.getAuthor()!=null&& !book.getAuthor().trim().equals("")){
attr.clear();
//创建name节点
handler.startElement("", "", "author", attr);
handler.characters(book.getAuthor().toCharArray(), , book.getAuthor().length());
handler.endElement("", "", "author");
}
if(book.getLanguage()!=null&& !book.getLanguage().trim().equals("")){
attr.clear();
//创建name节点
handler.startElement("", "", "language", attr);
handler.characters(book.getLanguage().toCharArray(), , book.getLanguage().length());
handler.endElement("", "", "language");
}
if(book.getPrice()!=null&& !book.getPrice().trim().equals("")){
attr.clear();
//创建name节点
handler.startElement("", "", "price", attr);
handler.characters(book.getPrice().toCharArray(), , book.getPrice().length());
handler.endElement("", "", "price");
}
if(book.getYear()!=null&& !book.getYear().trim().equals("")){
attr.clear();
//创建name节点
handler.startElement("", "", "year", attr);
handler.characters(book.getYear().toCharArray(), , book.getYear().length());
handler.endElement("", "", "year");
} }
handler.endElement("", "", "bookstore");
//关闭document
handler.endDocument();
} /*
* 创建JDOM
*/
@Test
public void createXML() throws Exception{
//生成一个根节点
org.jdom2.Element rss = new org.jdom2.Element("rss");
//为节点添加属性
rss.setAttribute("version", "2.0");
//生成一个document对象
org.jdom2.Document document = new org.jdom2.Document(rss);
org.jdom2.Element channel = new org.jdom2.Element("channel");
rss.addContent(channel);
org.jdom2.Element title = new org.jdom2.Element("title");
title.setText("国内国际新闻");
channel.addContent(title); Format format = Format.getPrettyFormat();
format.setIndent("");
format.setEncoding("GBK"); //创建XMLOutputter的对象
XMLOutputter outputter = new XMLOutputter(format);
//利用outputer将document对象转换为xml文档
outputter.output(document, new FileOutputStream(new File("src/com/sxt/test/res.xml")));
} /*
* JDOM解析
*/
@Test
public void testfun3() throws JDOMException, IOException {
// 创建一个SAXBuilder的对象
SAXBuilder saxBuilder = new SAXBuilder();
// 创建一个输入流,将XML文件加载到输入流中
InputStream in = new FileInputStream("src/com/sxt/test/bookes.xml");
InputStreamReader isr = new InputStreamReader(in);
// 通过saxBuilder的build方法,将输入流加载到saxBuilder中
org.jdom2.Document document = saxBuilder.build(isr);
// 通过docment对象获取xml文件的根节点
org.jdom2.Element rootElement = document.getRootElement();
// 获取根节点下面的字节点
List<org.jdom2.Element> bookList = rootElement.getChildren();
// 继续进行解析
for (org.jdom2.Element book : bookList) {
Book bookEntity = new Book();
System.out.println("=====开始解析第" + (bookList.indexOf(book) + )
+ "书=====");
// 解析book的属性
List<Attribute> attrList = book.getAttributes();
// 遍历attribute(针对不清楚book节点下属性名字及数量)
for (Attribute attr : attrList) {
// 获取属性名
String attrName = attr.getName();
// 获取属性值
String attrvValue = attr.getValue();
System.out.println("属性名:" + attrName + "----属性值:" + attrvValue);
if (attrName.equals("id")) {
bookEntity.setId(attrvValue);
}
}
List<org.jdom2.Element> bookchilds = book.getChildren();
for (org.jdom2.Element child : bookchilds) {
System.out.println("节点名:" + child.getName() + "----节点值:"
+ child.getValue());
if (child.getName().equals("name")) {
bookEntity.setName(child.getValue());
} else if (child.getName().equals("author")) {
bookEntity.setAuthor(child.getValue());
} else if (child.getName().equals("year")) {
bookEntity.setYear(child.getValue());
} else if (child.getName().equals("price")) {
bookEntity.setPrice(child.getValue());
} else if (child.getName().equals("language")) {
bookEntity.setLanguage(child.getValue());
}
}
System.out.println("=====结束解析第" + (bookList.indexOf(book) + )
+ "书=====");
booksList.add(bookEntity);
bookEntity = null;
System.out.println(bookList.size());
System.out.println("=======" + booksList.get().getId());
System.out.println("=======" + booksList.get().getAuthor());
}
} /*
* 创建DOM4J
*/
@Test
public void parseXML4J() throws DocumentException {
// 创建SAXReader的对象reader
SAXReader reader = new SAXReader();
// 通过reader对象的read方法加载book.xml文件
org.dom4j.Document document = reader.read(new File(
"src/com/sxt/test/bookes.xml"));
// 通过document对象获取根节点bookstore
org.dom4j.Element bookStore = document.getRootElement();
// 通过element对象的elementIterator方法获取迭代器
Iterator<org.dom4j.Element> it = bookStore.elementIterator();
// 遍历迭代器,获取根节点中的信息(书籍)
while (it.hasNext()) {
System.out.println("=========开始遍历某一本书===========");
org.dom4j.Element book = (org.dom4j.Element) it.next();
// 获取book的属性值和属性名
List<org.dom4j.Attribute> bookattrs = book.attributes();
for (org.dom4j.Attribute attr : bookattrs) {
System.out.println("--节点名:" + attr.getName() + "--节点值:"
+ attr.getValue());
}
Iterator itt = book.elementIterator();
while (itt.hasNext()) {
org.dom4j.Element bookChild = (org.dom4j.Element) itt.next();
System.out.println("节点名" + bookChild.getName() + "---节点值"
+ bookChild.getStringValue());
}
System.out.println("=========结束遍历某一本书===========");
}
} /*
* 创建DOM4J
*/
@Test
public void testfun8() throws Exception {
//创建document对象,代表整个xml文档
org.dom4j.Document document = org.dom4j.DocumentHelper.createDocument();
//创建根节点rss
org.dom4j.Element rss = document.addElement("rss");
//向rss节点中添加version属性
rss.addAttribute("version", "2.0");
//生成子节点及节点内容
org.dom4j.Element channel = rss.addElement("channel");
org.dom4j.Element title = channel.addElement("title");
title.setText("国内最新新闻");
//设置生成xml格式
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("GBK");
//生成xml文件
File file = new File("src/com/sxt/test/rssnews.xml");
XMLWriter writer = new XMLWriter(new FileOutputStream(file),format);
writer.write(document);
writer.close();
} /*
* DOM4J解析
*/
@Test
public void testfun4() throws DocumentException {
// 创建SAXReader的对象reader
SAXReader reader = new SAXReader();
// 通过reader对象的read方法加载book.xml文件
org.dom4j.Document document = reader.read(new File(
"src/com/sxt/test/bookes.xml"));
// 通过document对象获取根节点bookstore
org.dom4j.Element bookStore = document.getRootElement();
// 通过element对象的elementIterator方法获取迭代器
Iterator<org.dom4j.Element> it = bookStore.elementIterator();
// 遍历迭代器,获取根节点中的信息(书籍)
while (it.hasNext()) {
System.out.println("=========开始遍历某一本书===========");
org.dom4j.Element book = (org.dom4j.Element) it.next();
// 获取book的属性值和属性名
List<org.dom4j.Attribute> bookattrs = book.attributes();
for (org.dom4j.Attribute attr : bookattrs) {
System.out.println("--节点名:" + attr.getName() + "--节点值:"
+ attr.getValue());
}
Iterator itt = book.elementIterator();
while (itt.hasNext()) {
org.dom4j.Element bookChild = (org.dom4j.Element) itt.next();
System.out.println("节点名" + bookChild.getName() + "---节点值"
+ bookChild.getStringValue());
}
System.out.println("=========结束遍历某一本书===========");
}
} @Test
public void testDemo() throws Exception {
System.out.println("性能测试");
// 测试DOM的性能
long start1 = System.currentTimeMillis();
testfun1();
System.out.println("DOM: " + (System.currentTimeMillis() - start1));
// 测试DOM的性能
long start2 = System.currentTimeMillis();
testfun2();
System.out.println("SAX: " + (System.currentTimeMillis() - start2));
// 测试DOM的性能
long start3 = System.currentTimeMillis();
testfun3();
System.out.println("JDOM: " + (System.currentTimeMillis() - start3));
// 测试DOM的性能
long start4 = System.currentTimeMillis();
testfun4();
System.out.println("DOM4J: " + (System.currentTimeMillis() - start4));
}
}
package com.sxt.test; import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler; public class MyContentHandler extends DefaultHandler{
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
System.out.println("开始解析");
}
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
System.out.println("结束解析");
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
System.out.println("元素解析开始");
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// TODO Auto-generated method stub
System.out.println("元素解析结束");
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub
String s = new String(ch,start,length);
if(s.trim().isEmpty()){
return;
}
System.out.println("文本内容为"+s);
}
@Override
public void ignorableWhitespace(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub
System.out.println("文本内容为空");
}
@Override
public void processingInstruction(String target, String data)
throws SAXException {
// TODO Auto-generated method stub
System.out.println("处理指令");
}
}
四种解析和创建方式(DOM,SAX,DOM4J,JDOM)的更多相关文章
- java解析xml的方式DOM,SAX,DOM4J,JDOM,StAX
1)DOM(JAXP Crimson解析器)DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找 特定信息. ...
- xml常用四种解析方式优缺点的分析×××××
xml常用四种解析方式优缺点的分析 博客分类: xml 最近用得到xml的解析方式,于是就翻了翻自己的笔记同时从网上查找了资料,自己在前人的基础上总结了下,贴出来大家分享下. 首先介绍一下xml语 ...
- 解析XML文件的几种常见操作方法—DOM/SAX/DOM4j
解析XML文件的几种常见操作方法—DOM/SAX/DOM4j 一直想学点什么东西,有些浮躁,努力使自己静下心来看点东西,哪怕是回顾一下知识.看到了xml解析,目前我还没用到过.但多了解一下,加深点记忆 ...
- Spring中四种实例化bean的方式
本文主要介绍四种实例化bean的方式(注入方式) 或者叫依赖对象实例化的四种方式.上面的程序,创建bean 对象,用的是什么方法 ,用的是构造函数的方式 (Spring 可以在构造函数私有化的情况下把 ...
- java正则表达式四种常用的处理方式是怎么样呢《匹配、分割、代替、获取》
java 正则表达式高级篇,介绍四种常用的处理方式:匹配.分割.替代.获取,具体内容如下package test; import java.util.regex.Matcher; import jav ...
- java内部类及四种内部类的实现方式
java内部类及四种内部类的实现方式 一.内部类定义:内部类分为: 成员内部类.静态嵌套类.方法内部类.匿名内部类. 二.为何要内部类?a.内部类提供了某种进入外围类的窗户.b.也是最吸引人的原因, ...
- XML解析——Java中XML的四种解析方式
XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与交互带来了极大的方便.XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已. XML的解析方式分为四 ...
- XML解析——Java中XML的四种解析方式(转载 by 龍清扬)
XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与交互带来了极大的方便.XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已. XML的解析方式分为四 ...
- Java中XML的四种解析方式(一)
XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性给数据集成与交互带来了极大的方便.XML在不同的语言环境中解析的方式都是一样的,只不过实现的语法不同而已. XML文档以层级标签的 ...
随机推荐
- 集合(set)-Python3
set 的 remove() 和 discard() 方法介绍. 函数/方法名 等价操作符 说明 所有集合类型 len(s) 集合基数:集合s中元素个数 set([obj]) 可变集合工 ...
- iOS之开发中一些相关的路径以及获取路径的方法
模拟器的位置: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs ...
- 使用Nginx反向代理 让IIS和Tomcat等多个站点一起飞
使用Nginx 让IIS和Tomcat等多个站点一起飞 前言: 养成一个好习惯,解决一个什么问题之后就记下来,毕竟“好记性不如烂笔头”. 这样也能帮助更多的人 不是吗? 最近闲着没事儿瞎搞,自己在写一 ...
- Oracle 列数据聚合方法汇总
网上流传众多列数据聚合方法,现将各方法整理汇总,以做备忘. wm_concat 该方法来自wmsys下的wm_concat函数,属于Oracle内部函数,返回值类型varchar2,最大字符数4000 ...
- EasyPR--开发详解(5)颜色定位与偏斜扭转
本篇文章介绍EasyPR里新的定位功能:颜色定位与偏斜扭正.希望这篇文档可以帮助开发者与使用者更好的理解EasyPR的设计思想. 让我们先看一下示例图片,这幅图片中的车牌通过颜色的定位法进行定位并从偏 ...
- CSharpGL(34)以从零编写一个KleinBottle渲染器为例学习如何使用CSharpGL
CSharpGL(34)以从零编写一个KleinBottle渲染器为例学习如何使用CSharpGL +BIT祝威+悄悄在此留下版了个权的信息说: 开始 本文用step by step的方式,讲述如何使 ...
- Spark join 源码跟读记录
PairRDDFunctions类提供了以下两个join接口,只提供一个参数,不指定分区函数时默认使用HashPartitioner;提供numPartitions参数时,其内部的分区函数是HashP ...
- 异步与并行~List<T>是线程安全的吗?
返回目录 题目有点意思,大家都知道Dictionary<K,V>不是线程安全的类型,而List<T>是线程安全的吗?在今天之前大叔没有去测试过,而就在今天也是一个VIP问我,说 ...
- windows下配置apache+php环境
PHP安装 由于windows下php扩展5.6的多余7.0,故以php5.6为开发环境.如果对扩展要求不高,可以使用php7,安装过程类似. 约定: 环境安装目录: D:/phpsetup/ |-- ...
- redis成长之路——(五)
单例.哨兵.Cluster redis应用广泛,主要体现于实际场景的可用化,但是对于码农来说初步入手很多理念难以理解:码农的想法就是:为什么我要管那么多,我只想用,能用就行!所以必须将三个场景透明化. ...