xml是可扩展标记语言,非常灵活,没有固定的标签,所有的标签都可以自定义。xml通常用于信息的记录和传递,经常被用于充当配置文件。
xml的格式
1. 声明信息,用于描述xml的版本和编码方式
<?xml version="1.0" encoding="UTF-8"?>
2. xml有且仅有一个根元素(元素由开始标签、元素内容和结束标签组成)
3. xml是大小写敏感的
4. 标签是成对出现的,并且要正确嵌套
5. 属性值要使用双引号
6. 注释的写法
<!-- Here is the comment -->
DTD(文档类型定义)
DTD用于约束xml的文档格式,保证xml是一个有效的xml文件。
DTD可以分为内部DTD和外部DTD。内部DTD是指所有代码写在xml内部。外部DTD则是独立的。
使用DTD
- 内部DTD
语法
<!DOCTYPE 根元素 [元素声明]>
元素声明语法
<!ELEMENT 元素名 (子元素)>
数量词
+ | 出现至少一次 |
? | 出现0次或1次 |
* | 出现任意次 |
属性声明语法
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
属性类型:CDATA表示字符数据
默认值:
- #REQUIRED: 表示必须出现
- #IMPLIED: 表示不是必须的
带DTD的完整xml代码:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 声明内部DTD -->
<!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="01">
<name>Tom</name>
<course>Java</course>
<score>89</score>
</student>
<student id="02">
<name>Rob</name>
<course>MYSQL</course>
<score>58</score>
</student>
</scores>
- 外部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 "NewTest.dtd">
<scores>
<student id="01">
<name>Tom</name>
<course>Java</course>
<score>89</score>
</student>
<student id="02">
<name>Rob</name>
<course>Python</course>
<score>58</score>
</student>
</scores>
xml解析技术
xml解析就是对xml文件进行操作,包括创建xml和对xml文件进行增、删、改、查操作。
常见的xml解析技术
- DOM解析
DOM解析是官方提供的解析方式,它的特点是基于xml树结构,但是比较耗资源,适用于多次访问xml。
- SAX解析
SAX解析基于事件,代码多,写起来麻烦。
- JDOM解析
JDOM解析是由第三方提供,开源免费的解析方式,比DOM解析要快。
- DOM4J解析
DOM4J解析是第三方提供的开源免费的解析方式,是JDOM的升级版,使用接口而不是实现类。使用较广。
DOM4J解析xml
解析xml文件的入口是需要先拿到一个Document对象。
读取xml文件中的信息
导入dom4j的jar包(https://dom4j.github.io/#)
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 Try {
public static void main(String[] args) throws DocumentException {
// TODO Auto-generated method stub
//创建SAXReader对象,用于读取xml文件
SAXReader reader = new SAXReader();
//读取xml文件,得到Document文件
Document doc = reader.read(new File("src/scores.xml"));
//获取根元素
Element root = doc.getRootElement();
//获取根元素下的所有子元素
Iterator<?> it = root.elementIterator();
while(it.hasNext())
{
//取出元素
Element e = (Element) it.next();
System.out.println(e.getName());
//获取id属性
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.getText());
System.out.println("****************");
}
}
}
用dom4j创建xml
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
public class Testsml {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
//通过DocumentHelper生成一个Document对象
Document doc = DocumentHelper.createDocument();
//doc.addElement("books").addElement(book).addAttribute("id","b01");
//添加并得到根元素
Element root = doc.addElement("books");
//为根元素添加子元素
Element book = root.addElement("book");
//为book元素添加属性,链式编程
book.addAttribute("id", "b01");
//为book添加子元素
Element name = book.addElement("name");
Element author = book.addElement("author");
Element price = book.addElement("price");
//为子元素添加文本信息
name.addText("Thinking in Java");
author.addText("Tom");
price.addText("77");
/*//将doc输出到xml文件中
Writer writer = new FileWriter(new File("src/books.xml"));
doc.write(writer);
//关闭资源
writer.close();*/
//格式良好的输出
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(new FileWriter(new File("src/books.xml")),format);
writer.write(doc);
//关闭资源
writer.close();
}
}