简介:
XML: extensible Markup Language 可扩展标记语言 version="1.0"
可扩展:所有的标签都是自定义的。
功能:用于数据存储、配置文件、数据传输
html与xml区别:
html语法松散,xml语法严格
html做页面展示,xml做数据存储
html所有标签都是预定义的,xml所有标签都是自定义的
必须写在xml文档的第一行写法:<?xml version="1.0" ?>
属性:
version:版本号 固定值 1.0
encoding:指定文档的码表。一般写utf-8,也可以 iso-8859-1
standalone:指定文档是否独立 yes 或 no (很少用)
如果是yes,则表示这个XML文档时独立的,不能引用外部的DTD规范文件;
如果是no,则该XML文档不是独立的,表示可以用外部的DTD规范文档
案例
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<stulist>
<student id="3">
<name>范冰冰</name>
<password>123</password>
<gender>女</gender>
<birthday>1983-10-11</birthday>
</student>
<student id="2">
<name>李冰冰</name>
<password>123</password>
<gender>女</gender>
<birthday>1984-10-11</birthday>
</student>
<student id="3">
<!-- <![CDATA[]]> 表示转义 -->
<name><![CDATA[&glt;>林心如<]]></name>
<password>123</password>
<gender>女</gender>
<birthday>1982-10-11</birthday>
</student>
</stulist>
XML约束
dtd约束或者schema约束
dtd案例:
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT students (student*) >
<!ELEMENT student (name,password,gender,birthday)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT password (#PCDATA)>
<!ELEMENT gender (#PCDATA)>
<!ELEMENT birthday (#PCDATA)>
<!ATTLIST student number ID #REQUIRED>
schema案例:
<?xml version="1.0"?>
<xsd:schema xmlns="http://www.gyf.cn/xml"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.gyf.cn/xml" elementFormDefault="qualified">
<xsd:element name="students" type="studentsType"/>
<xsd:complexType name="studentsType">
<xsd:sequence>
<xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="studentType">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="password" type="xsd:string" />
<xsd:element name="gender" type="genderType" />
<xsd:element name="birthday" type="xsd:string" />
</xsd:sequence>
<xsd:attribute name="number" type="numberType" use="required"/>
</xsd:complexType>
<xsd:simpleType name="genderType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="male"/>
<xsd:enumeration value="female"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="numberType">
<xsd:restriction base="xsd:string">
<xsd:pattern value="itgyf_\d{4}"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
Xml解析
DOM解析:
将文档加载进内存,形成一颗dom树(document对象),将文档的各个组成部分封装为一些对象。
优点:因为,在内存中会形成dom树,可以对dom树进行增删改查。
缺点:dom树非常占内存,解析速度慢。
SAX解析
逐行读取,基于事件驱动
优点:不占内存,速度快
缺点:只能读取,不能回写(改数据)
Demo4j解析架包
全称: dom for java
dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的。
dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,它
的性能超过sun公司官方的dom技术
案例:
package com.Xml;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
*
* @author 冰镇小可乐
* @since 2020-11-23
*/
public class Dom4j_Demo {
public static void main(String[] args) {
// 使用DMO4J读取xml
// 1.创建一个sax解析器
SAXReader reader =new SAXReader();
// 2.设置读取的xml
try {
Document doc=reader.read("G:\\my_java\\Learn\\src\\com\\Xml\\Student.xml");
// 3.读取设置的xml 树形结构
//根源素
Element root=doc.getRootElement();
System.out.println(root.getName());
//子元素:通过父元素查找
@SuppressWarnings("unchecked")
List<Element> eList=root.elements();
eList.forEach((e)->{
System.out.println();
System.out.println(e.getName());
@SuppressWarnings("unchecked")
List<Element> infoList =e.elements();
infoList.forEach((info)->{
System.out.println(info.getName()+"="+info.getText());
});
});
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
XPATH
专门用来查询,它定义了一种规则
使用的方法:
selectSingleNode():
selectNodes():
使用的步骤:
1、注意:要导包 jaxen...jar
2、创建解析器SAXReader reader = new SAXReader();
3、解析xml 获得document对象 Document document = reader.read(url);
XPATH规则
nodename 选取此节点。
从根节点选取。
.. 选取当前节点的父节点。
@ 选取属性。
[@属性名] 属性过滤
[标签名] 子元素过滤
XPATH实例
package com.Xml;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Xpath_Demo {
public static void main(String[] args) {
// 必须引入jaxen架包
// 1.创建一个sax解析器
SAXReader reader =new SAXReader();
// 2.设置读取的xml
try {
@SuppressWarnings("unused")
Document doc=reader.read("G:\\my_java\\Learn\\src\\com\\Xml\\Student.xml");
// 3.读取
//查询所有student元素
@SuppressWarnings("unchecked")
List<Element> l1=doc.selectNodes("//student");
l1.forEach((a)->{
System.out.println(a.getName());
});
//查询根目录下的student下的name
@SuppressWarnings("unchecked")
List<Element> l2=doc.selectNodes("/students/student/name");
l2.forEach((z)->{
System.out.println(z.getName()+"="+z.getText());
});
//查询父元素
@SuppressWarnings("unchecked")
List<Element> l3 =doc.selectNodes("//student/..");
l3.forEach((s)->{
System.out.println(s.getName());
});
//查询属性
@SuppressWarnings("unchecked")
List<Attribute> l4 =doc.selectNodes("/studens/student/@number");
l4.forEach((ss)->{
// System.out.println(ss.getName()+"="+ss.getValue());
System.out.println(ss.getName()+"="+ss.getText());
});
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}