---------------------------------------------------------------------------------------------------------------------------------
使用XML文件可以提高阅读性
XML文件示例:
<?xml version="1.0" encoding="UTF-8" ?>
<!--第一行必须正确写入-->
<!-- 注释内容 可用ctrl + / 快捷键-->
<students>
<student>
<name>zhangsan</name>
<age>23</age>
<!-- 第一种表达 < > 的方式 -->
<info> 学生信息:< > < > < > < > < > </info>
<!-- 第二种表达方式 -->
<info><![CDATA[我是第二种<><><><><<><<]]]></info>
</student>
<student>
<name>lisi</name>
<age>24</age>
</student>
</students>
解析XML 即从XML获取数据
Document对象:整个xml文档 (Document)
1.Element对象:所有标签(students,student,name,age)
2.Attribute对象:所有属性(id)
3.Text对象:所有文本内容(zhangsan,23,lisi,24)
id的值并不是一个对象,可以通过id直接获取到,它只是一个普通的属性值
1.2.3.的共同父类为Node对象
利用dom4j解析XML文件
dom4j的下载地址:dom4j
下载1.6.1压缩包并存放至需要的位置
将dom4j文件内的dom4j-1.6.1.jar导入idea即可
解析过程就好像吃玉米,需要一层一层往里剥(一层一层解析)
示例:
已创建一个Student标准Javabean类,在此不进行展示
package aResumeitheima.Day_16;
//利用dom4j解析XML文件
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class XmlParse {
public static void main(String[] args) throws DocumentException {
//1.获取一个解析器对象
SAXReader s = new SAXReader();
//2.利用解析器把xml文件加载到内存中,并返回一个文档对象
Document read = s.read(new File(("BhPractice\\src\\aResumeitheima\\Day_16\\XML\\student.xml")));//需要完整路径
//3.获取到根标签的方法
Element rootElement = read.getRootElement();
ArrayList list = new ArrayList();
// ---------------------------------------------------------------------
// element():可以获取调用者所有的子标签,会把这些子标签放到一个集合中返回
// List elements = rootElement.elements();
// System.out.println(elements.size());
// ---------------------------------------------------------------------
List<Element> student = rootElement.elements("student");
for (Element element : student) {
// System.out.println(element);
//获取id属性(--attribute()--)和属性值(--getValue()--)
Attribute i = element.attribute("id");
String id = i.getValue();
//获取标签(--element()--)和标签体内容(--getText()--)
Element n = element.element("name");
String name = n.getText();
Element a = element.element("age");
String age = a.getText();
Student stu = new Student(id,name,Integer.parseInt(age));
list.add(stu);
}
for (Object o : list) {
System.out.println(o);
}
}
}
运行结果:
文档约束(XML的约束)
约束分类
- DTD
- schema
步骤
1.创建一个文件,这个文件的后缀名为.dtd;
2.看xmI文件中使用了哪些元素;
<!ELEMENT>可以定义元素
3.判断元素是简单元素还是复杂元素:
简单元素:没有子元素。
复杂元素:有子元素的元素;
示例:
注:需要严格按照规则进行编写数量也需要一致
DTD约束
能在xml中引入约束文档;
能够简单阅读约束文档;
根据约束编写xml文件;
引入DTD约束的三种方法
1、引入本地dtd
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE persons SYSTEM 'person.dtd'>
<persons>
<person>
<name>艾斯</name>
<age>23</age>
</person>
</persons>
<!ELEMENT persons (person)>
<!ELEMENT person (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
2、在xmI文件内部引入
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE persons [
<!ELEMENT persons (person)>
<!ELEMENT person (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]>
<persons>
<person>
<name>艾斯</name>
<age>23</age>
</person>
</persons>
3、引入网络dtd
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE persons PUBLIC “dtd文件的名称” "dtd文档的URL">
<persons>
<person>
<name>艾斯</name>
<age>23</age>
</person>
</persons>
总结:
1、引入本地dtd
<!DOCTYPE 根元素名称 SYSTEM 'DTD文件的路径'>
2、在XML文件内部引入
<!DOCTYPE 根元素名称 [dtd文件内容]>
3、引入网络dtd
<!DOCTYPE 根元素名称 "DTD文件名称" "DTD文档的URL">
DTD的语法规则:
定义一个元素的格式为:<!ELEMENT 元素名 元素类型>
简单元素:
·EMPTY:表示标签体为空;
·ANY:表示标签体可以为空也可以不为空;
·PCDATA:表示该元素的内容部分为字符串;
复杂元素:
直接写子元素名称。
1、多个子元素使用","或者"|"隔开;
2、","表示定义子元素的顺序;
3、"|"表示子元素只能出现任意一个;
定义一个属性的格式为:<!ATTLIST 元素名称 属性名称 属性的类型 属性的约束>
属性的类型:
CDATA类型:普通的字符串
属性的约束:
#REQUIRED:必须的
#IMPLIED:属性不是必须的
#FIXED value:属性值是固定的
schema约束
DTD和schema的区别:
- schema约束文件也是一个xml文件,符合xml的语法,这个文件的后缀名用.xsd
- 一个xml中可以引用多个schema约束文件,多个schema使用名称区分(名称空间类似java包名)
- dtd里面元素类型的取值比较单一常见的是PCDATA类型,但是在schema里面可以支持多个数据类型
- schema语法更加复杂
步骤
1,创建一个文件,这个文件的后缀名为.xsd。
2,定义文档声明
3,schema文件的根标签为:<schema>4,在<schema>中定义属性:
xmIns=http://www.w3.org/2001/XMLSchema5,在<schema>中定义属性 :targetNamespace=唯一的url地址指定当前这个schema文件的名称空间6,在<schema>中定义属性elementFormDefault="qualified表示当前schema文件是一个质量良好的文件7,通过element定义元素
8,判断当前元素是简单元素还是复杂元素
示例:
<?xml version="1.0" encoding="UTF-8" ?>
<schema
xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.dz666.cn/java"
elementFormDefault="qualified"
>
<element name="persons">
<complexType>
<sequence>
<element name="person">
<complexType>
<sequence>
<element name="name" type="string"></element>
<element name="age" type="string"></element>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
sequence表示定义的名称标签需要按顺序来定义,先写name再写age
引入schema约束:
步骤:
1,在根标签上定义属性
xmIns="http://www.w3.org/2001/XMLSchema-instance'
2,通过xmns引入约束文件的名称空间
3,给某一个xmins属性添加一个标识,用于区分不同的名称空间格式为:xmins:标识=“名称空间地址”
标识可以是任意的,但是一般取值都是xsi
4,通过xsi:schemaLocation指定名称空间所对应的约束文件路径
示例:
<?xml version="1.0" encoding="UTF-8" ?>
<persons
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.dz666.cn/java"
xsi:schemaLocation="http://www.dz666.cn/java person.xsd"
>
<person>
<name>艾斯</name>
<age>23</age>
</person>
</persons>
定义属性
必须要在sequence外complexType内
示例:
<?xml version="1.0" encoding="UTF-8" ?>
<schema
xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.dz666.cn/java"
elementFormDefault="qualified"
>
<element name="persons">
<complexType>
<sequence>
<element name="person">
<complexType>
<sequence>
<element name="name" type="string"></element>
<element name="age" type="string"></element>
</sequence>
<!-- name:属性名,type:属性数据类型,use:required必须-->
<attribute name="id" type="string" use="required"></attribute>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
<?xml version="1.0" encoding="UTF-8" ?>
<persons
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.dz666.cn/java"
xsi:schemaLocation="http://www.dz666.cn/java person.xsd"
>
<person id="001">
<name>艾斯</name>
<age>23</age>
</person>
</persons>