标签:
Dom解析原理:xml解析器一次性将xml文档加载到内存中,然后在内存中构建一颗Document对象树。在通过Document对象得到树上的节点对象,通过节点对象操作文档内容。
Dom4J 常用的对象:
SAXReader:读取 xml 文件到 Document 树结构文件对象
Document:是一个 xml 文档对象树,类比 Html 文档对象。
Element:元素节点。通过 Document 对象可以查找单个元素
使用步骤:
( 导入 Dom4J.jar 包 dom4j-1.6.1.jar ) 1.创建SaxReader解析器 SAXReader Reader = new SAXReader(); 2.通过read方法获得Document对象 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); |
标签:
原文地址:http://www.cnblogs.com/he-shao/p/5860932.html