XML解析
一、XML
1.定义
Extensible Markup Language 可拓展标记语言
2.XML语法
a. 是一种文本文档,后缀名为.xml
b. 第一行行内容必须是对文档的声明,标签属性值必须使用单引号或者双引号
<?xml version="1.0" encoding="UTF-8”?>
c. 一个文档有且仅有一个根标签,标签必须严格闭合,标签区分大小写
<students>
<student name="张三" age="6" sex="男"></student>
<STUDENT>
<NAME>张三</NAME>
<AGE>20</AGE>
<SEX>男</SEX>
</STUDENT>
</students>
d. 对于特殊符号(<)采用
<DES>
<![CDATA[
<
]]>
</DES>
CDATA标签中的内容会按原样展示
e. 标签自闭合
<student />
空元素可以使用自闭合标签
二、DTD约束
.dtd结尾文件
1. DTD约束元素
EMPTY空元素:元素可以不含任何数据,可以设置属性
#PCDATA(字符串):PCDATA表示被解析文本是字符串,不能包含其他元素,如子标签
ANY:任何内容
情景 | 语法 | 描述 |
---|---|---|
顺序出现 | <!ELEMENT name (a,b) | 子元素a、b必须同时出现,且a必须在b之前出现 |
选择出现 | <!ELEMENT name(a|b)> | 子元素a、b只能有一个出现,要么是a,要么是b |
只出现一次 | <!ELEMENT name (a)> | 子元素a只能且必须出现一次 |
一次或多次 | <!ELEMENT name (a+)> | 子元素a要么出现一次,要么出现多次 |
零次或多次 | <!ELEMENT name (a*)> | 子元素a可以出现任意次(包括不出现,即出现零次) |
零次或一次 | <!ELEMENT name (a?)> | 子元素a可以出现一次或不出 |
格式:<!ELEMENT 元素名称 元素类型>
2. 引入DTD约束
<!DOCTYPE 根标签名 SYSTEM "约束文档名.dtd">
在xml文件引入dtd约束
3. DTD属性约束
属性值类型
CDATA:属性值为普通文本字符串。
Enumerated:属性值的类型是一组取值的列表,XML文件中设置的属性值只能是这个列表中的某一个值。 属性名(1|2|3)
ID:表示属性值必须唯一,且不能以数字开头。
属性值设置
#REQUIRED: 必须设置该属性。
#IMPLIED: 该属性可以设置也可以不设置。
#FIXED: 该属性的值为固定的。 属性名(固定常量)
不指明使用默认值
格式:<!ATTLIST 元素名 属性名 属性值类型 设置说明>
三、XML解析
1.解析方式
a. DOM解析
将XML文档一次性加载进内存,形成DOM树,优点是CRUD(增删改查)操作方便,缺点是占内存
b. SAX解析
将XML文档逐行读取,基于事件驱动,优点是不占内存,缺点是只能读取,不能CRUD
最优实现是Dom4j解析器
2.Dom4j解析
public static void main(String[] args) {
SAXReader reader = new SAXReader();
//根据类的字节码对象找到xml文件并读取到流通道
InputStream is = XmlParse.class.getResourceAsStream("test.xml");
try {
Document document = reader.read(is);
//获取文档的根元素
Element root = document.getRootElement();
String tagName = root.getQualifiedName();
System.out.println(tagName);
/*List<Element> elements = root.elements();
for(Element element : elements){
String tag = element.getQualifiedName();
System.out.println(tag);
//获取元素的所有属性
List<Attribute> attributes = element.attributes();
for(Attribute attribute : attributes){
//获取属性名
String attrName = attribute.getName();
//获取属性值
String attrValue = attribute.getValue();
System.out.println(attrName + " " + attrValue);
}*/
Iterator<Element> iterator = root.elementIterator("student");
while(iterator.hasNext()){
Element element = iterator.next();
String name = element.attributeValue("name");
String sex = element.attributeValue("sex");
String age = element.attributeValue("age");
System.out.println(name + "\t" + sex + "\t" + age + "\t");
}
} catch (DocumentException ex) {
throw new RuntimeException(ex);
}
}