XML,dom4j,XPath解析XML

XML概述

XML:可扩展标记语言(EXtensblie Markup Language)
XML是一种标记语言,很类似HTML,HTML文件也是XML文件,标签都是自定义的

XML与HTML的主要差异

xml标签都是自定义的,html标签都是预定义的
xml语法严格,html语法松散
xml是存储数据的,html是展示数据的

XML的作用

主要作用:配置文件-框架经常会使用
比如:Spring框架的部分配置文件写法,使用的就是 xml文件

xml的组成元素

文档声明

声明格式:

<?xml version="1.0" encoding="UTF-8"?>

1.文档声明必须为<?xml开头,以?>结束
2.文档声明必须从文档的0行0列位置开始
3.文档声明只有两个属性
version:指定XML文档版本,只会选择1.0,不会用1.1
encoding:指定当前文档的编码,默认值是utf-8
常用的编码格式:支持中文:utf-8(国际通用编码) gbk bg2312
不支持中文:iso8859-1(国际通用编码)

元素

  • 元素 element
    1.元素是XML文档中最重要的组成部分
    2.普通元素的结构开始标签,元素体,结束标签组成
    3.元素体:元素体可以是元素,也可以是文本
    4.空元素:空元素只有开始标签,而没有结束标签,但元素必须自己闭合,比如:
<property id="pro" name="propery节点"/>

5.元素命名:
-区分大小写
-.不能使用空格,不能使用冒号
-不建议以XML,xml,Xml开头
6.格式良好的XML文档,必须只有一个根元素

属性

  • 属性 attribute
    -属性是元素的一部分,他必须出现在元素的开始标签中
    -属性的定义格式:属性名=属性值,其中属性值必须使用单引或双引
    -一个元素可以有0-N个属性,但一个元素中不能出现同名属性
    -属性名不能使用空格,冒号等特殊符号,且必须以字符开头

注释

<! – -->,注释内容会被xml解析忽略

转义字符

很多符号已经被XML文档结构使用,所以原素体或属性值中想使用这些符号就必须使用转义字符

XML约束

XML技术里,可以编写一个文档来约束一个XML文档的书写规范,称为XML约束
常见的XML约束:DTD,Schema

DTD

DTD(Document Type Definition),文档类型定义,用来约束XML文档,规定XML文档中元素的名称,子元素的名称及顺序,元素的属性等

DTD重点要求

我们很少编写DTD约束文档,通常通过框架提供的DTD约束文档,编写对应的XML文档,常见框架使用的DTD约束有:struts2,hibernate,mybtis等
通过DTD"bean.dtd"编写XML

规则文件说明(了解):

ELEMENT 表示节点
PCDATA 该内容模型说明元素中可以同时出现文本和元素.
CDATA 属性值是字符数据
REQUIRED 表示属性值是必需的
IMPLIED value 属性值是固定的
ATTLIST 在 DTD 中,属性通过 ATTLIST 声明来进行声明

