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. Linux入门培训教程 常见linux命令释义

    快到中午吃饭了,然后忽然想起来samba里面没有添加用户.于是乎,就玩弄起了samba. Samba三下五除二就安装好了,想想window里面不断的点击下一步,还要小心提防各种隐藏再角落里的绑定软件. ...

  2. #424 Div2 Problem C Jury Marks (二分 && 暴力 && std::unique && 思维)

    题目链接 :http://codeforces.com/contest/831/problem/C 题意 :选手有一个初始积分,接下来有k个裁判为他加分或减分(时间顺序给出),然后告诉你n(1< ...

  3. luogu P1141 01迷宫 x

    P1141 01迷宫 题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任 ...

  4. 容器适配器————priority_queue

    #include <queue> priority_queue 容器适配器定义了一个元素有序排列的队列.默认队列头部的元素优先级最高.因为它是一个队列,所以只能访问第一个元素,这也意味着优 ...

  5. YOLO_V2

    YOLOv2:代表着目前业界最先进物体检测的水平,它的速度要快过其他检测系统(FasterR-CNN,ResNet,SSD),使用者可以在它的速度与精确度之间进行权衡. YOLO9000:这一网络结构 ...

  6. selenium+常见操作

    1.多窗口操作 有些页面的链接打开后,会重新打开一个窗口,对于这种情况,想在新页面上操作,就得先切换窗口了.获取窗口的唯一标识用句柄表示,所以只需要切换句柄,我们就能在多个页面上灵活自如的操作了. 句 ...

  7. c++结构体、共用体和枚举

    结构体类型 c++中的结构体成员既可以是数据,也可以是函数 c语言中定义结构体变量必须加struct(这也是很多时候和typedef),但是在c++里面,可以不加 结构体和类的不同在于,结构体中的变量 ...

  8. centos7没有IP地址

    查看网卡 ip addr查看网卡 我截图中有ip,是因为我已经设置过了. eth0是对外的网卡,我们接下来设置这个网卡,你的网卡名字可能和我的不一样. 修改网卡 修改/etc/sysconfig/ne ...

  9. xsens melodic ros driver

    sudo apt-get update sudo apt-get install ros-melodic-xsens-driver 设置数据输出: // 输出四元数,加速度.角速度.地磁 python ...

  10. awk命令1

    [root@a ~]# awk 'END{print NR}' c.txt       #没错,这就是文件的行数,当然,这种统计方法不是linux下最快的,但也是一种思路3[root@a ~]# wc ...