XML
可扩展标记语言
它是一种标记语言 很类似HTML,HTML文件也是XML文档
XML 与 HTML 区别差异
1.xml标签都是自定义,html标签是预定义
2.xml语法严格,html语法松散
3.xml是存储数据的,html是展示数据
存储数据格式:
大珍珠 小珍珠 配置文件格式:
xml注意点事项:
标签由一对尖括号+合法标识符组成
标签必须成对出现
特殊的标签可以不成对称自闭和标签,但是必须有结束标记
标签中可以定义属性,属性和标签名空格隔开属性值必须用引号引起来
标签嵌套
大珍珠
xml规则:
xml文件后缀名:xml
文档声明必须是第一行第一列(定格)
version:版本
encoding:字符编码
必须存在根标签,有且只能有一个
注释:
ctrl+shift+/
特殊字符:
方式一 转译:
< < 小于
> > 大于
& & 和号
' ' 单引号
" " 引号方式二 DATA区:
IDEA:CD生成
XML约束
XML约束主要分2类 DTD 和 Schema 两种约束技术,用来限定xml文件可使用的标签以及属性,也就是告诉程序员xml如何编写
DTD约束引入DTD约束
1.引入本地dtd
2.在xml文件内部引入
3.引入网络dtd
复杂元素: 直接写子元素名称。 多个子元素可以使用","或者"|"隔开; ","表示定义子元素的顺序 ; "|": 表示子元素只能出现任意一个 简单元素: EMPTY: 表示标签体为空 ANY: 表示标签体可以为空也可以不为空 PCDATA: 表示该元素的内容部分为字符串 属性的类型: CDATA类型:普通的字符串 属性的约束: #REQUIRED: 必须的 #IMPLIED: 属性不是必需的 #FIXED value:属性值是固定的
Schema约束引入Schema约束
解析原理图
Schema和dtd的区别1. schema约束文件也是一个xml文件,符合xml的语法,这个文件的后缀名.xsd
2.一个xml中可以引用多个schema约束文件,多个schema使用名称空间区分(名称空间类似于java包名)
3.dtd里面元素类型的取值比较单一常见的是PCDATA类型,但是在schema里面可以支持很多个数据类型
4.schema语法更加的复杂
XML解析
dom4j解析
public class Demo01ParseXml {
public static void main(String[] args) throws Exception {
//1.创建dom4j核心类SaxReader类的对象
SAXReader saxReader = new SAXReader();
//使用类加载器获取xml文件对应的字节输入流对象
InputStream is = Demo01ParseXml.class.getClassLoader().getResourceAsStream("beans.xml");
//2.dom4j核心类SaxReader类的对象调用read方法,加载xml文件获取对应的Document对象
Document document = saxReader.read(is);
//3.获取根标签beansElement
Element beansElement = document.getRootElement();
//4.获取根标签beansElement中的所有bean子标签,存储List集合对象beanElements
List beanElements = beansElement.elements();
//5.增强for遍历List集合对象beanElements
for (Element beanElement : beanElements) {
//5.1 循环内部获取当前bean标签的id和className的属性值
String id = beanElement.attributeValue("id");
String className = beanElement.attributeValue("className");
//5.2 循环内部输出5.1中获取的属性值
System.out.println(id + "::::" + className);
//5.3 获取当前bean标签的所有property子标签,存储List集合对象propertyElements
List propertyElements = beanElement.elements();
//5.4 增强for遍历List集合对象propertyElements
for (Element propertyElement : propertyElements) {
//5.4.1 循环内部获取当前property标签的name和value的属性值,以及文本内容
String name = propertyElement.attributeValue("name");
String value = propertyElement.attributeValue("value");
String text = propertyElement.getText();
//5.4.2 循环内部输出5.4.1中获取的属性值及文本内容
System.out.println("tt" + name + "-----" + value + "-----" + text);
}
}
is.close();
}
}
使用dom4j支持xpath解析
public class Demo02XPathXml {
public static void main(String[] args) throws Exception {
//创建dom4j核心类的对象
SAXReader saxReader = new SAXReader();
//使用类加载器获取xml文件的对应的字节输入流对象
InputStream is = Demo02XPathXml.class.getClassLoader().getResourceAsStream("students.xml");
//加载xml文件获取对应的Document对象
Document document = saxReader.read(is);
//1.查询所有student标签
List nodeList = document.selectNodes("//student");
//遍历
for (Node node : nodeList) {
System.out.println(node);
}
System.out.println("--------------");
//2.查询所有student标签下的name标签
nodeList = document.selectNodes("//student//name");
//遍历
for (Node node : nodeList) {
System.out.println(node);
}
System.out.println("--------------");
//3.查询student标签下带有id属性的name标签
Node node = document.selectSingleNode("//student//name[@id]");
System.out.println(node);
System.out.println("--------------");
//4.查询student标签下带有id属性的name标签 并且id属性值为itcast
node = document.selectSingleNode("//student//name[@id='itcast']");
System.out.println(node);
}
}
public class Demo01ParseXml {
public static void main(String[] args) throws Exception {
//1.创建dom4j核心类SaxReader类的对象
SAXReader saxReader = new SAXReader();
//使用类加载器获取xml文件对应的字节输入流对象
InputStream is = Demo01ParseXml.class.getClassLoader().getResourceAsStream("beans.xml");
//2.dom4j核心类SaxReader类的对象调用read方法,加载xml文件获取对应的Document对象
Document document = saxReader.read(is);
//3.获取根标签beansElement
Element beansElement = document.getRootElement();
//4.获取根标签beansElement中的所有bean子标签,存储List集合对象beanElements
List beanElements = beansElement.elements();
//5.增强for遍历List集合对象beanElements
for (Element beanElement : beanElements) {
//5.1 循环内部获取当前bean标签的id和className的属性值
String id = beanElement.attributeValue("id");
String className = beanElement.attributeValue("className");
//5.2 循环内部输出5.1中获取的属性值
System.out.println(id + "::::" + className);
//5.3 获取当前bean标签的所有property子标签,存储List集合对象propertyElements
List propertyElements = beanElement.elements();
//5.4 增强for遍历List集合对象propertyElements
for (Element propertyElement : propertyElements) {
//5.4.1 循环内部获取当前property标签的name和value的属性值,以及文本内容
String name = propertyElement.attributeValue("name");
String value = propertyElement.attributeValue("value");
String text = propertyElement.getText();
//5.4.2 循环内部输出5.4.1中获取的属性值及文本内容
System.out.println("tt" + name + "-----" + value + "-----" + text);
}
}
is.close();
}
}
使用dom4j支持xpath解析
public class Demo02XPathXml {
public static void main(String[] args) throws Exception {
//创建dom4j核心类的对象
SAXReader saxReader = new SAXReader();
//使用类加载器获取xml文件的对应的字节输入流对象
InputStream is = Demo02XPathXml.class.getClassLoader().getResourceAsStream("students.xml");
//加载xml文件获取对应的Document对象
Document document = saxReader.read(is);
//1.查询所有student标签
List nodeList = document.selectNodes("//student");
//遍历
for (Node node : nodeList) {
System.out.println(node);
}
System.out.println("--------------");
//2.查询所有student标签下的name标签
nodeList = document.selectNodes("//student//name");
//遍历
for (Node node : nodeList) {
System.out.println(node);
}
System.out.println("--------------");
//3.查询student标签下带有id属性的name标签
Node node = document.selectSingleNode("//student//name[@id]");
System.out.println(node);
System.out.println("--------------");
//4.查询student标签下带有id属性的name标签 并且id属性值为itcast
node = document.selectSingleNode("//student//name[@id='itcast']");
System.out.println(node);
}
}



