JAVA解析XML文件(DOM,SAX,JDOM,DOM4j附代码实现)
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附代码实现)的更多相关文章
- Java解析XMl文件之SAX和DOm方法
如题,这两种方法的jar包都在jdk中,不需要下载. 先来说下目录结构: 首先建一个Peron类封装person.xml的属性:DomParseService和SaxParseService分别为两种 ...
- java解析XML文件四种方法之引入源文件
1.DOM解析(官方) try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); Documen ...
- JAVA解析XML之DOM方式
JAVA解析XML之DOM方式 准备工作 创建DocumentBuilderFactory对象; 创建DocumentBuilder对象; 通过DocumentBuilder对象的parse方法 ...
- java解析xml文件并输出
使用java解析xml文件,通过dom4j,代码运行前需先导入dom4j架包. ParseXml类代码如下: import java.io.File; import java.util.ArrayLi ...
- 使用Java解析XML文件或XML字符串的例子
转: 使用Java解析XML文件或XML字符串的例子 2017年09月16日 11:36:18 inter_peng 阅读数:4561 标签: JavaXML-Parserdom4j 更多 个人分类: ...
- Java解析xml文件遇到特殊符号&会出现异常的解决方案
文/朱季谦 在一次Java解析xml文件的开发过程中,使用SAX解析时,出现了这样一个异常信息: Error on line 60 of document : 对实体 "xxx" ...
- Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)
[目录] 一.[基础知识——扫盲] 二.[DOM.SAX.JDOM.DOM4j简单使用介绍] 三.[性能测试] 四.[对比] 五.[小插曲XPath] 六.[补充] 关键字:Java解析xml.解析x ...
- JAVA与DOM解析器提高(DOM/SAX/JDOM/DOM4j/XPath) 学习笔记二
要求 必备知识 JAVA基础知识.XML基础知识. 开发环境 MyEclipse10 资料下载 源码下载 sax.dom是两种对xml文档进行解析的方法(没有具体实现,只是接口),所以只有它们是无 ...
- 用java操作XML文件(DOM解析方式)
XML 可扩展标记语言(Extensible Markup Language),是独立于软件和硬件的传输工具. XML的作用: (1)用作配置文件 (2)简化数据共享 (3)简化数据传输 XML DO ...
随机推荐
- HDFS文件读写操作(基础基础超基础)
环境 OS: Ubuntu 16.04 64-Bit JDK: 1.7.0_80 64-Bit Hadoop: 2.6.5 原理 <权威指南>有两张图,下次po上来好好聊一下 实测 读操作 ...
- VS 提示:请考虑使用 app.config 将程序集“XXX”从版本“XX”重新映射到版本“XX”,以解决冲突并消除警告。
具体提示如下: 请考虑使用 app.config 将程序集"System.Web.Http.WebHost, Culture=neutral, PublicKeyToken=31bf3856 ...
- c 语言typedef 和 define的使用和区别
#define是C的指令,用于为各种数据类型定义别名,与typedef 类似,但是有一下几点不同 1,typedef仅限于为类型定义符号名称,而#define不仅可以为类型定义符号名称,也能为数值定义 ...
- Python内置函数(28)——iter
英文文档: iter(object[, sentinel]) Return an iterator object. The first argument is interpreted very dif ...
- angular2 学习笔记 ( 状态管理 state management )
更新 : 2017-12-29 ng5 移除 zone.js https://zhuanlan.zhihu.com/p/29577461 zone 的用途就是拦截游览器事件, 比如 click, a ...
- gradle入门(1-5)创建并运行Web应用
一.使用Gretty运行Web应用 Gretty支持Jetty和Tomcat,它不会被Gradle缺少SLF4J绑定所导致的问题所困扰. 1.配置文件build.gradle buildscript ...
- .net 4种单例模式
转载: https://www.cnblogs.com/dreign/archive/2012/05/08/2490212.html using System; using System.Collec ...
- CentOS ping www.baidu.com 报错 name or service not know
今天尝试安装了centos系统 玩一玩 刚刚装好的操作系统 ping www.baidu.com的时候 报出 name or service not known 查了好多资料,都没有很好的解决 最后 ...
- 高级控件 popwindow 与gridview的组合应用
Gridview 的布局设置 <GridView android:layout_width="wrap_content" android:layout_height=&quo ...
- Linux:nohub启动后台永久进程
nohup 命令运行由 Command参数和任何相关的 Arg参数指定的命令,忽略所有挂断(SIGHUP)信号.在注销后使用 nohup 命令运行后台中的程序.要运行后台中的 nohup 命令,添加 ...