JAVA解析XML文件(DOM,SAX,JDOM,DOM4j附代码实现)

时间:2022-06-04 08:34:21

1、解析XML主要有四种方式

1.DOM方式解析XML(与平台无关,JAVA提供,一次性加载XML文件内容,形成树结构,不适用于大文件)
2.SAX方式解析XML(基于事件驱动,逐条解析,适用于只处理XML数据,不易编码)
3.JDOM方式解析XML(使用具体类而不使用接口)
4.DOM4j方式解析XML(推荐)

2、代码实现

(1)XML文件

 <?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book id="1">
<name>平凡的世界</name>
<author>路遥</author>
<year>2017</year>
<price></price>
</book>
<book id="2">
<name>百年孤独</name>
<author>加西亚·马尔克斯</author>
<year>1967</year>
<price>80</price>
</book>
<book id="3">
<name>程序员的修炼之道</name>
<author>安德鲁·亨特、大卫·托马斯</author>
<year>2011</year>
<price>156</price>
</book>
</bookstore>

(2)XML对应的Bean类

 public class Book {   

     private int id;
private String name;
private String author;
private int year;
private double price; /**
* @return the id
*/
public int getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(int id) {
this.id = id;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the author
*/
public String getAuthor() {
return author;
}
/**
* @param author the author to set
*/
public void setAuthor(String author) {
this.author = author;
}
/**
* @return the year
*/
public int getYear() {
return year;
}
/**
* @param year the year to set
*/
public void setYear(int year) {
this.year = year;
}
/**
* @return the price
*/
public double getPrice() {
return price;
}
/**
* @param price the price to set
*/
public void setPrice(double price) {
this.price = price;
} @Override
public String toString() {
return "Book [id=" + id + ", name=" + name + ", author=" + author + ", year=" + year + ", price=" + price + "]";
} }

3、XML解析

(1)DOM方式解析XML

 public class ReadxmlByDom {
private static DocumentBuilderFactory dbFactory = ;
private static DocumentBuilder db = ;
private static Document document = ;
private static List<Book> books = ;
static{
try {
dbFactory = DocumentBuilderFactory.newInstance();
db = dbFactory.newDocumentBuilder();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
} public static List<Book> getBooks(String fileName) throws Exception{
//将给定 URI 的内容解析为一个 XML 文档,并返回Document对象
document = db.parse(fileName);
//按文档顺序返回包含在文档中且具有给定标记名称的所有 Element 的 NodeList
NodeList bookList = document.getElementsByTagName("book");
books = new ArrayList<Book>();
//遍历books
for(int i=0;i<bookList.getLength();i++){
Book book = new Book();
//获取第i个book结点
org.w3c.dom.Node node = bookList.item(i);
//获取第i个book的所有属性
NamedNodeMap namedNodeMap = node.getAttributes();
//获取已知名为id的属性值
String id = namedNodeMap.getNamedItem("id").getTextContent();//System.out.println(id);
book.setId(Integer.parseInt(id)); //获取book结点的子节点,包含了Test类型的换行
NodeList cList = node.getChildNodes();//System.out.println(cList.getLength());9 //将一个book里面的属性加入数组
ArrayList<String> contents = new ArrayList<>();
for(int j=1;j<cList.getLength();j+=2){ org.w3c.dom.Node cNode = cList.item(j);
String content = cNode.getFirstChild().getTextContent();
contents.add(content);
//System.out.println(contents);
} book.setName(contents.get(0));
book.setAuthor(contents.get(1));
book.setYear(Integer.parseInt(contents.get(2)));
book.setPrice(Double.parseDouble(contents.get(3)));
books.add(book);
} return books; } public static void main(String args[]){
String fileName = "src/res/books.xml";
try {
List<Book> list = ReadxmlByDom.getBooks(fileName);
for(Book book :list){
System.out.println(book);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }

(2)SAX方式解析XML(比较麻烦,需要配置一个handler处理器)

DefaultHandler处理器

 /**
* 用SAX解析xml文件时需要的handler
*/
public class SAXParseHandler extends DefaultHandler {
private List<Book> list; //存放解析到的book数组
private Book book; //存放当前解析的book private String content = ; //存放当前节点值 /**
* 开始解析xml文档时调用此方法
*/
@Override
public void startDocument() throws SAXException { super.startDocument();
System.out.println("开始解析xml文件");
list = new ArrayList<Book>();
} /**
* 文档解析完成后调用此方法
*/
@Override
public void endDocument() throws SAXException { super.endDocument();
System.out.println("xml文件解析完毕");
} /**
* 开始解析节点时调用此方法
*/
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); //当节点名为book时,获取book的属性id
if(qName.equals("book")){
book = new Book();
String id = attributes.getValue("id");//System.out.println("id值为"+id);
book.setId(Integer.parseInt(id));
} } /**
*节点解析完毕时调用此方法
*
*@param qName 节点名
*/
@Override
public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName);
if(qName.equals("name")){
book.setName(content);
//System.out.println("书名"+content);
}else if(qName.equals("author")){
book.setAuthor(content);
// System.out.println("作者"+content);
}else if(qName.equals("year")){
book.setYear(Integer.parseInt(content));
// System.out.println("年份"+content);
}else if(qName.equals("price")){
book.setPrice(Double.parseDouble(content));
// System.out.println("价格"+content);
}else if(qName.equals("book")){ //当结束当前book解析时,将该book添加到数组后置为空,方便下一次book赋值
list.add(book);
book = ;
} } /**
* 此方法用来获取节点的值
*/
@Override
public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); content = new String(ch, start, length);
//收集不为空白的节点值
// if(!content.trim().equals("")){
// System.out.println("节点值为:"+content);
// } } public List<Book> getBooks(){
return list;
} }

