XML解析

提示:学习使用,仅供参考!


一、解析

使用程序去读取序读取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元素
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值