JAVA XML读取-DOM4J、JDOM、DOM、SAX四大方法总结
来源:互联网 发布:杭州 人工智能 医院 编辑:程序博客网 时间:2024/06/05 02:02
XML-的读写
表现:以”.xml”为文件扩展名的文件。
作用:通过XML来传输不同设备的数据,省去了繁琐的交互。
注意:其实四种会一种就行了,建议--DOM4J--。
在Java程序中如何获取xml文件的内容?
一、在Java程序中读取xml文件的过程中也称为-----解析xml文件。
二、解析的目的:获取节点名、节点值、属性名、属性值。
这为XML的文件。
<?xml version="1.0" encoding="UTF-8"?><bookstore><book id="1"><name>我</name><author>I</author><year>2017</year><price>888</price></book><book id="2"><name>你</name><year>2017</year><price>999</price><language>English</language></book></bookstore>
三、四种解析方法:(非官方需要另外下载jar包 )
DOM[官方提供]:
DOM为XML文档定义了一组接口。解析器读入整个文档,然后构建一个驻留内存的树结构,然后DOM接口就是用来操作这个树结构。
优点:文档储存在电脑内存中或者项目里面,便于操作。便于删除、修改、重新排列等。
缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间;使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)。
准备思路:
//1.创建一个DocumentBuilderFactory的对象
//2.创建一个DocumentBuilder的对象
//3.用DocumentBuilder的对象中的parse方法加载xml文件,并用Document对象
//4.利用document中的.getElementsByTagName获取内容,获取所有book节点的集合
//5.通过NodeList的getLength()方法可以获取bookList的长度。
//6.遍历每一个节点的内容
常用的节点类型
节点类型NodeTypeNamed ConstantnodeValue的返回值Element1element name#textAttr2属性名称属性值Text3#text节点内容解析代码为:(已经实机操作了)----注意:文件需要用org.w3c.dom包。复制后.改为自己包名。也可以将内容封装成一个类方便使用。
package com.zenglei.test;import java.io.IOException;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import org.w3c.dom.Document;import org.w3c.dom.NamedNodeMap;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import org.xml.sax.SAXException;public class Dome2 {public static void main(String arge[]){DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();try {DocumentBuilder db = dbf.newDocumentBuilder();Document document = db.parse("books.xml");//"books.xml"是文件名称序将文件".xml"拉进项目中,才能找到。或者给予绝对路径NodeList bookList = document.getElementsByTagName("book");System.out.println("一共有" + bookList.getLength() + "内容");for (int i = 0; i < bookList.getLength(); i++) {//循环内容System.out.println("----开始遍历第" + (i + 1) + "本书的内容----");Node book = bookList.item(i);//获取book节点的所有属性集合NamedNodeMap attrs = book.getAttributes();System.out.println("第 " + (i + 1) + "本书共有" + attrs.getLength() + "个属性");//遍历book的属性for (int j = 0; j < attrs.getLength(); j++) {//通过item(index)方法获取book节点的某一个属性Node attr = attrs.item(j);System.out.print("属性名:" + attr.getNodeName());System.out.println("属性值:" + attr.getNodeValue());}/* * 前提已经知道属性值//前提:已经知道book节点有且只能有1个id属性////将book节点进行强制类型转换,转换成Element类型//Element book = (Element) bookList.item(i);////通过getAttribute("id")方法获取属性值//String attrValue = book.getAttribute("id");//System.out.println("id属性的属性值为" + attrValue);*/NodeList childNodes = book.getChildNodes();//解析book节点的子节点//遍历childNodes获取每个节点的节点名和节点值System.out.println("第" + (i+1) + "本书共有" + childNodes.getLength() + "个子节点");for (int k = 0; k < childNodes.getLength(); k++) {//区分出text类型的node以及element类型的nodeif (childNodes.item(k).getNodeType() == Node.ELEMENT_NODE) {System.out.print("第" + (k + 1) + "个节点的节点名:" + childNodes.item(k).getNodeName());System.out.println("节点值是:" + childNodes.item(k).getFirstChild().getNodeValue());}}System.out.println("----结束遍历第" + (i + 1) + "本书的内容----");}} catch (ParserConfigurationException | SAXException | IOException e) {e.printStackTrace();}}}在项目的过程中,需要拿到指定的数据。这时候需要做的是,将这个封装成另外一个方法,然后将数据另外存储到另一个方法,再简单优化的取出。
SAX[官方提供]:
SAX方式解析xml步骤:
1.通过SAXParserFactory的静态newInstance()方法获取SAXParserFactory实例factory。
2.通过SAXParserFactory实例的newSAXParser()方法返回SAXParser实例Parser。
3.创建一个类继承DefaultHandler 并重写其中的一些方法进行业务处理,创建该类对象handler用父类的startElement方法遍历开始标签,用endElement方法遍历结束标签,startDocument方法标志解析开始,endDocument方法标志解析结束。
4.用SAXParser对象的parse方法接收XML文件选择传入String uri 和 Handler对象的parse方法praser.parse("books.xml",handler);。
SAXTest.class----(已实机操作)注意:Book是自己的类,请勿导入"import java.awt.print.Book;"这个包,有些系统会自动选择这个包。
package com.zenglei;import java.io.IOException;import javax.xml.parsers.ParserConfigurationException;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.SAXException;public class SAXTest {public static void main(String[] args) {SAXParserFactory factory = SAXParserFactory.newInstance();//创建实例try {SAXParser parser = factory.newSAXParser();//实例方法SAXParserHandler handler = new SAXParserHandler();//采用handler更新数据parser.parse("books.xml", handler);System.out.println("现在共有" + handler.getBookList().size()+ "本书");for (Book book : handler.getBookList()) {//超级循环,不懂的同学自己百度System.out.println(book.getId());System.out.println(book.getName());System.out.println(book.getAuthor());System.out.println(book.getYear());System.out.println(book.getPrice());System.out.println(book.getLanguage());}} catch (ParserConfigurationException | SAXException | IOException e) {e.printStackTrace();}}}SAXParserHandler.class-----注:我这边为了方便了解而弄了解析xml,如果项目需要就把println这个适当的修改一下。
package com.zenglei;import java.util.ArrayList;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;public class SAXParserHandler extends DefaultHandler{String value = null;Book book = null;private ArrayList<Book> bookList = new ArrayList<Book>();public ArrayList<Book> getBookList() {return bookList;}int bookIndex = 0;/** * 用来标识解析开始 */public void startDocument() throws SAXException {super.startDocument();System.out.println("SAX解析开始");}/** * 用来标识解析结束 */public void endDocument() throws SAXException {// TODO Auto-generated method stubsuper.endDocument();System.out.println("SAX解析结束");}/** * 解析XML元素 */public void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {//调用DefaultHandler类的startElement方法super.startElement(uri, localName, qName, attributes);if (qName.equals("book")) {bookIndex++;//创建一个book对象book = new Book();//开始解析book元素的属性System.out.println("----开始遍历某一本书的内容----");////已知book元素下属性的名称,根据属性名称获取属性值//String value = attributes.getValue("id");//System.out.println("book的属性值是:" + value);//不知道book元素下属性的名称以及个数,如何获取属性名以及属性值int num = attributes.getLength();for(int i = 0; i < num; i++){System.out.print("book元素的第" + (i + 1) + "个属性名是:"+ attributes.getQName(i));System.out.println("---属性值是:" + attributes.getValue(i));if (attributes.getQName(i).equals("id")) {book.setId(attributes.getValue(i));}}}else if (!qName.equals("name") && !qName.equals("bookstore")) {System.out.print("节点名是:" + qName + "---");}}public void endElement(String uri, String localName, String qName)throws SAXException {//调用DefaultHandler类的endElement方法super.endElement(uri, localName, qName);//判断是否针对一本书已经遍历结束if (qName.equals("book")) {bookList.add(book);book = null;System.out.println("----结束遍历某一本书的内容----");}else if (qName.equals("name")) {book.setName(value);}else if (qName.equals("author")) {book.setAuthor(value);}else if (qName.equals("year")) {book.setYear(value);}else if (qName.equals("price")) {book.setPrice(value);}else if (qName.equals("language")) {book.setLanguage(value);}}public void characters(char[] ch, int start, int length)throws SAXException {super.characters(ch, start, length);value = new String(ch, start, length);if (!value.trim().equals("")) {System.out.println("节点值是:" + value);}}}Book.class----this这个是为了找到
package com.zenglei;public class Book {private String id;private String name;private String author;private String year;private String price;private String language;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 getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public String getYear() {return year;}public void setYear(String year) {this.year = year;}public String getPrice() {return price;}public void setPrice(String price) {this.price = price;}public String getLanguage() {return language;}public void setLanguage(String language) {this.language = language;}}
JDOM[非官方]:
package com.zenglei;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;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;public class JDOMTest {private static ArrayList<Book> booksList = new ArrayList<Book>();public static void main(String[] args) {// 1.创建一个SAXBuilder的对象SAXBuilder saxBuilder = new SAXBuilder();InputStream in;try {// 2.创建一个输入流,将xml文件加载到输入流中in = new FileInputStream("books.xml");InputStreamReader isr = new InputStreamReader(in, "UTF-8");// 3.通过saxBuilder的build方法,将输入流加载到saxBuilder中Document document = saxBuilder.build(isr);// 4.通过document对象获取xml文件的根节点Element rootElement = document.getRootElement();// 5.获取根节点下的子节点的List集合List<Element> bookList = rootElement.getChildren();// 继续进行解析for (Element book : bookList) {Book bookEntity = new Book();System.out.println("----开始解析第" + (bookList.indexOf(book) + 1)+ "书----");List<Attribute> attrList = book.getAttributes();// 解析book的属性集合// //知道节点下属性名称时,获取节点值// book.getAttributeValue("id");// 遍历attrList(针对不清楚book节点下属性的名字及数量)for (Attribute attr : attrList) {String attrName = attr.getName();// 获取属性名String attrValue = attr.getValue();// 获取属性值System.out.println("属性名:" + attrName + "----属性值:"+ attrValue);if (attrName.equals("id")) {bookEntity.setId(attrValue);}}// 对book节点的子节点的节点名以及节点值的遍历List<Element> bookChilds = book.getChildren();for (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) + 1)+ "书======");booksList.add(bookEntity);bookEntity = null;//已知道XML内有什么如id.Name,就可以这样获取。//System.out.println(booksList.size());//System.out.println(booksList.get(0).getId());//System.out.println(booksList.get(0).getName());}} catch (FileNotFoundException e) {e.printStackTrace();} catch (JDOMException | IOException e) {e.printStackTrace();}}}Book.class
package com.zenglei;public class Book {private String id;private String name;private String author;private String year;private String price;private String language;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 getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public String getYear() {return year;}public void setYear(String year) {this.year = year;}public String getPrice() {return price;}public void setPrice(String price) {this.price = price;}public String getLanguage() {return language;}public void setLanguage(String language) {this.language = language;}}
DOM4J[非官方]:
下载地址
http://pan.baidu.com/s/1slrmWJb 百度网盘
网站下载地址:https://sourceforge.net/projects/dom4j/?source=typ_redirect 等待一下出现点击下载即可。
导入jar包方法:Project---->Properties---->Java Build Path---->Libraries---->Add External JARs...---->选择"dom4j-1.6.1.jar"包。
百度解释:dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的。在IBM developerWorks上面还可以找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评测,所以可以知道dom4j无论在哪个方面都是非常出色的。如今可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这已经是必须使用的jar包, Hibernate也用它来读写配置文件。
好处:具有性能优异、功能强大和极其易使用的特点,它的性能超过sun公司官方的dom技术,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。
坏处:一点点,但都不是问题。
已经实机操作---
DOM4JTest.class-----注意:Book是自己的类,请勿让系统帮你选择import。复制的时候,注意一下,我导进去的包是什么名称,因为很多类重复了。
package com.zenglei;import java.io.File;import java.util.ArrayList;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 DOM4JTest {private static ArrayList<Book> bookList = new ArrayList<Book>();public static void main(String[] args) {// 解析books.xml文件// 创建SAXReader的对象readerSAXReader reader = new SAXReader();try {// 通过reader对象的read方法加载books.xml文件,获取docuemnt对象。Document document = reader.read(new File("books.xml"));// 通过document对象获取根节点bookstoreElement bookStore = document.getRootElement();// 通过element对象的elementIterator方法获取迭代器Iterator it = bookStore.elementIterator();// 遍历迭代器,获取根节点中的信息(书籍)while (it.hasNext()) {System.out.println("-----开始-----");Element book = (Element) it.next();List<Attribute> bookAttrs = book.attributes();// 获取book的属性名以及 属性值for (Attribute attr : bookAttrs) {System.out.println("属性名:" + attr.getName() + "--属性值:"+ attr.getValue());}Iterator itt = book.elementIterator();while (itt.hasNext()) {Element bookChild = (Element) itt.next();System.out.println("节点名:" + bookChild.getName() + "--节点值:" + bookChild.getStringValue());}System.out.println("-----结束-----");}} catch (DocumentException e) {e.printStackTrace();}}}Book.class
package com.zenglei;public class Book {private String id;private String name;private String author;private String year;private String price;private String language;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 getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public String getYear() {return year;}public void setYear(String year) {this.year = year;}public String getPrice() {return price;}public void setPrice(String price) {this.price = price;}public String getLanguage() {return language;}public void setLanguage(String language) {this.language = language;}}
总结
- JAVA XML读取-DOM4J、JDOM、DOM、SAX四大方法总结
- java中四种操作(dom、sax、jdom、dom4j)xml方法
- JAVA解析xml DOM SAX JDOM DOM4J
- XML(DOM SAX JDOM DOM4J)
- 在java环境下读取xml文件的方法主要有4种:DOM、SAX、JDOM、JAXB、Dom4J
- Dom、Dom4J、Sax、JDom、读取(解析)Xml
- xml文档解析之DOM、SAX、JDOM、Dom4J总结
- Java解析xml、解析xml四种方法、DOM、SAX、JDOM、DOM4j、XPath
- 四种方法解析XML文档:Dom、SAX、JDOM、dom4j
- 四种方法解析XML文档:Dom、SAX、JDOM、dom4j
- Java-详解Java解析XML的四种方法—DOM/SAX/jdom/dom4j
- Java四种方式操作 xml,DOM|SAX|JDOM|DOM4J
- Java中四种XML解析技术对比(Dom、Sax、Dom4j JDom)
- Java四种方式操作 xml,DOM|SAX|JDOM|DOM4J
- java分别采用dom,sax,jdom,dom4j操作xml
- Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)
- Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)
- Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)
- 有共鸣的
- 为什么程序员一定要会用Google和Stack Overflow?
- Altium Designer 笔记(零)总纲
- quartz框架如何设置只有一个定时任务但是可以多个时间段来执行
- 【BZOJ 4176】 Lucas的数论 - 杜教筛
- JAVA XML读取-DOM4J、JDOM、DOM、SAX四大方法总结
- 四大组件之activity(生命周期)
- 持久化消息队列之MEMCACHEQ
- 【iOS开发】ld: library not found for -lPods-iDoctors-AFNetworking 编译报错Xcode
- Unable to locate package xxx
- 获取当前网络和地理位置
- 主流视频编码标准的发展
- Android编程至高武学之《如来神掌》第二式~金顶佛灯
- jQuery学习笔记(四) 事件及特效