xml文件:树形存储格式;通过相同的xml文件实现不同的软件、不同的操作系统、不同的平台之间的信息通讯;

声明xml文件:

<?xml version="1.0" encoding="utf-8"?>

本篇用来测试的xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book id = "1">
<name>童话故事</name>
<author>安徒生</author>
</book>
<book id = "2">
<name>大力水手</name>
<year>1999</year>
</book>
</bookstore>

注意:

xml文件中的空格换行符会被java解析成Text类节点;

java获取xml文件内容的解析方式有;DOM、SAX、DOM4J、JDOM

DOM解析:

两种取节点值的区别:

getNodevalue():取普通的节点值会返回一个null,因为Java是把我们以为的节点值看成是一个子节点的,因此需要getFirstChild().getNodeValue()这样来取得我们认为的节点值;

getTextContent():是把节点的节点值和子节点的节点值都当做是节点值取出并返回,比如节点<book><id>88<id>童话故事</book>;这样取出来的值是88童话故事;

SAX解析xml文件:没有将xml文件全部加载到内存中,而是通过识别文件开始、结束标志,节点的开始、结束标志;遍历整个xml文件

继承DefaultHandler,并重写一些方法,在业务中实例化这个类并作为参数将其传入;

继承DefaultHandler的重写方法类:

package com.hd;

import java.util.ArrayList;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler; import com.entry.Book; public class SAXHd extends DefaultHandler {
int books = 0;
String nodevalue = null;
Book ii = null;
private ArrayList<Book> bookList = new ArrayList<Book>();
public ArrayList<Book> getBookList() {
return bookList;
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// TODO Auto-generated method stub
super.characters(ch, start, length);
nodevalue = new String(ch, start, length);
if(!nodevalue.trim().equals("")) {
System.out.println("对应的节点值是:"+nodevalue);
}
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
super.startElement(uri, localName, qName, attributes);
if(qName.equals("book")) {
ii = new Book();
int i = attributes.getLength();
for(int j =0;j<i;j++) {
String atrname = attributes.getQName(j);
String atrvalue = attributes.getValue(j);
System.out.println("book节点的属性有"+i+"个,第"+(j+1)+"个属性名是:"+atrname+",其对应的属性值是:"+atrvalue);
if(attributes.getQName(j).equals("id")) {
ii.setId(atrvalue);
}
}
}else if (!qName.equals("book") && !qName.equals("bookstore")){
System.out.println("节点名是:"+qName);
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
// TODO Auto-generated method stub
super.endElement(uri, localName, qName);
if(qName.equals("book")) {
bookList.add(ii);
ii = null;
books++;
System.out.println("===========结束第"+books+"本书的遍历===========");
}else if (qName.equals("name")) {
ii.setName(nodevalue);
}else if (qName.equals("author")) {
ii.setAuthor(nodevalue);;
}else if (qName.equals("year")) {
ii.setYear(nodevalue);
} }
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
System.out.println("开始解析");
}
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
System.out.println("解析结束");
}
}

book对象的封装类:

package com.entry;

public class Book {
private String id;
private String name;
private String year;
private String author;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getYear() {
return year;
}
public void setYear(String year) {
this.year = year;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}

解析过程的执行结果类:

package com.xmltest;

import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; import com.entry.Book;
import com.hd.SAXHd; public class SAXTest { public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
// TODO Auto-generated method stub
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
SAXHd hd = new SAXHd();
parser.parse("books.xml", hd);
System.out.println(hd.getBookList().size());
for (Book book : hd.getBookList() ) {
System.out.println(book.getId());
System.out.println(book.getAuthor());
System.out.println(book.getName());
System.out.println(book.getYear());
System.out.println("--------------------");
}
}
}

以上的两种xml文件的解析方法是java本身提供的;

而DOM4J、JDOM方法解析xml文件是需要导入对应的java包,比较稳妥的做法是在项目先建一个folder文件后将jar包拉进去,再通过build path中加入进去,而不是仅仅选择build path加载进去,这样可以避免因项目跨平台的传送而导致在别的电脑上运行时没有加载jar包;