用SAX方式读取xml文件

 /**
* 用SAX方式读取xml文件
*/
public class ReadXmlBySAX { private static List<Book> books = ; private SAXParserFactory sParserFactory = ;
private SAXParser parser = ; public List<Book> getBooks(String fileName) throws Exception{
SAXParserFactory sParserFactory = SAXParserFactory.newInstance();
SAXParser parser = sParserFactory.newSAXParser(); SAXParseHandler handler = new SAXParseHandler();
parser.parse(fileName, handler); return handler.getBooks(); }
/**
* @param args
*/
public static void main(String[] args) {
try {
books = new ReadXmlBySAX().getBooks("src/res/books.xml");
for(Book book:books){
System.out.println(book);
} } catch (Exception e) {
e.printStackTrace();
} } }

(3)JDOM方式解析XML

 /**
* 用JDOM方式读取xml文件
*/
public class ReadXMLByJDom { private List<Book> books = ;
private Book book = ; public List<Book> getBooks(String fileName){
SAXBuilder saxBuilder = new SAXBuilder();
try {
Document document = saxBuilder.build(new FileInputStream(fileName));
//获取根节点bookstore
Element rootElement = document.getRootElement();
//获取根节点的子节点,返回子节点的数组
List<Element> bookList = rootElement.getChildren();
books = new ArrayList<Book>();
for(Element bookElement : bookList){
book = new Book();
//获取bookElement的属性
List<Attribute> bookAttributes = bookElement.getAttributes();
for(Attribute attribute : bookAttributes){
if(attribute.getName().equals("id")){
String id = attribute.getValue(); //System.out.println(id);
book.setId(Integer.parseInt(id));
}
}
//获取bookElement的子节点
List<Element> children = bookElement.getChildren();
for(Element child : children){
if(child.getName().equals("name")){
String name = child.getValue();//System.out.println(name);
book.setName(name);
}else if(child.getName().equals("author")){
String author = child.getValue();
book.setAuthor(author);//System.out.println(author);
}else if(child.getName().equals("year")){
String year = child.getValue();
book.setYear(Integer.parseInt(year));
}else if(child.getName().equals("price")){
String price = child.getValue();
book.setPrice(Double.parseDouble(price));
} } books.add(book);
book = ; } } catch (FileNotFoundException e) { e.printStackTrace();
} catch (JDOMException e) { e.printStackTrace();
} catch (IOException e) { e.printStackTrace();
} return books; } public static void main(String[] args) {
// TODO Auto-generated method stub
String fileName = "src/res/books.xml";
List<Book> books= new ReadXMLByJDom().getBooks(fileName);
for(Book book : books){
System.out.println(book);
}
} }

4、DOM4j方式解析XML

 /**
* 用DOM4J方法读取xml文件
*/
public class ReadXMLByDom4j { private List<Book> bookList = ;
private Book book = ; public List<Book> getBooks(File file){ SAXReader reader = new SAXReader();
try {
Document document = reader.read(file);
Element bookstore = document.getRootElement();
Iterator storeit = bookstore.elementIterator(); bookList = new ArrayList<Book>();
while(storeit.hasNext()){ book = new Book();
Element bookElement = (Element) storeit.next();
//遍历bookElement的属性
List<Attribute> attributes = bookElement.attributes();
for(Attribute attribute : attributes){
if(attribute.getName().equals("id")){
String id = attribute.getValue();//System.out.println(id);
book.setId(Integer.parseInt(id));
}
} Iterator bookit = bookElement.elementIterator();
while(bookit.hasNext()){
Element child = (Element) bookit.next();
String nodeName = child.getName();
if(nodeName.equals("name")){
//System.out.println(child.getStringValue());
String name = child.getStringValue();
book.setName(name);
}else if(nodeName.equals("author")){
String author = child.getStringValue();
book.setAuthor(author);
}else if(nodeName.equals("year")){
String year = child.getStringValue();
book.setYear(Integer.parseInt(year));
}else if(nodeName.equals("price")){
String price = child.getStringValue();
book.setPrice(Double.parseDouble(price));
}
}
bookList.add(book);
book = ; }
} catch (DocumentException e) { e.printStackTrace();
} return bookList; } /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
File file = new File("src/res/books.xml");
List<Book> bookList = new ReadXMLByDom4j().getBooks(file);
for(Book book : bookList){
System.out.println(book);
}
} }

