XML技术说明及应用
XML技术
作用
1.解决程序间数据传输的问题:相当于 json
比如qq之间的数据传送,用xml格式来传送数据,具有良好的可读性,可维护性。2.xml可以做配置文件
xml文件做配置文件可以说非常的普遍,比如tomcat服务器的server.xml 、web.xml3.xml可以充当小型的数据库
xml文件做小型数据库,也是不错的选择,我们程序中可能用到的数据,如果放在数据库中读取不合适(因为你要增加维护数据库工作),可以考虑直接用xm来做小型数据库,而且直接读取文件显然要比读取数据库快
<?xml version="1.0" encoding="UTF-8"?>
<!--
xml是扩展标记语言,标签可以自定义
1.xml代表文件的类型xml
2.version="1.0"版本号
3.encoding="UTF-8"文件编码
4.students:root元素
5.<student></student>表示students的子元素,可以有多个
6.id属性
7.name、age、gender
-->
<students>
<student id="100">
<name>jack</name>
<age>10</age>
<gender>男</gender>
</student>
<student id="200">
<name>lili</name>
<age>20</age>
<gender>女</gender>
</student>
</students>
文档声明
1.XML声明放在XML文档的第一行
2.version="1.0"版本号
3.encoding="UTF-8"文件编码
<?xml version="1.0" encoding="UTF-8"?>
元素
每个XML文档必须有且只有一个根元素。
根元素是一个完全包括文档中其他所有元素的元素。
根元素的起始标记要放在所有其他元素的起始标记之前。
根元素的结束标记要放在所有其他元素的结束标记之后。如果没有标签体:
<group/>
,不能空着例如:<group></group>
<students>
<student id="100">
<name>jack</name>
<group/>
<user_id>0911200314</user_id>
</student>
</students>
命名规范
1.区分大小写
<QY></QY>
与<qy></qy>
有区别
2.不能以数字开头
3.不能包含空格
4.名称中间不能有冒号,可以用下划线
属性
1.属性值用单引号或双引号进行分隔
2.一个元素可以有多个属性
3.特定的属性名称在同一个元素标记中只能出现一次
4.属性值不能包括&字符
<!--错误-->
<student id="100" id="101">
<!--可以-->
<student id="100" ID="101">
注释
1.注释不能写在标记里
2.注释不能嵌套
3.注释中不能出现--
4.注释可以写在标记以外任何地方
<!--错误-->
<!-- -- -->
CDADA区、特殊字符
有些内容不想让解析引擎执行,而是当作原始内容处理(即当做普通文本),可以使用CDATA包括起来,CDATA节中的所有字符都会被当作简单文本,而不是XML标记。
1.语法
<![CDATA[ 这里的内容会原样显示不会解析为xml ]]>
2.可以输入任何字符,但是
]]>
除外
3.不能嵌套
<!--之前报错的可以显示-->
<![CDATA[
<!-- -- -->
]]>
转义字符
转义符 | 符号 |
---|---|
< |
< |
> |
> |
& |
& |
" |
" |
' |
' |
XML解析技术原理
1.不管是html文件还是xml文件它们都是标记型文档,都可以使用w3c组织制定的dom技术来解析
2.document对象表示的是整个文档(可以是html文档,也可以是xml文档)
DOM4j
需要导入的包
下载dom4j
junit-4.13.1.jar
hamcrest-core-1.3.jar
1.Dom4j是一一个简单、 灵活的开放源代码的库(用于解析/处理XML文件)。Dom4j是由早期开发JDOM的人分离出来而后独立开发的。
2.与JDOM不同的是,dom4j使用接口和抽象基类,虽然Dom4j的API相对要复杂一 些, 但它提供了比JDOM更好的灵活性。
3.Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的Dom4j。
4.使用Dom4j开发,需下载dom4j相应的jar文件
DOM4j中,获取Document对象的三种方式
开发dom4j要导入dom4j的包
1.读取XML文件,获得document对象
SAXReader reader = new SAXReader(); //创建一个解析器
Docunment document = reader.read(new File("src/input.xml")); //XML Document
2.解析XML形式的文本,得到docunment对象
String text = "<member></members>";
Document document = DocumentHelper.parseText(text);
3.主动创建document对象
Document document = DocumentHelper.createDocument(); //创建根节点
Element root = document.addElement("members");
读取XML信息
<?xml version="1.0" encoding="UTF-8" ?>
<students>
<student id="01">
<name>孙傲天</name>
<gender>男</gender>
<age>101</age>
</student>
<student id="02">
<name>李逍遥</name>
<gender>男</gender>
<age>1001</age>
</student>
</students>
别忘了导包
@Test
public void loadXML() throws DocumentException {
// 得到一个解析器
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/student.xml"));
// 1.得到根元素
Element rootElement = document.getRootElement();
// 2.得到rootElement的student Elements
List<Element> students = rootElement.elements("student");
// 长度
System.out.println(students.size());
// 遍历
for (Element student : students) {
Element name = student.element("name");
Element age = student.element("age");
Element gender = student.element("gender");
// 具体的值得.getText()
System.out.println("学生信息 = " + name.getText() + ":" + gender.getText() + ":" + age.getText());
}
}
// 直接获得一个元素
@Test
public void readOne() throws DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/student.xml"));
Element rootElement = document.getRootElement();
// 获取第一个学生
Element student = (Element) rootElement.elements("student").get(1);
// 输出
System.out.println(student.element("name").getText());
// 获取student元素的属性
System.out.println(student.attributeValue("id"));
}
添加XML信息
/**
* 增加元素
* @throws DocumentException
* @throws IOException
*/
@Test
public void add() throws DocumentException, IOException {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/student.xml"));
// 创建一个学生节点
Element newStu = DocumentHelper.createElement("student");
Element newStu_name = DocumentHelper.createElement("name");
Element newStu_gender = DocumentHelper.createElement("gender");
Element newStu_age = DocumentHelper.createElement("age");
// 添加属性
newStu.addAttribute("id", "03");
newStu_name.setText("芊嵛");
newStu_gender.setText("男");
newStu_age.setText("18");
// 把子元素添加到newStu中
newStu.add(newStu_name);
newStu.add(newStu_gender);
newStu.add(newStu_age);
// 再把newStu节点加到根元素
document.getRootElement().add(newStu);
// 直接输出会出现中文乱码
OutputFormat outputFormat = OutputFormat.createPrettyPrint();
outputFormat.setEncoding("utf-8");
//更新xml文件
XMLWriter writer = new XMLWriter(
new FileOutputStream(new File("src/student.xml")), outputFormat);
writer.write(document);
writer.close();
}
删除XML
/**
* 删除元素
* @throws DocumentException
* @throws IOException
*/
@Test
public void del() throws DocumentException, IOException {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/student.xml"));
// 找到要删除的元素
Element stu = document.getRootElement().elements("student").get(2);
// 删除元素
stu.getParent().remove(stu);
// 更新XML
OutputFormat outputFormat = OutputFormat.createPrettyPrint();
outputFormat.setEncoding("utf-8");
//更新xml文件
XMLWriter writer = new XMLWriter(
new FileOutputStream(new File("src/student.xml")), outputFormat);
writer.write(document);
writer.close();
}
更新XML
/**
* 更新
* @throws DocumentException
* @throws IOException
*/
@Test
public void update() throws DocumentException, IOException {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/student.xml"));
// 找到要修改的元素
Element stu = document.getRootElement().elements("student").get(1);
Element age = stu.element("age");
age.setText((Integer.parseInt(age.getText())+20)+"");
// 更新XML
OutputFormat outputFormat = OutputFormat.createPrettyPrint();
outputFormat.setEncoding("utf-8");
//更新xml文件
XMLWriter writer = new XMLWriter(
new FileOutputStream(new File("src/student.xml")), outputFormat);
writer.write(document);
writer.close();
}