jdom解析xml文件

若发现解析出来的xml文件出现乱码,先检查xml文件声明时的字符编码;如若无果,再去将xml文件读入输入流的时候设置好字符编码;

package com.JdomTest;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List; import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder; import com.entry.Book; public class JDOMtest01 {
private static ArrayList<Book> booklist = new ArrayList<Book>();
public static void main(String[] args) throws JDOMException, IOException {
// TODO Auto-generated method stub
SAXBuilder saxBuilder = new SAXBuilder();//创建一个SAXBuilder对象
InputStream in = new FileInputStream("books.xml");//创建一个输入流;
Document document = saxBuilder.build(in);//将输入流加载到saxBuilder.build()中;
Element rootElement = document.getRootElement();//获取根节点
List<Element> bookList = rootElement.getChildren();//获取根节点下的子节点集合
for(Element y : bookList) {
Book book = new Book();
System.out.println("========开始解析第"+(bookList.indexOf(y)+1)+"书========");
List<Attribute> attr = y.getAttributes();//获取y子节点的属性集合
for(Attribute x : attr) {
String atrname = x.getName();
String atrvalue = x.getValue();
System.out.println("属性名:"+atrname+";属性值:"+atrvalue);
if (atrname.equals("id")) {
book.setId(atrvalue);
}
}
List<Element> node = y.getChildren();
for (Element z : node) {
String nodename = z.getName();
String nodevalue = z.getValue();
System.out.println("子节点名:"+nodename+",对应的值是"+nodevalue);
if (nodename.equals("name")) {
book.setName(nodevalue);
}
else if (nodename.equals("author")) {
book.setAuthor(nodevalue);
}
else if (nodename.equals("year")) {
book.setYear(nodevalue);
}
}
booklist.add(book);
book = null;
System.out.println("========结束解析第"+(bookList.indexOf(y)+1)+"书========"); }
System.out.println(booklist.get(0).getId());
System.out.println(booklist.get(0).getAuthor());
System.out.println(booklist.get(0).getName());
System.out.println(booklist.get(0).getYear());
} }

 dom4j解析xml文件

package com.dom4jtest;

import java.io.File;
import java.util.Iterator;
import java.util.List; import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; public class Dom4jTest01 { public static void main(String[] args) throws DocumentException {
// TODO Auto-generated method stub
SAXReader reader = new SAXReader();//创建SAXReader对象;
Document document = reader.read(new File("books.xml"));//将xml文件传入Document对象中
Element bookstore = document.getRootElement();//获取根节点
Iterator it = bookstore.elementIterator();//获取包含子节点的迭代器;
while(it.hasNext()) {
System.out.println("=======开始遍历某本书=======");
Element book = (Element)it.next();//对迭代器中的对象进行强制转换;
Iterator node = book.elementIterator();
while(node.hasNext()) {
Element booknode = (Element)node.next();
String nodename = booknode.getName();
String nodevalue = booknode.getStringValue();
System.out.println("子节点名:"+nodename+",对应的子节点值:"+nodevalue);
}
List<Attribute> bookatrs = book.attributes();//获取book的属性集
for(Attribute i : bookatrs) {
String strname = i.getName();
String strvalue = i.getValue();
System.out.println("这本书的属性名是:"+strname+",其对应的属性值是:"+strvalue);
}
System.out.println("=======结束遍历某本书=======");
}
} }

同样的,也可通过对自定义对象的封装实例化,将取得的值存进对象中并保存起来;

四种解析xml文件的对比:

