JavaWeb数据库开发知识总结(XML)
1.XML概述
XML 指可扩展标记语言(EXtensible Markup Language);
XML 标签没有被预定义,需要自行定义标签.
XML的文档以.xml标示.
1.1 XML作用
- 用于传输数据和存取数据.
- 用作软件等程序的配置文件.
1.2 XML语法
XML基本语法要求:
# XML标签必须关闭,<标签></标签>或<标签/>;
# XML标签的字母区分大小写;
# XML标签的属性值必须要有引号(单引号或双引号);
# XML标签的嵌套必须是完整嵌套,不能交叉嵌套(父标签必须包含子标签的开始和关闭).
XML的文档声明:
<!-- XML的文档声明必须在文档的第一行和第一列(前面不能有空格和其他内容)的位置. -->
<!--文档声明格式:-->
<?xml 属性名1="属性值1" 属性名2="属性值2" 属性名3="属性值3"?>
XML的文档声明属性值有如下3个:
version(必须声明):xml的版本,一般是"1.0"版本;
encoding(必须声明):xml的编码格式,就是文档使用的字符集;
standalone(可选):描述xml文档是否需要依赖其他文件.
XML的注释格式:
<!-- XML的注释内容 -->
XML的元素(标签):
<!-- XML标签的命名规范 -->
<s1>名称可以含字母,数字以及其他的字符</s1>
<s2>名称不能以数字或者标点符号开始</s2>
<s3>名称不能以字符"xml"(或者XML,Xml)开始</s3>
<s4>名称不能包含空格</s4>
<s5>名称中不能含有冒号:</s5>
<s6>名称中不能包含特殊字符</s6>
<!-- XML标签的属性名的命名规范 -->
<s1>名称和XML标签命名要求相同</s1>
<s1>属性的值必须使用引号包含(单引号或双引号)</s1>
XML 的特殊字符:
XML转义 | 特殊字符 | 含义 |
| < | 小于 |
| > | 大于 |
| & | 和号 |
| ‘ | 省略号 |
| “ | 引号 |
XML的CDATA区:
<!--XML中使用CDATA标示某块区域不进行xml解析,就是其中的特殊不需要进行转义,默认按照本身的字符进行解析-->
<!-- CDATA格式 -->
<![CDATA[
内容体;这里的内容不会被进行解析,可以出现特殊字符.
]]>
2. XML文件的解析
XML文件的解析:使用程序从XML文档中获取其中存储的数据.
2.1 XML文档的解析方式:
DOM解析:
DOM解析(Document Object Model):文档对象模型,将XML文档一次性加载进内存,创建DOM树形结构.
SAX解析:
SAX解析(Simple Api for XML):事件驱动式,逐行的解析XML文档.
两种解析方式的区别:
DOM解析:将XML文档一次性加载进内存中,创建DOM树结构,然后进行解析.
缺点:当XML文档较大时容易导致内存溢出.
优点:创建DOM树形接口后可以对XML文档进行增加,删除和修改元素的操作.
SAX解析:逐行的解析XML文档.
缺点:不能对XML文档的元素进行增加,删除和修改的操作.
优点:逐行的加载数据,不会导致内存溢出.
2.2 针对两种解析方式常见解析的API
针对XML解析实现的两种方式,有些实现XML解析的工具类,其中DOM4J应用较为广泛.
JAXP工具类:SUN公司提供的XML解析的API;
JDOM工具类:开源的解析XML的API-JDOM;
DOM4J工具类:开源的XML的API-DOM4J;
PULL工具类:主要解决Android端的XML文档的解析.
DOM4J工具类解析XML文档
XML文档的元素与DOM树形结构的对应关系:
XML文档中的元素 | DOM树形结构(Document对象) | DOM树形中的根节点 |
标签元素 | Element对象 | Node对象 |
标签属性 | Attribute对象 | Node对象 |
标签中的文本 | Text对象 | Node对象 |
使用DOM4J工具类解析XML文档的步骤:
DOM4J工具类:需要使用dom4j-版本号.jar
DOM4J解析XML文档的步骤:查找DOM树形中的节点只能逐级的进行查找,不能进行准确的进行定位查找
1.导入DOM4J的jar包;
2.创建解析器(一般有DOM和SAX解析器两种);
3.由解析器获得当前XML的文档的Document对象;
4.由Document对象获取XML文档的根节点;
5.根据根节点查找其他的节点(元素对象).
使用XPath工具类辅助元素节点的快速查找:
XPath工具类:需要使用jaxen-1.1-beta-6.jar
XPath常用元素选择器(示例) | 选择器含义 |
/AAA | 选择根元素AAA |
/AAA/CCC | 选择AAA的所有CCC子元素 |
/AAA/DDD/BBB | 选择AAA的子元素DDD的所有子元素 |
//BBB | 选择所有BBB元素 |
//DDD/BBB | 选择所有父元素是DDD的BBB元素 |
/AAA/CCC/DDD/* | 选择所有路径依附于/AAA/CCC/DDD的元素 |
/*/*/*/BBB | 选择所有的有3个祖先元素的BBB元素 |
//* | 选择所有元素 |
/AAA/BBB[1] | 选择AAA的第一个BBB子元素 |
/AAA/BBB[last()] | 选择AAA的最后一个BBB子元素 |
//@id | 选择所有的id属性 |
//BBB[@id] | 选择有id属性的BBB元素 |
//BBB[@name] | 选择有name属性的BBB元素 |
//BBB[@*] | 选择有任意属性的BBB元素 |
//BBB[not(@*)] | 选择没有属性的BBB元素 |
//BBB[@id=’b1’] | 选择含有属性id且其值为’b1’的BBB元素 |
//BBB[@name=’bbb’] | 选择含有属性name且其值为’bbb’的BBB元素 |
//BBB[normalize-space(@name)=’bbb’] | 选择含有属性name且其值(在用normalize-space函数去掉前后空格后)为’bbb’的BBB元素 |
案例代码:
/**
* 使用xml的DOM4J包进行解析,使用XPath进行元素的选择
* DOM4J包:dom4j-1.6.1.jar
* XPath包:jaxen-1.1-beta-6.jar
*/
public class My_XML_Demo {
/**
* 使用XPath进行遍历元素
* @throws DocumentException
*/
@Test
public void demo() throws DocumentException {
// 创建xml解析器对象
SAXReader saxr = new SAXReader();
// 解析文件,获得document对象
Document document = saxr.read("xml/student.xml");
// 选择sid属性值为3的Student标签元素
Element element = (Element) document.selectSingleNode("//student[@sid='3']");
// 获取Student标签下的sname元素的文本
String sname = element.element("sname").getText();
// 获取Student标签下的age元素的文本
String age = element.element("age").getText();
// 获取Student标签下的salary元素的文本
String salary = element.element("salary").getText();
// 获取Student标签下的grade元素的文本
String grade = element.element("grade").getText();
// 输出结果值
System.out.println(sname+"---"+age+"---"+salary+"---"+grade);
}
/**
* 使用传统方式进行遍历元素
* @throws DocumentException
*/
@Test
public void demo2() throws DocumentException {
SAXReader saxr = new SAXReader();
Document document = saxr.read("xml/student.xml");
// 获取根节点
Element root = document.getRootElement();
// 获取根节点下所有的Student标签元素
@SuppressWarnings("unchecked")
List<Element> elements = root.elements("student");
// 遍历Student标签元素的结合
for (Element element : elements) {
// 获取标签中sid的属性值
String sid = element.attributeValue("sid");
// 如果sid的属性值为3,则获取该Student标签下的所有的元素内容并输出
if(sid.equals("3")) {
// 获取Student标签下的sname元素的文本
String sname = element.element("sname").getText();
// 获取Student标签下的age元素的文本
String age = element.element("age").getText();
// 获取Student标签下的salary元素的文本
String salary = element.element("salary").getText();
// 获取Student标签下的grade元素的文本
String grade = element.element("grade").getText();
// 输出结果值
System.out.println(sname+"---"+age+"---"+salary+"---"+grade);
// 找到对应的值就退出循环
break;
}
}
}
}