xml的创建以及文档声明
创建方式1:
直接创建file,取名为xxx.xml
创建方式2:
配置模板:setting->搜索template->new->添加xml模板
注意:在xml文档中的第一行写上文档声明
<?xml version="1.0" encoding="UTF-8" ?>
xml的注释
快捷键:ctrl+/
xml的组成部分之标签(元素)以及注意事项
<?xml version="1.0" encoding="UTF-8" ?><student>
<user>用户</user>
<name>
<age>
<sex>基本内容</sex>
</age>
</name>
</student>
xml的标签属性定义以及注意事项
<?xml version="1.0" encoding="UTF-8" ?>
<!--
xml组成:标签属性->attribute
1.定义格式:
在开始标签中:属性名 = "属性值"
2.注意事项:
a.必须写在开始标签中
b.一个标签中可有0~n个属性,但是一个标签中不能出现同名的属性名
c.属性名不能使用特殊符号,且必须以字母开头
-->
<person id = "001" name = "jack">
<user username = "username">用户</user>
</person>
xml中的转义字符
用到自己去查.
xml中的xml文档约束
虽然,我们xml中的标签可以随便写,但是我们开发中不能随便写;因为我们是团队开发,如果每个人都按照自己喜欢的标签去写,那么最后我们项目整合的时候,就会出现问题,所以,我们开发 编写xml是需要约束的
常见的xml约束:dtd schema
根据DTD约束编写xml文档
DTD约束阅读
各部分解释:
DOCTYPE:文档类型
beans:根标签
SYSTEM:本地系统文件
“bean.dtd”:产生关系的文件名,写文件的路径
bean*:可以写多个bean标签
(bean*,import*):,表示标签顺序
#PCDATA:此标签体中应该是文本
CDATA:代表的是标签中的属性值为字符型
#REQUIRED:属性值必须设置
直接粘贴dtd文件,粘贴一以下代码:
<?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
type CDATA #IMPLIED
>
<!ATTLIST property name CDATA #REQUIRED
value CDATA #REQUIRED
>
<!ATTLIST import resource CDATA #REQUIRED>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE beans SYSTEM "bean.dtd">
<beans>
<bean id="001" className="name">
<property name="taoge" value="1"></property>
<property name="taoge" value="1"></property>
</bean>
<bean id="001" className="name"></bean>
<import resource="path"></import>
<import resource="path"></import>
</beans>
schema约束介绍
Schema是新的xml文档约束
Schema要比DTD强大很多,是DTD代替者
Schema本身也是xml文档,但是Schema文档的扩展名为.xsd
Schema功能更强大,数据类型更完善
Schema支持名称空间
根据Schema约束编写xml文件
1.直接粘贴schema约束文档
<?xml version="1.0" encoding="UTF-8"?>
<!--
Schema实例文档。
模拟spring规范,如果开发人员需要在xml使用当前Schema约束,必须包括指定命名空间。
格式如下:
<beans xmlns="http://www.itcast.cn/bean"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.itcast.cn/bean bean-schema.xsd"
>
-->
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.itcast.cn/bean"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://www.itcast.cn/bean"
elementFormDefault="qualified">
<!-- 声明根标签
1. <element> 声明元素(标签)
2. 每一个元素必须确定类型:
complexType 复杂类型
simpleType 简单类型,一般不用,大部分都是复杂类型
3. 需要继续明确子标签出差顺序
<choice> 选择, ()
<sequence> 顺序 ,
<all> 任意
minOccurs 最少出现次数
maxOccurs 最大出现次数,unbounded 不限制(没有边)
4.<attribute>用于给元素声明属性的
use 设置属性使用, optional可选、required必选
-->
<element name="beans">
<complexType>
<choice minOccurs="0" maxOccurs="unbounded">
<element name="bean">
<complexType>
<sequence minOccurs="0" maxOccurs="unbounded">
<element name="property">
<complexType>
<attribute name="name" use="optional"></attribute>
<attribute name="value" use="required"></attribute>
</complexType>
</element>
</sequence>
<attribute name="id" use="required"></attribute>
<attribute name="className" use="required"></attribute>
</complexType>
</element>
<element name="import">
<complexType>
<attribute name="resource" use="required"></attribute>
</complexType>
</element>
</choice>
</complexType>
</element>
</schema>
dom4j解析器的核心API介绍
利用dom4j解析xml文档代码实现
<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<bean id="001" className="cn.itcast.demo.User">
<property name="user" value="jack">杰克</property>
<property name="user" value="rose">肉丝</property>
</bean>
<bean id="002" className="cn.itcast.demo.Admin">
<property name="user" value="admin">管理员</property>
<property name="user" value="write">怀特</property>
</bean>
</beans>
public class Demo01Dom4j {
public static void main(String[] args)throws Exception {
/* 1.核心类:SaxReader
方法: Document read(绑定这个xml文件的输入流)->读取xml的
返回的就是document对象*/
SAXReader sr = new SAXReader();
FileInputStream fis = new FileInputStream("day18\\demo02_xml\\bean.xml");
Document document = sr.read(fis);
/*2.Document对象:
方法:Element getRootElement()->获取根标签*/
Element rootElement = document.getRootElement();//beans
/* 3.Element对象:
方法:List<Element> elements()->获取根标签下的所有子标签(不包含孙子标签)
String attributeValue(String 属性名)->根据属性名获取对应的属性值
String getText()->获取的是标签体的文本部分*/
List<Element> elements = rootElement.elements();//两个bean标签
//4.遍历集合,将两个子标签bean遍历出来,分别获取里面的属性值
for (Element element : elements) {//element代表List集合中的每一个bean标签
String id = element.attributeValue("id");
String className = element.attributeValue("className");
System.out.println(id+"..."+className);
List<Element> elements1 = element.elements();//每一个bean标签下的子标签property
//5.遍历List集合,将每一个property标签获取出来
for (Element elementProperty : elements1) {
//获取property标签下的属性值以及文本部分
String name = elementProperty.attributeValue("name");
String value = elementProperty.attributeValue("value");
String text = elementProperty.getText();
System.out.println(name+"..."+value+"..."+text);
}
System.out.println("=================================");
}
}
}
XPath解析XML
- XPath 是一门在 XML、html 文档中查找信息的语言。
- XPath 是一个 W3C 标准,可通过W3CSchool文档查阅语法
xpath作用:可以对xml和html文档中快速查找指定的信息,快速获取到指定的元素
由于DOM4J在解析XML时只能一层一层解析,所以当XML文件层数过多时使用会很不方便,结合XPATH就可以直接获取到某个元素
使用dom4j支持xpath具体操作
默认的情况下,dom4j不支持xpath,如果想要在dom4j里面使用xpath,需要引入支持xpath的jar包jaxen-1.1.6.jar
所以,我们想使用xpath解析,就要先导入dom4j的jar包,然后再导入xpath的jar包
在dom4j里面提供了两个方法,用来支持xpath(Element中的方法)`
List<Node> selectNodes("xpath表达式"),用来获取多个标签
selectNodes("//BBB")-->获取名字为BBB的标签
Node selectSingleNode("xpath表达式"),用来获取第一个节点对象
selectSingleNode("//BBB")->获取第一个BBB标签对象
xpath表达式常用查询形式
第一种查询形式
/AAA/DDD/BBB: 表示一层一层的,AAA下面 DDD下面的BBB
第二种查询形式(最常用)
//BBB: 表示和这个名称相同,表示只要标签名称是BBB 都能拿到
第三种查询形式
/*: 所有元素
第四种查询形式(没啥用)
BBB[1]:表示第一个BBB元素
BBB[last()]:表示最后一个BBB元素
第五种查询形式
//BBB[@id]: 表示只要BBB元素上面有id属性 都得到
第六种查询形式
//BBB[@id='b1'] 表示元素名称是BBB,在BBB上面有id属性,并且id的属性值是b1
创建student.xml
<?xml version="1.0" encoding="UTF-8" ?>
<students>
<student number="heima_0001">
<name id="itcast">
<xing>张</xing>
<ming>三</ming>
</name>
<age>18</age>
<sex>nan</sex>
</student>
<student number="heima_0002">
<name>jack</name>
<age>18</age>
<sex>nv</sex>
</student>
</students>
public class Demo01_Xpath {
public static void main(String[] args)throws Exception {
//获取xml对应的字节流
InputStream inputStream =
Demo01_Xpath.class.getClassLoader().getResourceAsStream("student.xml");
//创建SaxReader
SAXReader saxReader = new SAXReader();
//将流对象读到内存中,得到Document对象
Document document = saxReader.read(inputStream);
//获取根标签
Element rootElement = document.getRootElement();
//获取所有的age
List<Node> list = rootElement.selectNodes("/students/student/age");
System.out.println(list);
//获取标签sex,xpath最常用的一个形式 //sex
//List<Node> nodes = rootElement.selectNodes("//sex");
//获取第一个sex
//Node node = rootElement.selectSingleNode("//sex");
//获取第一个sex标签中的文本
Element element = (Element) rootElement.selectSingleNode("//sex");
System.out.println(element.getText());
//获取标签是name,属性是id,有这个属性就行
List<Node> list1 = rootElement.selectNodes("//name[@id]");
System.out.println(list1.size());
}
}