java基础笔记)(5)的更多相关文章

  1. Java基础笔记 – Annotation注解的介绍和使用 自定义注解

    Java基础笔记 – Annotation注解的介绍和使用 自定义注解 本文由arthinking发表于5年前 | Java基础 | 评论数 7 |  被围观 25,969 views+ 1.Anno ...

  2. 【转】Java基础笔记 – 枚举类型的使用介绍和静态导入--不错

    原文网址:http://www.itzhai.com/java-based-notes-introduction-and-use-of-an-enumeration-type-static-impor ...

  3. 黑马程序员----java基础笔记中(毕向东)

    <p>------<a href="http://www.itheima.com" target="blank">Java培训.Andr ...

  4. 黑马程序员----java基础笔记上(毕向东)

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 笔记一共记录了毕向东的java基础的25天课程,分上.中.下 本片为上篇,涵盖前10天课程 1. ...

  5. Java基础笔记1

    java (开源,跨操作系统)j2ee jre java基础 javaoop java高级 JDK(JAVA developer Kitool): java开发工具 (开发人员使用) JRE(java ...

  6. Java基础笔记(一)——JDK、JRE、JVM

    JDK.JRE和JVM三者的关系 Java程序执行过程 JVM(java virtual machine) 注:由于各种操作系统(windows.linux等)支持的指令集(二进制可执行代码)不同,程 ...

  7. Java基础笔记05-06-07-08

    五.今日内容介绍 1.方法基础知识 2.方法高级内容 3.方法案例 01方法的概述 * A: 为什么要有方法 * 提高代码的复用性 * B: 什么是方法 * 完成特定功能的代码块. 02方法的定义格式 ...

  8. Java基础笔记-抽象,继承,多态

    抽象类: abstract修饰 抽象方法必须定义在抽象类中,抽象类不能创建对象. 在抽象方法中可以不定义抽象方法,作用是:让该类不能建立对象. 特点是: 1.定义在抽象类中 2.方法和类都用abstr ...

  9. Java基础笔记(一)

    本文主要是我在看<疯狂Java讲义>时的读书笔记,阅读的比较仓促,就用 markdown 写了个概要. 第一章 Java概述 Java SE:(Java Platform, Standar ...

  10. JAVA基础笔记10-11-12-13-14

    十.今日内容介绍 1.继承 2.抽象类 3.综合案例---员工类系列定义 01继承的概述 *A:继承的概念 *a:继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系 *b:在J ...

随机推荐

  1. python接口自动化五(参数关联)

    前言 我们用自动化发帖之后,要想接着对这篇帖子操作,那就需要用参数关联了,发帖之后会有一个帖子的id,获取到这个id,继续操作传这个帖子id就可以了 (博客园的登录机制已经变了,不能用账号和密码登录了 ...

  2. 17.树的子结构(python)

    题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) class Solution: def HasSubtree(self, pRoot1, pRoo ...

  3. 查看 XML 文件

    在所有现代浏览器中,均能够查看原始的 XML 文件. 不要指望 XML 文件会直接显示为 HTML 页面. 查看 XML 文件 查看这个 XML 文件:note.xml 打开 XML 文件 - XML ...

  4. (55)Linux驱动开发之一驱动概述

                                                                                                      驱动 ...

  5. 极验验证码在php5.6.27下不显示

    PHP5.6需要改php.ini 去掉;always_populate_raw_post_data = -1的 :

  6. Using FileUpload

    Using FileUpload FileUpload can be used in a number of different ways, depending upon the requiremen ...

  7. Jmeter 设置连接oracle数据库

    一.添加需要数据库驱动jar包 方式1:直接将jar包复制到jmeter的lib目录,或lib/ext目录:(亲测两个目录都可以使用) 方式2:使用jmeter的Test Plan引入相应的jar包: ...

  8. web开发中会话跟踪的方法

    1. 什么是会话 会话是指一个终端用户(服务器)与交互系统(客户端)进行通讯的过程. 2. 什么是会话跟踪 对同一个用户对服务器的连续的请求和接受响应的监视.(将用户与同一用户发出的不同请求之间关联, ...

  9. OpenStack Nova Placement API 统一资源管理接口的未来

    目录 目录 Placement API 为何称之为 "未来" 操作对象基本概念 数据库操作样例 Placement API 在创建虚拟机时的调度过程 Placement REST ...

  10. 分布式任务队列 Celery —— 应用基础

    目录 目录 前文列表 前言 Celery 的周期定时任务 Celery 的同步调用 Celery 结果储存 Celery 的监控 Celery 的调试 前文列表 分布式任务队列 Celery 分布式任 ...