JAVA解析XML文件(DOM,SAX,JDOM,DOM4j附代码实现)的更多相关文章

  1. Java解析XMl文件之SAX和DOm方法

    如题,这两种方法的jar包都在jdk中,不需要下载. 先来说下目录结构: 首先建一个Peron类封装person.xml的属性:DomParseService和SaxParseService分别为两种 ...

  2. java解析XML文件四种方法之引入源文件

    1.DOM解析(官方) try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();         Documen ...

  3. JAVA解析XML之DOM方式

    JAVA解析XML之DOM方式 准备工作 创建DocumentBuilderFactory对象;    创建DocumentBuilder对象; 通过DocumentBuilder对象的parse方法 ...

  4. java解析xml文件并输出

    使用java解析xml文件,通过dom4j,代码运行前需先导入dom4j架包. ParseXml类代码如下: import java.io.File; import java.util.ArrayLi ...

  5. 使用Java解析XML文件或XML字符串的例子

    转: 使用Java解析XML文件或XML字符串的例子 2017年09月16日 11:36:18 inter_peng 阅读数:4561 标签: JavaXML-Parserdom4j 更多 个人分类: ...

  6. Java解析xml文件遇到特殊符号&amp&semi;会出现异常的解决方案

    文/朱季谦 在一次Java解析xml文件的开发过程中,使用SAX解析时,出现了这样一个异常信息: Error on line 60 of document : 对实体 "xxx" ...

  7. Java解析XML汇总(DOM&sol;SAX&sol;JDOM&sol;DOM4j&sol;XPath)

    [目录] 一.[基础知识——扫盲] 二.[DOM.SAX.JDOM.DOM4j简单使用介绍] 三.[性能测试] 四.[对比] 五.[小插曲XPath] 六.[补充] 关键字:Java解析xml.解析x ...

  8. JAVA与DOM解析器提高(DOM&sol;SAX&sol;JDOM&sol;DOM4j&sol;XPath) 学习笔记二

    要求 必备知识 JAVA基础知识.XML基础知识. 开发环境 MyEclipse10 资料下载 源码下载   sax.dom是两种对xml文档进行解析的方法(没有具体实现,只是接口),所以只有它们是无 ...

  9. 用java操作XML文件&lpar;DOM解析方式&rpar;

    XML 可扩展标记语言(Extensible Markup Language),是独立于软件和硬件的传输工具. XML的作用: (1)用作配置文件 (2)简化数据共享 (3)简化数据传输 XML DO ...

随机推荐

  1. EC笔记:第4部分:18、接口正确使用,不易被误用

    好的接口容易被正确使用,不易被误用 考虑以下函数: void func(int year,int month,int day){ //一些操作 } 这个函数看似合理,因为参数的名字已经暴露了它的用途. ...

  2. D3&period;js学习(三)

    上一节中,我们已经画出了图表,并且给图表添加了坐标轴的标签和标题,在这一节中,我们将要学习几个绘制线条不同特性的几个函数,以及给图表添加格栅.ok,进入话题! 如何给线条设置绘制的样式? 这个其实非常 ...

  3. mysql防止数据库重复

    通常我们用来判断数据库重复的使用以下方法: $title ='www.111cn.net'; $sql = "Select * from tablename where title='$ti ...

  4. XE6 &amp&semi; IOS开发之开发者账号、苹果证书(3):关于在XE6中使用苹果证书的简单介绍

    网上能找到的关于Delphi XE系列的移动开发的相关文章甚少,本文尽量以详细的图文内容.傻瓜式的表达来告诉你想要的答案. 原创作品,请尊重作者劳动成果,转载请注明出处!!! 1.关于在XE6中使用苹 ...

  5. 在c或c&plus;程序里打印调用栈。转

    在C/C++程序里打印调用栈信息 我们知道,GDB的backtrace命令可以查看堆栈信息.但很多时候,GDB根本用不上.比如说,在线上环境中可能没有GDB,即使有,也不太可能让我们直接在上面调试.如 ...

  6. UIControlEventTouch

    在控件事件中,简单解释下下面几个事件. 说明:由于是在“iOS 模拟器”中测试的,所以不能用手指,只能用鼠标. 1)UIControlEventTouchDown 指鼠标左键按下(注:只是“按下”)的 ...

  7. Ecplise &plus; Xdebug 一波三折终于能单步调试了

    http://my.oschina.net/012345678/blog/152889 Ecplise + Xdebug 一波三折终于能单步调试了 发表于2年前(2013-08-15 15:50)   ...

  8. Java——Image 图片切割

    package com.tb.image; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io ...

  9. android2&period;3 -添加自定义按键:作唤醒功能 &period;

    最近需要做个唤醒功能,当按键的时候android系统唤醒并点亮屏,在长按键中,系统不能在进入睡眠. 驱动方面: 1:在平台设备文件中添加 一个按键,定义为唤醒源! \arch\arm\mach-s5p ...

  10. Jfinal学习笔记

    实习期间,公司使用jfinal做开发,所以就学习了这个框架 Jfinal作为一个极速ORM,使用上非常方便,核心源代码1万多行,压缩后只有200多KB. 从入口开始 作为一个web项目,首先解读web ...