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[官方提供]:

源代码:http://pan.baidu.com/s/1pK7pGZD   百度云盘

SAX是为了解决DOM的问题而出现的的,名为SAX的全称是Simple APIs for XML,也即XML简单应用程序接口。SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式。
好处:内存要求低,效率高,实现简单。当解析大型XML文件时使用SAX是比较合适的。
缺点: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[非官方]:

jar包下载方法:目前是2.0.6
http://pan.baidu.com/s/1sluAD0D 百度云盘(更新于2017-1)
网址下载:http://www.jdom.org/downloads/   进去后点击"JODM 2.0.6 is the latest stable build."

导入jar包方法:Project---->Properties---->Java Build Path---->Libraries---->Add External JARs...---->选择"jdom-2.0.6.jar"包。

JDOM.class -----注意:Book.class是自己创建的类。org.jdom2.*是我们自己从JDOM的jar包,需要导入。如果:还是有报错,就是系统帮你import 时候,自动导入不需要的。
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;}}

总结

通过了解,目前的为DOM4J解析XML为方便。所以四种当中学会DOM4J一种就行。
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 能率热水器震动声大怎么办 车底盘磕了漏油怎么办 法士特变速箱的随动阀漏气了怎么办 大灯随动afs失灵怎么办 2017款迈腾大灯随动故障怎么办 微信gps信号不好怎么办 苹果6s定位不准怎么办 电脑不读取u盘怎么办 注塑机上的料烤坨了怎么办 智能锁电机坏了怎么办 注塑机加热嘴内扣突了怎么办 tpu粘在螺杆上怎么办 注塑机锁模时会有射退动作怎么办 电动车刹车油泵不打油怎么办 cad转pdf颜色浅怎么办 松下多功能传真一体机卡纸怎么办 无刷电机坏了怎么办 6kv高压电机绝缘不合格怎么办? 400t油压机下降太慢怎么办 无法连线到服务器1~1怎么办? 数控车床车角度不亮怎么办 超市存包柜的票不见了怎么办 交货期来不及导致船期延误怎么办 跑1000米中途累怎么办 手指被机器压烂怎么办 机械手不能回归原点该怎么办 前缘送纸纸板翘怎么办 三菱AL 1R.2报警怎么办 工作好但领导不好伺候怎么办 孕妇憋尿憋的小腹疼怎么办 怀孕憋尿憋的小腹疼怎么办 半夜憋尿憋的小腹疼怎么办 新生儿大便次数较多怎么办 母猎生下三天没有奶怎么办 孩孑大便干不爱喝水怎么办 发那科1050报警怎么办 plc模块bf亮了怎么办 plc模块df亮了怎么办 西门子触摸屏进不了主画面怎么办 pos机显示白屏怎么办 洗衣机的门坏了怎么办