概念
操作xml文档,将文档中的数据读取道内存中
面试题——解析xml方式(思想) DOM:将标记语言文档一次性加载进内存,形成一个dom树
优点:操作方便,可以对文档进行CRUD(增删改查)的任何操作
缺点:比较消耗内存
SAX:逐行读取,基于事件驱动的 ps:读取一行释放一行,所以是基于事件驱动,例如读取到title我应该怎么样···等
总结:在移动端使用SAX思想,在服务端使用DOM思想
xml常见解析器
JAXP:sun公司提供的解析器,支持dom和sax两种思想,但是性能不高,所以一般不用
DOM4J:一款非常优秀的解析器
jsoup:它是用来解析html的,但是因为特别好用,就也来解析xml了
PULL:Android操作系统内置解析器,它是sax方式的
jsoup解析器的使用 步骤
1、导入jar包
2、获取document对象
3、获取对应的标签Element对象
4、获取数据
代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 //2. 获取Document对象,根据xml 文档获取 //2.1 获取student.xml的path String path = JsoupDemo1.class .getClassLoader().getResource("student.xml").getPath(); //2.2 解析xml 文档,加载文档进内存,获取dom树 Document document = Jsoup.parse(new File(path ), "utf-8"); //3. 获取元素对象 Element Elements elements = document.getElementsByTag("name"); System .out .println(elements.size());//3.1 获取第一个name 的Element对象 Element element = elements.get (0 ); //3.2 获取数据 String name = element.text(); System .out .println(name );
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <?xml version="1.0" encoding="UTF-8" ?> <students > <student number ="a_0001" > <name id ="a" > <xing > 张</xing > <ming > 三</ming > </name > <age > 18</age > <sex > male</sex > </student > <student number ="a_0002" > <name > jack</name > <age > 18</age > <sex > female</sex > </student > </students >
对象的使用
Jsoup:工具类,可以解析html或者xml文档,返回document
parse解析方法:一、提供文件路径与字符编码 二、直接提供字符串 三、通过网络路径解析,需要提供Url对象与超时时间
Document:文档对象,地表内存中的dom树
getElementById(String id)
:根据id属性值获取唯一的element对象
getElementsByTag(String tagName)
:根据标签名称获取元素对象集合
getElementsByAttribute(String key)
:根据属性名称获取元素对象集合
getElementsByAttributeValue(String key, String value)
:根据对应的属性名和属性值获取元素对象集合
Elements:元素Element对象的集合,可以当作Arraylist<Element>
使用
Element:元素对象
获取子元素对象
getElementById(String id)
:根据id属性值获取唯一的element对象
getElementsByTag(String tagName)
:根据标签名称获取元素对象集合
getElementsByAttribute(String key
):根据属性名称获取元素对象集合
getElementsByAttributeValue(String key, String value)
:根据对应的属性名和属性值获取元素对象集合
获取属性值
String attr(String key)
:根据属性名称获取属性值
获取文本内容
String text()
:获取文本内容
String html()
:获取标签体的所有内容(包括字标签的字符串内容)
Node:节点对象
快捷查询方式:
selector:选择器
使用的方法:Elements select(String cssQuery)
语法:参考Selector类中定义的语法
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 //1. 获取student.xml的path String path = JsoupDemo4.class .getClassLoader().getResource("student.xml").getPath(); //2. 获取Document对象 Document document = Jsoup.parse(new File(path ), "utf-8"); //通过Document对象获取name 标签,获取所有的name 标签,可以获取到两个 Elements elements = document.getElementsByTag("name"); System .out .println(elements.size());System .out .println("----------------");//通过Element对象获取子标签对象 Element element_student = document.getElementsByTag("student").get (0 ); Elements ele_name = element_student.getElementsByTag("name"); System .out .println(ele_name.size());//获取student对象的属性值 String number = element_student.attr("NUMBER"); System .out .println(number);System .out .println("------------");//获取文本内容 String text = ele_name.text(); String html = ele_name.html(); System .out .println(text );System .out .println(html);
XPath:XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言
使用Jsoup的Xpath需要额外导入jar包。
查询w3cshool参考手册,使用xpath的语法完成查询
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 String path = JsoupDemo6 .class .getClassLoader() .getResource("student.xml" ) .getPath() ; Document document = Jsoup . parse(new File(path ) , "utf-8" ); JXDocument jxDocument = new JXDocument(document ) ; List<JXNode> jxNodes = jxDocument.selN("//student" ) ; for (JXNode jxNode : jxNodes) { System . out.println(jxNode); } System . out.println("--------------------" );List<JXNode> jxNodes2 = jxDocument.selN("//student/name" ) ; for (JXNode jxNode : jxNodes2) { System . out.println(jxNode); } System . out.println("--------------------" );List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@id]" ) ; for (JXNode jxNode : jxNodes3) { System . out.println(jxNode); } System . out.println("--------------------" );List<JXNode> jxNodes4 = jxDocument.selN("//student/name[@id='itcast']" ) ; for (JXNode jxNode : jxNodes4) { System . out.println(jxNode); }