XML

XML介绍
● Extensible Markup Language –> 可扩展标记语言
● XML –> w3c组织发布 –> 自定义语言
● 设计宗旨 –> 传输数据,非显示数据
● 允许用户自定义标签,一个标签用于描述一段数据(具有自我描述性)
● 一个标签可分为开始标签和结束标签
● 开始标签和结束标签之间,可以使用其他标签描述其他数据,实现数据关系的描述

XML与HTML的主要差异
● XML不是HTML的替代,两者设计目的不同
● XML的焦点是数据的内容,HTML的焦点是数据的外观
● XML旨在存储数据,传输数据(网络数据的交换),html旨在显示信息
● xml自定义标签,html预定义标签
● xml语法严格,html语法不严格

常见应用
● 数据交换的载体,使用XML格式进行软硬件数据的传输
XML数据以纯文本格式的文件数据(.xml扩展名的文件)
具有独立于软件和硬件的特性
● 软件配置文件 –> 描述程序模块之间的关系
c3p0的配置文件,spring框架的 ApplicationContext.xml配置文件
软件系统中,为提高系统灵活性,它所启动的模块通常由其配置文件决定
● 需要掌握的:
看懂xml格式
按照约束,编写符合规则的xml
能看懂约束

语法详解
文档声明
编写XML前,先使用文档声明其类型
■ 文档声明必须为

REQUIRED –> 必须项

IMPLIED: –> 可选

FIXED –> 该属性取值固定为一个值,XML文件中不能为该属性设置其他值,需要为该属性提供这个值

直接使用默认值:在xml中可以设置该值也可以不设置该属性值,若为设置,则使用默认值

常用属性值类型
CDATA: 普通文本字符串
ENUMERATED:枚举 –> 一组取值的列表,XML文件中设置的属性只能是这个列表中的某个值
ID: –> 设置为一个唯一值(只能由字母,下划线开始,不能出现空白字符)
ENTITY(实体)

实体定义
–> 创建别名,以后在XML文档中就可以使用表名引用这段内容

虽然schema功能比dtd强大,但是编写要比DTD复杂,同样以后我们在企业开发中也很少会自己编写schema文件

XML解析

解析概述
当将数据存储在XML后,我们就希望通过程序获取XML的内容。如果我们使用Java基础所学的IO知识是可以完成的,不过你学要非常繁琐的操作才可以完成,且开发中会遇到不同问题(只读、读写)。
人们为不同问题提供不同的解析方式,使用不同的解析器进行解析,方便开发人员操作XML。

解析方式

XML常见三种解析方式
dom:(Document Object Model文档对象模型) –> W3C组织推荐
–> 要求解析器把整个文件装载到内存,并解析成一个Document对象
优势:保留结构关系,增删改方便
劣势:内存消耗大,可能出现内存溢出

SAX解析
–> 采用事件处理方式解析 ==> 解析器和时间处理器
–> 一边扫描一边解析,并以事件驱动的方式进行具体解析
优点:处理速度快,可以处理大文件
缺点:只能读,逐行后将释放资源,解析操作繁琐。

1.解析器可以使用JAXP的API创建
创建SAX解析器后,可以指定解析器去解析某个XML文档

2.解析器采用SAX方式在解析某个XML文档时
只要解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,会把当前解析到的xml文件内容作为方法的参数传递给事件处理器

3.事件处理器由程序员编写,程序员通过事件处理器中方法的参数.就可以轻松的得到sax解析器解析的数据,从而决定如何对数据进行处理

PULL:Android内置的XML解析方式,类似SAX。(了解)

DOM解析原理及结构模型

解析原理
XML DOM 和 HTML DOM一样,XML DOM 将整个XML文档加载到内存,生成一个DOM树,并获得一个Document对象,通过Document对象就可以对DOM进行操作。
以下面books.xml文档为例。

结构模型

DOM中的核心概念就是节点,在XML文档中的元素、属性、文本,在DOM中都是节点!所有的节点都封装到了Document对象中。

解析器
–> 根据不同的解析方式提供具体实现,

名称空间的作用
一个xml 可以引用多个schema约束。 但是只能引用一个DTD约束。
名称空间的作用就是
在写元素的时候,可以指定该元素使用的是哪一套约束规则。
解决不明确问题

默认情况下 ,如果只有一套规则,那么都可以这么写
张三


常见的解析开发包
JAXP:sun公司提供支持DOM和SAX开发包
Dom4j:比较简单的的解析开发包
JDom:与Dom4j类似
Jsoup:功能强大DOM方式的XML解析开发包,尤其对HTML解析更加方便。(重点)


Dom4j

分析思路
dom4j 工具包 解析xml文档

1.需要一个读取xml的文件夹
核心类
SAXReader 读取xml文档 装进聂村
形成document对象
Document document = reader.read(“文件路径”);
2.得到文档对象
通过Document对象,获取根元素
Element rootE = document.getRootElement();
3.获取根元素后 直接获取该元素下的所有直接子元素
List beanElement = rootE.elements;
4.遍历beanElements得到每一个beanElement
根据元素,获取对应的属性
String className = beanElement.attributeValue(“className”);
5.获取bean元素的所有子元素
List property = beanElement.elements;
6.再次遍历property元素
获取里面的属性
解析完成

代码实例

数据准备

以下内容做了解

XML增删改查

sax:(Simple API for XML)非官方标准,是XML社区事实上的标准,几乎所有XML支持
–> 占用内存小,适合做查询

XML解析开发包
–> Jaxp(sun) Jdom dom4j

JAXP
–> J2SE的一部分,由javax.xml/org.w3c.dom/org.xml.sax包及子包组成
–> 在javax.xml.parsers包中,定义了几个工厂类,调用其,可以得到xml文档的DOM或SAX解析器,实现解析

