1.xml简介
XML全称为Extensible Markup Language, 意思是可扩展的标记语言,它是 SGML(标准通用标记语言)的一个子集。
XML语法上和HTML比较相似,但HTML中的元素是固定的,而XML的标签是可以由用户自定义的。 W3C在1998年2月发布1.0版本;
W3C在2004年2月发布1.1版本,但因为1.1版本不能向下兼容1.0版本,所以1.1没有人用。同时,在2004年2月W3C又发布了1.0版本的第三版。
2.xml的用途
2.1数据交换:不同语言之间用来交换数据
2.2小型数据库:用来当数据库存存储数据
2.3程序的配置文件:主要是这种用途
3.xml的文档说明
创建一个xml文件后缀名为 .xml
必须要写一个文档说明(写了文档说明后,表示写的是xml的内容)
注意:文档说明必须在第一行第一列,其他都不能出现在第一行第一列
<?xml version=”1.0” encoding=”gbk”?>
<?xml version=”1.0” encoding=”gbk” standalone=”yes”>
<?xml version=”1.0” encoding=”gbk” standalone=”no”>
Standlone表示是否需要依赖其他文件;后两种方式一般不用;
4.xml元素的定义
- 标签定义又开始必须有结尾
<person> </person>
- 标签没有内容可以使用标签内结束
<aa/>
标签是可以嵌套的但是必须合理嵌套
正确的写法:
<person>
<name>张三</name>
</person>
不合理嵌套:
<aa> <bb> </aa> </bb>
一个xml中只能有一个根标签,其他都是他的子标签或者孙标签;
在xml当中空格和换行都会当做内容来解析 一下代码含义是不一样的;
<aa>1111111</aa>
<aa> 111 </aa>
标签可以是中文的;
<标签> 老郭</标签>
xml中的标签命名规则(重点)
A. xml代码区分大小写
<p></P>
是错误的写法
B. Xml中标签不能以数字和下划线开头
<aa></aa> <_2a></_2a>
C. xml当中标签不能以xml、XML、Xml等开头;
<xmlaa></xmlaa> <Xmlaa></Xmlaa>
D.xml的标签不能包含空格和冒号
<a b></a b> <a:b></a:b>
(B、C两条好像不够准确,但是官方给出的命名规则就是这样的);
5.xml属性的定义
Html是标记型文档,可以有属性;
Xml也是标记型文档,也可以有属性;
<person id1=”aaa” id2=”bbb”> 张三</person>
<person name=”aaa” age=”18”> 张三</person>
<person>
<name>老郭</name>
<age>18</age>
</person>
属性定义的要求:
1.一个标签可以有多个属性;
<person id1=”aaa” id2=”bbb”>张三</person>
2.属性名称不能相同;
错误的写法:<person i d1=”aaa” id1=”bbb”> 张三</person>
3.属性名称和属性值之间使用等号连接,属性值使用双引号或者单引号引起来;
4.Xml属性的名称规范和元素名称规范一致
6.xml的特殊字符
xml中有些字符数不能正常显示的
特殊字符 替代符号
& &
< <
> >
“ "
‘ '
7.xml的解析
1.实现查询XML操作
操作的xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<student>
<stu>
<name>张三</name>
<age>23</age>
</stu>
<stu>
<name>李四</name>
<age>24</age>
</stu>
<stu>
<name>赵六</name>
<age>46</age>
</stu>
</student>
1.获取所有根节点下的子节点
public class XmlTest01 {
public static void main(String[] args) throws DocumentException {
//1.创建解析器
SAXReader reader = new SAXReader();
//2.得到xml文档
Document document = reader.read("src/01.xml");
//3.获取根节点
Element root = document.getRootElement();
//4.获取根节点下所有的子节点
List<Element> elements = root.elements("stu");
for (Element element : elements){
//获取name标签
Element ele = element.element("name");
//获取标签的值
String text = ele.getText();
System.out.println(text);
}
}
}
2.获取第一个name的值
public class XmlTest02 {
public static void main(String[] args) throws Exception {
//调用方法
findFirstName();
}
public static void findFirstName() throws Exception {
//1.创建解析器
SAXReader reader = new SAXReader();
//2.获取xml对象
Document document = reader.read("src/01.xml");
//3.获取根节点
Element root = document.getRootElement();
//4.获取第一个stu对象
Element stu = root.element("stu");
//5.获取name标签对象
Element name = stu.element("name");
//6.获取到name标签的文本对象
String text = name.getText();
//7.输出文本
System.out.println(text);
}
}
3.获取第二个name的值
public static void main(String[] args) throws Exception {
//1.创建解析器
SAXReader reader = new SAXReader();
//2.得到xml
Document document = reader.read("src/01.xml");
//3.获取根节点
Element root = document.getRootElement();
//4.回去所有子节点并放入list中
List<Element> list = root.elements("stu");
//5.根据下标获取对应的子节点
Element stu = list.get(1);
//6.获取name标签对象
Element name = stu.element("name");
//7.通过name标签对象获取文本值
String text = name.getText();
//8.s输出
System.out.println(text);
}
}
2.实现在末尾添加节点的操作
public class XmlAdd {
/*
* 在子节点末尾添加元素的操作
*/
public static void main(String[] args) throws Exception {
//1.创建解析器
SAXReader reader = new SAXReader();
//2.得到xml文档
Document docunment = reader.read("src/01.xml");
//3.获取到根节点
Element student = docunment.getRootElement();
//4.获取第一个子标签
Element stu = student.element("stu");
//5.添加标签元素
Element height = stu.addElement("height");
//6.设置标签的文本
height.setText("197");
//7.回写
//定义心xml的文本格式
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/01.xml"),format);
//8.通过xml输出流将整个xml文档输出
xmlWriter.write(docunment);
//9.关闭流
xmlWriter.close();
}
}
操作结果:
<?xml version="1.0" encoding="UTF-8"?>
<student>
<stu>
<name>张三</name>
<age>23</age>
<height>197</height>//添加成功
</stu>
<stu>
<name>李四</name>
<age>24</age>
</stu>
<stu>
<name>赵六</name>
<age>46</age>
</stu>
</student>