Dom解析原理:xml解析器一次性将xml文档加载到内存中,而后在内存中构建一颗Document对象树。在经过Document对象获得树上的节点对象,经过节点对象操做文档内容。java
Dom4J 经常使用的对象: node
SAXReader:读取 xml 文件到 Document 树结构文件对象 web
Document:是一个 xml 文档对象树,类比 Html 文档对象。 编程
Element:元素节点。经过 Document 对象能够查找单个元素 dom
使用步骤:函数
( 导入 Dom4J.jar 包 dom4j-1.6.1.jar )工具 1.建立SaxReader解析器ui SAXReader Reader = new SAXReader();编码 2.经过read方法得到Document对象lua Document document = Reader.read("conf/student.xml"); Element rootEle = document.getRootElement(); 4.4.经过迭代器遍历xml文档 Iterator it = rootEle.elementIterator(); while (it.hasNext()) { Element stusEle = (Element) it.next(); Iterator it01 = stusEle.elementIterator(); while (it01.hasNext()) { Element stuEle = (Element) it01.next(); System.out.println(stuEle.getStringValue()); } System.out.println("--------------------------------"); } Dom4j官方文档中有quick start 能够帮助咱们快速使用该技术!
|
Sax解析工具是sun公司提供的,内至于jdk中。Org.xml.sax.*;
sax解析原理:事件驱动,边读边写
当遇到开始标签时,自动调用startElement(String url,String localName,String qname,Attribute attribute)方法;当遇到文本时,自动执行characters(char[]ch,int start,int length);当遇到结束标签时自动执行endElement(String url,String localName,String qName)方法。
<结束标签以’/’做为标志,结束方法比开始方法只少一个attribute 参数>
使用步骤:
1.建立解析工厂 //SAXParserFactory 构造方法被保护,只能经过 .newInstance()方法建立实例 SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); 2.建立解析器 //经过工厂建立解析器 SAXParser saxParser = saxParserFactory.newSAXParser(); 3.执行parser方法 // 执行 parser 方法,传入两个参数:xml 文件路径、事件处理器 saxParser.parse("conf/student.xml", new MyDefaultHandler()); 所谓事件处理器是指 一个继承与 DefaultHandler 的类,进行重写其中的startElement()、characters()、endElement()方法实现相应的处理。 建立一个类,继承 DefaultHander 类,重写三个方法: A、 startElement 获取开始标签,重要的两个参数说明 a、 qName:把标签名称返回 b、 attributes:返回标签中的属性对象 B、 character 获取标签文本内容 C、 endElement 获取结束标签
|
============DOM解析 vs SAX解析 ========
DOM解析 |
SAX解析 |
原理: 一次性加载xml文档,不适合大容量的文件读取 |
原理: 加载一点,读取一点,处理一点。适合大容量文件的读取 |
DOM解析能够任意进行增删改为 |
SAX解析只能读取 |
DOM解析任意读取任何位置的数据,甚至往回读 |
SAX解析只能从上往下,按顺序读取,不能往回读 |
DOM解析面向对象的编程方法(Node,Element,Attribute),Java开发者编码比较简单。 |
SAX解析基于事件的编程方法。java开发编码相对复杂。 |
主要是用于快速获取所需的节点对象。
选择节点:XPath 使用路径表达式在 XML 文档中选取节点。节点是经过沿着
路径或者 step 来选取的。下面列出了最有用的路径表达式:
表达式 描述
nodename 选取此节点的全部子节点。
/ 从根节点选取。
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点。
.. 选取当前节点的父节点。
@ 选取属性。
text()获取节点的文本内容函数
使用步骤:
// 1.经过DocumentBuilderFactor建立解析工厂 DocumentBuilderFactory builderFactory = DocumentBuilderFactory .newInstance(); // 2.经过工厂得到解析器 DocumentBuilder builder = builderFactory.newDocumentBuilder(); // 3.经过parser方法获取Document Document document = builder.parse("conf/books.xml"); // 4.获取xpath对象 XPath xpath = XPathFactory.newInstance().newXPath(); // 5.获取 bookstore 节点下 book 属性 category 值为 web 下的第二个title 节点的文本内容 String exp = "/bookstore/book[@category='web'][2]/title/text()"; String tit = (String) xpath.evaluate(exp, document, XPathConstants.STRING); System.out.println(tit); // 获取 bookstore 节点下 book 属性 category 值为 web 的 titile 属性为 en 的节点内容 String expEn = "/bookstore/book[@category='web']/title[@lang ='en']/text()"; String titEN = (String) xpath.evaluate(expEn, document, XPathConstants.STRING); System.out.println(titEN); // 获取 bookstore 下 book 属性 category 值为 cooking 的 title 的 lang 属性的值 String expLan = "/bookstore/book[@category='cooking']/title/@lang"; String lang = (String) xpath.evaluate(expLan, document, XPathConstants.STRING); System.out.println(lang);
|
// 获取 bookstore 节点下全部 book 的节点集合(遍历该文档) String expB = "/bookstore/book"; NodeList books =(NodeList) xpath.evaluate(expB, document, XPathConstants.NODESET); for (int i = 0; i < books.getLength(); i++) { Element book =(Element) books.item(i); String title =(String) xpath.evaluate("title/text()", book, XPathConstants.STRING); String author =(String) xpath.evaluate("author/text()", book, XPathConstants.STRING); String year =(String) xpath.evaluate("year", book, XPathConstants.STRING); String price =(String) xpath.evaluate("price", book, XPathConstants.STRING); System.out.println(title+" "+author+" "+year+" "+price); System.out.println("----------------------------------------------------"); } |
开发中Dom4j和XPath结合使用很是灵活,因此应用普遍!
使用步骤:
1)导入xPath支持jar包 。 jaxen-1.1-beta-6.jar 2)使用xpath方法 List<Node> selectNodes("xpath表达式"); 查询多个节点对象 Node selectSingleNode("xpath表达式"); 查询一个节点对象 |
//1.SAXReader解析器 SAXReader reader = new SAXReader(); //2.经过read方法得到Document Document document =reader.read("conf/bookstore.xml"); //3.xpath路劲 String titlePath ="/bookstore/book[1]/title"; Element element =(Element) document.selectObject(titlePath); String title =element.getStringValue(); System.out.println(title); |