使用JAXP文档进行DOM解析

//创建工厂
DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
//得到解析器
DocumentBuilder builder = f.newDocumentBuilder();
//解析xml文档,得到代表文档的document
builder.parse(“路径”)

更新XML文档
Transformer类用于把代表XML文件的DOcument对象转换为某种格式进行输出
–>把xml文件应用样式表转成一个html文档,也可以写入xml文件中
Transformer类通过transform方法完成转换操作
–>接受一个源和目的地
javax.xml.transform.dom.DOMSource类来关联要转换的document对象
javax.xml.transform.stream.StreamResult对象表示数据的目的地
Transformer对象通过TransformerFactory获得

xml文档的读

ps:若查询全部节点.需要使用递归

xml文档的增

xml文档的删

xml文档的改

SAX解析步骤

创建解析工厂
SAXParserFactory f = SAXParserFactory.newInstance();
得到解析器
SAXParser sp = f.newSAXParser();
得到读取器
XMLReader r = sp.getXMLReader();
设置内容处理器
r.setContentHandler(new ListHandler());
读取xml文档内容
r.parse(“src/book.xml”);

定义类实现ContentHandler重写方法ListHandler

优化

javabean封装XML文档数据
将XML文档中的每一本书封装到一个book对象,键对象放在list集合中返回


Jsoup
基本概念
jsoup 是一款Java 的HTML(html也是XML文档)解析器,可直接解析某个URL地址、HTML文本内容。
提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。所以使用jsoup就可以解析

作用
1. 解析XML文档并操作和管理XML元素、属性、元素体等数据。
2. 解析HTML进行数据收集——爬虫功能

基本使用

引入jsoup的jar包

获取Document文档对象

根据XML文档字符串获取Document

Document document = Jsoup.parse(字符串)

根据文件获取Document

资源代码在src路径下时
//获取资源文件的路径
String path = Demo02_GetDocumentByFile.class.getClassLoader().getResource(“books.xml”).getFile();
//输出资源路径
System.out.println(“文件的资源路径:”+path);
//定义资源文件对象
File file = new File(path);
//使用utf‐8码表解析资源文件对象并获取Document对象
Document document = Jsoup.parse(file,”utf‐8”);

根据url获取Document

//定义一个具体html网页的url
String url=”http://www.itcast.cn/”;
//虽然访问http://www.itcast.cn/返回的是一个网页HTML文档数据,但是HTML文档也是XML文档格式数据
//根据url解析http://www.itcast.cn/的xml文档数据并返回Document对象
Document document = Jsoup.connect(url).get();

Document对象常用方法解析XML

通过选择器解析XML
选择器解析语法
Document对执行选择器方法API介绍

常见选择器


jsoupXPath–爬虫的时候使用
介绍
JsoupXpath 是一款纯Java开发的使用xpath解析HTML的解析器,xpath语法分析与执行完全独立,html的DOM树生成借助Jsoup,故命名为JsoupXpath,所以JsoupXpath不是jsoup的一部分,是在jsoup基础上进行的扩展。
XPath 使用路径表达式来选取HTML 文档中的元素节点或属性节点。节点是通过沿着路径 (path) 来选取的。XPath在解析HTML文档方面提供了一独树一帜的路径思想。

XPath使用步骤

步骤1:导入JsoupXpath-0.3.2.jar,源码下载:https://github.com/zhegexiaohuozi/JsoupXpath
JsoupXpath-0.3.2.jar文件在“jar\jsoup”目录里面

步骤2:利用Xpath语法完成选取XML文档元素节点进行解析操作。

XPath语法

XPath表达式,就是用于选取HTML文档中节点的表达式字符串。

获取XML文档节点元素4种XPath语法方式:

  1. 绝对路径表达式方式
  2. 相对路径表达式方式
  3. 全文搜索路径表达式方式
  4. 谓语(条件筛选)方式

获取不同节点语法

jsoupXPath核心类JXDocument执行Xpath表达式字符串的API方法介绍

JXNode类的API方法介绍

绝对路径表达式

格式:
String xpath=”/元素/子元素/子子元素…”;
绝对路径是以“/”开头,一级一级描述标签的层级路径就是绝对路径,这里注意不可以跨层级
绝对路径是从根元素开始写路径的,这里开头的“/”代表HTML文档根元素,所以在绝对路径中不可以写根元素路径

相对路径表达式

格式:
String xpath1=”子元素/子子元素…”;//获取相对当前路径元素里面的子元素的选取
String xpath2=”./子元素/子子元素”;//”./”代表当前元素路径位置
String xpath3=”/子元素/子子元素”;//功能与xpath1格式功能一样

相对路径就是相对当前节点元素位置继续查找节点,需要使用JXNode.sel(xpath)进行执行相对路径表达式。
注意:
这里不可以使用“../”,jsoupXPath没有实现获取上一级节点功能。

全文搜索路径表达式

格式:
String xpath1=”//子元素//子子元素”;

一个“/”符号,代表逐级写路径
2个“//”符号,不用逐级写路径,可以直接选取到对应的节点,是全文搜索匹配的不需要按照逐层级

谓语(条件筛选)

谓语,又称为条件筛选方式,就是根据条件过滤判断进行选取节点

格式:

String xpath1=”//元素[@attr1=value]”;//获取元素属性attr1=value的元素
String xpath2=”//元素[@attr1>value]/@attr1”//获取元素属性attr1>value的d的所有attr1的值
String xpath3=”//元素[@attr1=value]/text()”;//获取符合条件元素体的自有文本数据
String xpath4=”//元素[@attr1=value]/html()”;//获取符合条件元素体的自有html代码数据。
String xpath3=”//元素[@attr1=value]/allText()”;//获取符合条件元素体的所有文本数据(包

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值