<?xml version=
"1.0" encoding=
"UTF-8"?>
<!--
模拟spring规范,如果开发人员需要在xml使用当前DTD约束,必须包括DOCTYPE。
格式如下:
<!DOCTYPE beans SYSTEM "bean.dtd">
-->
<!ELEMENT beans (bean*
,import*) >
<!ELEMENT bean (property*)>
<!ELEMENT property (#PCDATA)>
<!ELEMENT import (#PCDATA)>
<!ATTLIST bean id CDATA #REQUIRED
className CDATA #REQUIRED
>
<!ATTLIST property name CDATA #REQUIRED
value CDATA #REQUIRED
>
<!ATTLIST import resource CDATA #REQUIRED>

扩展知识

<![CDATA[]]> <!--(了解): 作用:把不合法的字符,转义成可用的字符。-->

Schema约束

Schema是新的XML文档约束;
Schema要比DTD强大很多,是DTD替代者;
Schema也是XML文档,但Schema文档的扩展名为xsd,而不是xml
Schema功能更强大,数据类型更完善
Schema支持名称空间

Schema重点要求

与DTD一样,要求可以通过schema约束文档编写xml文档,常见框架schema的有:spring,springMVC等

规则文档说明

<beans xmlns"http://www.ekgc.cn/bean"
xmlns:xsi=
“http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=“http://www.ekgc.cn/bean
bean-schema.xsd”>

xmlns=“http://www.ekgc.cn/bean”:命名空间的名字 xmlns=“名字” W3C标准, 命名空间的名字必须全球唯一性 xml + namespace
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
:W3C的官方约束
xsi:schemaLocation=“命名空间名 约束文档的路径”

命名空间(语法)

什么是命名空间
如果一个XML文档中使用多个Schema文件,而这些Schema文件中定义了相同名称的元素时就会出现名字冲突。这就像一个Java文件中使用了import java.util.和import java.sql.时,在使用Date类时,那么就不明确Date是哪个包下的Date了。
总之名称空间就是用来处理元素和属性的名称冲突问题,与Java中的包是同一用途。如果每个元素和属性都有自己的名称空间,那么就不会出现名字冲突问题,就像是每个类都有自己所在的包一样,那么类名就不会出现冲突。

约束文档和xml关系

当W3C提出Schema约束规范时,就提供“官方约束文档”。我们通过官方文档,必须“自定义schema 约束文档”,开发中“自定义文档”由框架编写者提供。我们提供“自定义文档”限定,编写出自己的xml文档。

dom4j

xml解析概述

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

常见的解析方式和解析器

开发中比较常见的解析方式有三种:
1.DOM:要求解析器把整个XML文档装载到内存中,并解析成一个Document对象
优点:元素与元素之间保留结构关系,因此可以进行增删改查操作
缺点:xml文档过大,可能会出现内存溢出显现
2.SAX:是一种速度更快,更有效的方法,它逐行扫描文档,一边扫描一边解析,并以事件驱动的方式进行具体解析,每执行一行,都将出发对应的事件
优点:处理速度快,可以处理大文件
确定:只能读,逐行后将释放内存
3.PULL:Android内置的XML解析方式,类似SAX

解析器

就是根据不同的解析方式提供的具体实现,有的解析器操作过于繁琐,为了方便开发人员,有提供易于操作的解析开发包
常见的解析开发包:
JAXP:sun公司提供支持DOM和SAX开发包
JDom:dom4j兄弟
Jsoup:一种处理HTML特定解析开放包
dom4j:比较常用的解析开发包,hibernate底层采用。

dom解析原理和结构模型

XML DOM将整个XML文档加载进内存,生成一个DOM树,并获得Document对象,通过Document对象进行增删改查操作
DOM树中的核心就是节点,在XML文档中的元素,属性,文本等,在DOM中都是节点

dom4J使用

dom4J是一个java的XML API,具有性能优异,功能强大和极易使用的特点,性能超过了官方的dom技术,如果想要使用dom4J,需要引入支持xpath的jar包dom4j-1.6.1.jar
dom4J必须使用核心类SaxReader加载xml文档获得Document,通过Document对象获得文档的根元素,然后就可以操作了
SaxReader对象.read(…);加载执行xml文档
Document对象.getRootElement();获得根元素
Element对象方法有:
elements();获得指定名称的所有子元素,可以不指定
element();获得指定名称的第一个子元素,可以不指定
getName();获得当前元素名
attributeValue();获得指定属性名属性值,必须指定
elementText();获得指定名称子元素的文本
getText();获得当前元素的文本
使用案例:

<?xml version="1.0" encoding="UTF-8"?>
<beans>
	<bean id="001" className="com.kgc.demo.User">
		<property name="user" value="jacl"></property>
		<property name="user" value="rose"></property>
	</bean>
	<bean id="002" className="com.kgc.demo.Admin">
		<property name="user" value="admin"></property>
		<property name="user" value="write"></property>
	</bean>
</beans>
/**
* dom4j DOM的解析工具
* 核心类:SaxReader
* 作用:读取指定的XML,把整个文件存储到内存,返回对象Document
*/
public class DomReadXml {
	public static void main(String[] args) throws Exception {
	//创建核心类对象
		SAXReader sax = new SAXReader();
	//read:通过sax对象,读取xml,返回Document
		Document document = sax.read("xml-2/xml/data.xml");
	//getRootElement:通过document获取根标签
		Element rootElement = document.getRootElement();
	//获取根标签下面的所有子标签
		List<Element> beanElements = rootElement.elements();
		for (Element beanElement : beanElements) {
			//获取bean标签属性值:attributeValue(属性名)
			String id = beanElement.attributeValue("id");
			String className =beanElement.attributeValue("className");
			System.out.println(id+"==="+className);
			List<Element> propertyElements =beanElement.elements();
				for (Element propertyElement : propertyElements) {
				//获取porperty标签的属性
				String name =propertyElement.attributeValue("name");
				String value =propertyElement.attributeValue("value");
				//获取porperty标签的标签文本
				String text = propertyElement.getText();
				System.out.println("\t"+name+"==="+value+"==="+text);
			}
		}
	}
}

XPath解析XML

默认情况下,dom4j不支持xpath,如果想要在dom4j里使用,需要弄个jar包,jaxen-1.1.6.jar
dom4j里面提供了两个方法,用来支持xpath
List < Node > selectNodes(“xpath表达式”),用来获取多个节点
Node selectSingleNode(“xpath表达式”),用来获取一个节点

xpath表达式常用查询方式

/AAA/DDD/BBB:表示一层一层的找,AAA下面的DDD下面的DDD
//BBB:表示获得所有名称是BBB的
/*:所有元素
BBB[1]:获得第一个BBB元素
BBB[last()]:获得最后一个BBB元素
//BBB[@id]:获得有id属性的BBB元素
//BBB[@id=‘xx’]:获得有id属性='xx’的BBB元素
案例:

<?xml version="1.0" encoding="UTF-8" ?>
	<students>
		<student number="0001">
		<name id="002">
			<xing></xing>
			<ming></ming>
		</name>
		<age>18</age>
		<sex></sex>
		</student>
		<student number="0002">
		<name>jack</name>
		<age>18</age>
		<sex></sex>
		</student>
	</students>
/**
* xpath:快速定位查找
* 在Dom对象中,快速找到想要的元素
*/
public class XPathReadXml {
	public static void main(String[] args) throws Exception {
	SAXReader sax = new SAXReader();
	Document document = sax.read("xml-2/xml/student.xml");
	Node node = (Node)document.selectSingleNode("//students//student//name//xing");
	System.out.println(node.getText());
	Node node1 = document.selectSingleNode("//ming");
	System.out.println(node1.getText());
	Node node2 =document.selectSingleNode("//students//student[last()]//ming[last
()]");
	System.out.println(node2.getText());
	Element element = (Element)document.selectSingleNode("//name[@id='0002']");
	System.out.println(element.getText());
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值