XML简介: a) XML即可扩展标记语言(eXtensible Markup Language) b) XML是一种非常灵活的语言,没有固定的标签,所有的标签都可以自定义 c) 通常,xml被用来信息的记录和传递,因此,XML经常被用来充当配置文件
DTD
- dtd简介
a)DTD, Document Type Definition,文档类型定义
b)DTD用于约束xml的文档格式,保证xml是一个有效的xml
c)DTD可以分为两种,内部DTD,外部DTD
- 使用DTD
参考:http://www.w3school.com.cn/dtd/index.asp
a)内部DTD
<!DOCTYPE 根元素 [元素声明]>
元素声明语法<!ELEMENT 元素名 (子元素[,子元素...])>
数量词:
+:表示出现一次或多次,至少一次
?:表示出现0次货1次
*:表示任意次
属性语法: <!ATTLIST 元素名称 属性名称 属性类型 默认值>
属性类型:
CDATA:值为字符数据 (character data)
ID:值为唯一的 id等等
默认值:#REQUIRED :属性值是必需的; #IMPLIED: 属性不是必需的;#FIXED value: 属性值是固 定的
<?xml version="1.0" encoding="UTF-8"?>
<!-- 声明内部DTD -->
<!--
CDATA:字符串
#REQUIRED:必需得
#PCDATA:内容必需为文本
-->
<!DOCTYPE scores [
<!ELEMENT scores (student*)>
<!ELEMENT student (name,course,score)>
<!ATTLIST student id CDATA #REQUIRED>
<!ELEMENT name (#PCDATA)>
<!ELEMENT course (#PCDATA)>
<!ELEMENT score (#PCDATA)>
]>
<scores>
<student id='1'>
<name>王彤</name>
<course>java</course>
<score>89</score>
</student>
<student id='2'>
<name>李佳</name>
<course>mysql</course>
<score>99</score>
</student>
</scores>
b)外部DTD
创建一个独立的dtd文件
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT scores (student*)>
<!ELEMENT student (name,course,score)>
<!ATTLIST student id CDATA #REQUIRED>
<!ELEMENT name (#PCDATA)>
<!ELEMENT course (#PCDATA)>
<!ELEMENT score (#PCDATA)>
在xml'文件中因素dtd约束文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入外部dtd文件 -->
<!DOCTYPE scores SYSTEM "scores.dtd">
<scores>
<student id='1'>
<name>王彤</name>
<course>java</course>
<score>89</score>
</student>
<student id='2'>
<name>李佳</name>
<course>mysql</course>
<score>99</score>
</student>
</scores>
一、XML解析
- DOM解析 官方提供的解析方式,基于xml树结构解析 ,消耗资源
- SAX解析 基于事件的解析 , 消耗资源小,适用于数据量大的XML
- JDOM解析 比DOM 第三方提供,开源免费的解析方式,比DOM解析快
- DOM4J解析 第三方提供 开源免费 是JDOM升级版性能优异、功能强大 java XML api
导包dom4j
package com.bjsxt.cml;
import java.io.File;
import java.util.Iterator;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class TestXml {
public static void main(String[] args) throws DocumentException {
//[1]创建SAXReader对象,用于读取xml文件
SAXReader reader = new SAXReader();
//[2]读取xml文件,等到document对象
Document d = reader.read(new File("src/scores2.xml"));
//[3]获取根元素
Element root = d.getRootElement();
//[4]获取根元素下的所有子元素
Iterator<Element> it = root.elementIterator();
while(it.hasNext()){
//取出元素
Element e = it.next();
//获取属性
//Attribute is = e.attribute(0);//根据属性下标获取属性
//Iterator<Element> i = e.attributeIterator();//获取属性迭代器获取多个属性
Attribute id = e.attribute("id");//根据属性名获取属性
System.out.println(id.getName()+"="+id.getValue());
//获取student的子元素
Element name = e.element("name");
Element course = e.element("course");
Element score = e.element("score");
System.out.println(name.getName()+"="+name.getStringValue());
System.out.println(course.getName()+"="+course.getText());
System.out.println(score.getName()+"="+score.getStringValue());
}
}
}
二、生成XML
package com.bjsxt.cml;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
public class TestCreateXml {
public static void main(String[] args) throws IOException {
//[1]通过DocumentHelper生成一个Document对象
Document doc = DocumentHelper.createDocument();
//[2]添加并得到根元素
Element root= doc.addElement("books");
//[3]为根元素添加子元素
Element book = root.addElement("book");
//[4]为book元素添加属性
book.addAttribute("id", "1");
//[5]为book元素添加子元素
Element name = book.addElement("name");
Element author = book.addElement("author");
Element price = book.addElement("price");
//[6]为子元素添加文本
name.addText("Thinking in java");
author.addText("小明");
price.addText("118");
// //[7]将doc输出到一个xml文件中
// Writer writer = new FileWriter(new File("src/books.xml"));
// doc.write(writer);
// //关闭资源
// writer.close();
//[7]格式良好的xml
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(new FileWriter(new File("src/books2.xml")) , format);
writer.write(doc);
writer.close();
}
}