提示:学习使用,仅供参考!
目录
一、解析
使用程序去读取序读取XML中的数据
二、分类
2.1 SAX 解析
基于事件驱动的解析方式,采用串行读取方式,逐行读取,读取一行解析一行。
优
:性能好,属于事件驱动型解析,解析逐行解析,解析速度快
缺
:不能重复使用数据,如果要修改,或者回头查找数据,必须重新从头读取一次
2.2 DOM 解析
官方定义的一套规则,把整个XML读取到内存,以树型结构来存储
优
:重复使用
缺
:解析速度慢,只能解析小型xml
DOM解析解析文档对象模型
三、方式
几乎所有的解析实现,都结合了解析的两种分类
3.1 jdom
- 远古的解析方式,纯利用 Java 对 XML 文档进行解析,实现比较复杂
- 仅使用具体类,而不使用接口
// 工厂对象
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
// DocumentBuilder对象
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
// 输入流
InputStream in = JdomTest.class.getClassLoader().getResourceAsStream("book.xml");
// Document对象
Document document = documentBuilder.parse(in);
// 获取根元素
Element root = document.getDocumentElement();
// 获得节点元素
NodeList bookList = root.getElementsByTagName("book");
// 获得第一个本书
Element student = (Element) studentList.item(0);
// 获得第一本书的姓名
Node stuName = student.getElementsByTagName("name").item(0);
String textContent = stuName.getTextContent();
3.2 dom4j
通过SAX方式读取XML,形成一个DOM存储在内存里面
SAXReader类
方法名 | 说明 |
---|---|
SAXReader() | 创建 DOM4J 解析器对象 |
read( url ):Document | 加载XML文档,生成Document对象 |
Document
方法名 | 说明 |
---|---|
getRootElement() :Element | 获得 XML 文档的根元素对象 |
ELement
方法名 | 说明 |
---|---|
elements() :List< Element > | 获得当前 element 下的所有子元素 |
elements(String name):List< Element > | 获得当前 element 下指定名字为 name 的子元素集合 |
element(String name):Element | 返回当前 element 下指定名字为 name 的第一个子元素 |
getName():String | 获得当前 element 的名字 |
attributeValue(String name):String | 获取属性名为 name 的属性值 |
elementText(子元素名):String | 获得当前元素指定名字的子元素的文本内容 |
getText():String | 得到当前元素的文本内容 |
主要步骤
:
- ① 获取资源文档输入流:
InputStream
- ② 创建解析器:
SAXReader
- ③ 通过解析器的
read()
方法将 XML 文件读取到内存中,生成一个Document对象树
- ④ 获得文档元素(根元素、子元素…)
- ⑤ 获得或修改对应元素值
// 获得资源文档的输入流
InputStream in = Dom4jTest.class.getClassLoader().getResourceAsStream("book.xml");
// 生成 document 对象
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(in);
// 获得根元素对象
Element root = document.getRootElement();
// 获得 root 下元素名为 "book" 的所有子节点
List<Element> books = root.elements("book");
// 获得 root 下的所有子元素
List<Element> all = root.elements();
// 获得具体某个节点
Element book = (Element) books.get(0)
Element firstSubEl = root.element("book")
// 获得根元素的名字:books
String rootName = root.getName()
// 获得元素属性值
String value = book.atttributeValue("id")
// 获得子元素的文本内容:西游记
String text = book.elementText("name");
String text1 = firstSubEl.element("name").getText()
3.2.1 增强 for 循环遍历
InputStream in = Dom4JForEach.class.getClassLoader().getResourceAsStream("book.xml");
// 生成 document 对象
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(in);
Element root = document.getRootElement();
List<Element> elementList = root.elements("book");
List<Book> bookList = new ArrayList<>();
for (Element el : elementList) {
Book book = new Book();
book.setId(Integer.valueOf(el.element("id").getText()));
book.setName(el.element("name").getText());
book.setAuthor(el.element("author").getText());
book.setPrice(Integer.valueOf(el.element("price").getText()));
bookList.add(book);
}
3.2.2 迭代器遍历
InputStream in = Dom4JForEach.class.getClassLoader().getResourceAsStream("book.xml");
// 生成 document 对象
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(in);
Element root = document.getRootElement();
Iterator<Element> elIterator = root.elementIterator();
Book book = new Book();
while (elIterator.hasNext()) {
Element el = elIterator.next();
String name = el.element("name").getText();
if (name.equals(bookName)) {
book.setName(name);
book.setId(Integer.valueOf(el.element("id").getText()));
book.setAuthor(el.elementText("author"));
book.setPrice(Integer.valueOf(el.element("price").getText()));
break;
}
}
3.3 XPath 检索技术
总是使用整个XML文档,即从头到尾依次遍历解析,性能是非常低下的
而 XPath 则提供了 XML文档内检索的能力,能够根据条件在XML里面查找需要的内容、元素、节点。
步骤:
- 导入jar包 (dom4j 和 jaxen-1.1.2.jar)
- 获取资源文档的输入流,创建解析器
SAXReader
,通过调用解析器的read()
方法将资源文档读取到内存中,生成document
对象 - 利用 Document 中与 XPath 有关的 API 对文档进行解析操作
方法名 | 说明 |
---|---|
selectNodes(“表达式”):List< Node > or List < Element > | 获得符合“表达式”的所有元素集合 |
selelctSingleNode(“表达式”):Node or Element(需要强转) | 获得符合“表达式”的唯一元素 |
3.3.1 检索方案
绝对路径
:selectNodes(“/根元素/子元素/孙元素/…”)
- /books/book[id=‘2’]:查询id为2的book元素
- /books/book[1]:第一个子元素是book的元素
- /books/book/price/text():所有book子元素下面的price子元素的文本内容(text)
- / books/book[price>65]/price:所有book子元素下面的price子元素的text且必须大于65
相对路径
:selectNodes(“./子元素/…”)
全文检索
:
- selectNodes(“//contact”):找到文档任何位置的所有 contact 元素对象
- selelctNodes(“//contact/name”):找到所有 contact 的 name 元素
属性检索
:
- /books/book[@name=’value’]:找到 books 下有属性为 name 且值为 value 的book元素
- /books/book[@name]:找到 books 下有属性为 name 的 book元素