三、JDOM解析
特征:
1、仅使用具体类,而不使用接口。
2、API大量使用了Collections类。
1 import org.jdom2.Attribute; 2 import org.jdom2.Document; 3 import org.jdom2.Element; 4 import org.jdom2.JDOMException; 5 import org.jdom2.input.*; 6 import java.io.*; 7 import java.util.ArrayList; 8 import java.util.List; 9 10 public class JDOMTest { 11 private static ArrayList<Book> booksList = new ArrayList<Book>(); 12 public static void main(String[] args) { 13 // 进行对books.xml文件的JDOM解析 14 // 准备工作 15 // 1.创建一个SAXBuilder的对象 16 SAXBuilder saxBuilder = new SAXBuilder(); 17 try { 18 // 2.创建一个输入流,将xml文件加载到输入流中 19 InputStream in = new FileInputStream("src/book.xml"); 20 InputStreamReader isr = new InputStreamReader(in, "UTF-8"); 21 // 3.通过saxBuilder的build方法,将输入流加载到saxBuilder中 22 Document document = saxBuilder.build(isr); 23 // 4.通过document对象获取xml文件的根节点 24 Element rootElement = document.getRootElement(); 25 // 5.获取根节点下的子节点的List集合 26 List<Element> bookList = rootElement.getChildren(); 27 // 继续进行解析 28 for (Element book : bookList) { 29 Book bookEntity = new Book(); 30 System.out.println("======开始解析第" + (bookList.indexOf(book) + 1) 31 + "书======"); 32 // 解析book的属性集合 33 List<Attribute> attrList = book.getAttributes(); 34 // 知道节点下属性名称时,获取节点值 35 // book.getAttributeValue("id"); 36 // 遍历attrList(针对不清楚book节点下属性的名字及数量) 37 for (Attribute attr : attrList) { 38 // 获取属性名 39 String attrName = attr.getName(); 40 // 获取属性值 41 String attrValue = attr.getValue(); 42 System.out.println("属性名:" + attrName + "----属性值:" 43 + attrValue); 44 if (attrName.equals("id")) { 45 bookEntity.setId(attrValue); 46 } 47 } 48 // 对book节点的子节点的节点名以及节点值的遍历 49 List<Element> bookChilds = book.getChildren(); 50 for (Element child : bookChilds) { 51 System.out.println("节点名:" + child.getName() + "----节点值:" 52 + child.getValue()); 53 if (child.getName().equals("name")) { 54 bookEntity.setName(child.getValue()); 55 } 56 else if (child.getName().equals("author")) { 57 bookEntity.setAuthor(child.getValue()); 58 } 59 else if (child.getName().equals("year")) { 60 bookEntity.setYear(child.getValue()); 61 } 62 else if (child.getName().equals("price")) { 63 bookEntity.setPrice(child.getValue()); 64 } 65 else if (child.getName().equals("language")) { 66 bookEntity.setLanguage(child.getValue()); 67 } 68 } 69 System.out.println("======结束解析第" + (bookList.indexOf(book) + 1) 70 + "书======"); 71 booksList.add(bookEntity); 72 bookEntity = null; 73 System.out.println(booksList.size()); 74 System.out.println(booksList.get(0).getId()); 75 System.out.println(booksList.get(0).getName()); 76 77 } 78 } catch (FileNotFoundException e) { 79 e.printStackTrace(); 80 } catch (JDOMException e) { 81 e.printStackTrace(); 82 } catch (IOException e) { 83 e.printStackTrace(); 84 } 85 } 86 }
======开始解析第1书====== 属性名:id----属性值:1 节点名:name----节点值:冰与火之歌 节点名:author----节点值:乔治马丁 节点名:year----节点值:2014 节点名:price----节点值:89 ======结束解析第1书====== 1 1 冰与火之歌 ======开始解析第2书====== 属性名:id----属性值:2 节点名:name----节点值:安徒生童话 节点名:year----节点值:2004 节点名:price----节点值:77 节点名:language----节点值:English ======结束解析第2书====== 2 1 冰与火之歌
四、DOM4J解析
特征:
1、JDOM的一种智能分支,它合并了许多超出基本XML文档表示的功能。
2、它使用接口和抽象基本类方法。
3、具有性能优异、灵活性好、功能强大和极端易用的特点。
4、是一个开放源码的文件
1 import org.dom4j.Attribute; 2 import org.dom4j.Document; 3 import org.dom4j.DocumentException; 4 import org.dom4j.Element; 5 import org.dom4j.io.SAXReader; 6 import java.io.File; 7 import java.util.ArrayList; 8 import java.util.Iterator; 9 import java.util.List; 10 11 public class DOM4JTest { 12 private static ArrayList<Book> bookList = new ArrayList<Book>(); 13 public static void main(String[] args) { 14 // 解析books.xml文件 15 // 创建SAXReader的对象reader 16 SAXReader reader = new SAXReader(); 17 try { 18 // 通过reader对象的read方法加载books.xml文件,获取docuemnt对象。 19 Document document = reader.read(new File("src/book.xml")); 20 // 通过document对象获取根节点bookstore 21 Element bookStore = document.getRootElement(); 22 // 通过element对象的elementIterator方法获取迭代器 23 Iterator it = bookStore.elementIterator(); 24 // 遍历迭代器,获取根节点中的信息(书籍) 25 while (it.hasNext()) { 26 System.out.println("=====开始遍历某一本书====="); 27 Element book = (Element) it.next(); 28 // 获取book的属性名以及 属性值 29 List<Attribute> bookAttrs = book.attributes(); 30 for (Attribute attr : bookAttrs) { 31 System.out.println("属性名:" + attr.getName() + "--属性值:" 32 + attr.getValue()); 33 } 34 Iterator itt = book.elementIterator(); 35 while (itt.hasNext()) { 36 Element bookChild = (Element) itt.next(); 37 System.out.println("节点名:" + bookChild.getName() + "--节点值:" + bookChild.getStringValue()); 38 } 39 System.out.println("=====结束遍历某一本书====="); 40 } 41 } catch (DocumentException e) { 42 e.printStackTrace(); 43 } 44 } 45 }
=====开始遍历某一本书===== 属性名:id--属性值:1 节点名:name--节点值:冰与火之歌 节点名:author--节点值:乔治马丁 节点名:year--节点值:2014 节点名:price--节点值:89 =====结束遍历某一本书===== =====开始遍历某一本书===== 属性名:id--属性值:2 节点名:name--节点值:安徒生童话 节点名:year--节点值:2004 节点名:price--节点值:77 节点名:language--节点值:English =====结束遍历某一本书=====
Final:比较总结
DOM4J性能最好,连Sun的JAXM也在用DOM4J。目前许多开源项目中大量采用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文件。如果不考虑可移植性,那就采用DOM4J。
JDOM和DOM在性能测试时表现不佳,在测试10M文档时内存溢出。在小文档情况下还值得考虑使用DOM和JDOM。虽然JDOM的开发者已经说明他们期望在正式发行版前专注性能问题,但是从性能观点来看,它确实没有值得推荐之处。另外,DOM仍是一个非常好的选择。DOM实现广泛应用于多种编程语言。它还是许多其它与XML相关的标准的基础,因为它正式获得W3C推荐(与基于非标准的Java模型相对),所以在某些类型的项目中可能也需要它(如在JavaScript中使用DOM)。
SAX表现较好,这要依赖于它特定的解析方式-事件驱动。一个SAX检测即将到来的XML流,但并没有载入到内存(当然当XML流被读入时,会有部分文档暂时隐藏在内存中)。
原文地址:https://www.cnblogs.com/longqingyang/p/5577937.html