XML
XML可扩展标记语言,没有固定的标签,所有标签都可以自定义
xml被用于信息的记录和传递,经常被当作配置文件
(1)声明信息
描述xml的版本信息和编码方式
<?xml version="1.0" encoding="UTF-8"?>
(2)DTD
DTD:文档类型定义
DTD用于约束xml的文档格式,DTD分为两种,内部DTD,外部DTD
1.内部DTD
1.声明根元素
xml有且只有一个根元素
<!DOCTYPE 根元素 [元素声明]>
2.元素声明
<!ELEMENT 元素名 (子元素[, 子元素...])>
数量词:
+:出现一次或多次
?:出现一次或0次
*:出现任意次
3.属性声明
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
属性类型:
CDTA,表示字符数据
#REQUIRED:表示这个属性是必需的
#IMPLED:表示这个属性不是必需的
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE players [
<!ELEMENT players (player)+>
<!ELEMENT player (name,height,score)>
<!ATTLIST player id CDATA #REQUIRED>
<!ELEMENT name (#PCDATA)>
<!ELEMENT height (#PCDATA)>
<!ELEMENT score (#PCDATA)>
]>
<players>
<player id="1">
<name>欧文</name>
<height>190</height>
<score>50</score>
</player>
<player id="2">
<name>库里</name>
<height>191</height>
<score>35</score>
</player>
</players>
2.外部DTD
xml中引入外部DTD文件
players.dtd
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT players (player)+>
<!ELEMENT player (name,height,score)>
<!ATTLIST player id CDATA #REQUIRED>
<!ELEMENT name (#PCDATA)>
<!ELEMENT height (#PCDATA)>
<!ELEMENT score (#PCDATA)>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE players SYSTEM "players.dtd">
<players>
<player id="1">
<name>欧文</name>
<height>190</height>
<score>50</score>
</player>
<player id="2">
<name>库里</name>
<height>191</height>
<score>35</score>
</player>
</players>
解析xml
1.DOM解析
基于xml树解析
2.SAX解析
基于事件的解析
3.JDOM解析
第三方提供,开源免费的解析方式,比DOM解析快
4.DOM4J
第三方提供,开源免费,是JDOM的升级版
SAX解析
SAX解析
1.获取解析工厂
SAXParserFactory factory=SAXParserFactory.newInstance();
2.从解析工厂获取解析器
SAXParser parse=factory.newSAXParser();
3.加载文档Docunment注册处理器
4.编写处理器
PersonHandler handler=new PersonHandler ();
parse.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream(“person.xml”),handler);
1.SAX解析获取数据
<?xml version="1.0" encoding="UTF-8" ?>
<persons>
<person>
<name>欧文</name>
<height>188</height>
</person>
<person>
<name>乔丹</name>
<height>198</height>
</person>
</persons>
import org.xml.sax.Attributes;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.IOException;
public class XmlTest {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
//SAX解析
//1.获取解析工厂
SAXParserFactory factory=SAXParserFactory.newInstance();
//2从解析工厂中获取解析器
SAXParser parser=factory.newSAXParser();
//3编写处理器 继承DefaultHandler
//4.加载文档Document注册处理器
PersonHandler handler=new PersonHandler();
//5.解析器解析
parser.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream("person.xml"),handler);
}
}
class PersonHandler extends DefaultHandler{ //处理器
@Override
public void startDocument() throws SAXException {
System.out.println("-----解析文档开始----");
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.out.println(qName+" 解析");
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
String contents=new String(ch,start,length).trim();
if(contents.length()>0){
System.out.println("内容为:"+contents);
}else{
System.out.println("内容为空");
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.println(qName+" 解析结束");
}
@Override
public void endDocument() throws SAXException {
System.out.println("----解析文档结束-----");
}
}
DOM4J解析xml
需导入dom4j的jar包
读取xml
其内部有DOMReader和SAXReader两种
解析流程
1.创建SAXReader对象,读取xml文件
2.获得Document对象
3.获取根元素
4.获取根元素下的所有元素
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.util.Iterator;
public class Test {
public static void main(String[] args) throws Exception {
//1.获取SAXReader
SAXReader reader=new SAXReader();
//2.获取Document对象
Document document=reader.read(new File("src/player.xml"));
//3获取根元素
Element root=document.getRootElement();
//遍历根元素下的子元素
Iterator<?> it=root.elementIterator();
while (it.hasNext()){
Element e= (Element) it.next();
System.out.println(e.getName());
Attribute id=e.attribute("id"); //获得属性
System.out.println(id.getName()+":"+id.getValue());
Element name=e.element("name");
System.out.println(name.getName()+":"+name.getText());
Element height=e.element("height");
System.out.println(height.getName()+":"+height.getText());
Element score=e.element("score");
System.out.println(score.getName()+":"+score.getText());
System.out.println();
}
}
}
输出结果:
player
id:1
name:欧文
height:190
score:50
player
id:2
name:库里
height:191
score:35
创建xml文件
创建流程
1.通过DocumentHelper创建一个Document对象
2.添加根元素
3.根元素添加子元素
4.再添加子元素或属性
5.添加文本
6.输出到xml文件中,可使用美化输出
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class Test2 {
public static void main(String[] args) throws IOException {
//1通过DocumentHelper获取Document对象
Document document=DocumentHelper.createDocument();
//2创建根元素
Element root=document.addElement("players");
//3创建根元素的子元素
Element player=root.addElement("player");
//4子元素添加属性
player.addAttribute("id","1");
Element name=player.addElement("name");
name.addText("欧文"); //添加文本
Element height=player.addElement("height");
height.addText("190");
Element score=player.addElement("score");
score.addText("50");
Writer writer = new FileWriter(new File("src/player.xml"));
document.write(writer);
writer.close();
}
}
不使用美化
可读性不强,不美观
所以使用OutputFormat来美化
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class Test2 {
public static void main(String[] args) throws IOException {
//1通过DocumentHelper获取Document对象
Document document=DocumentHelper.createDocument();
//2创建根元素
Element root=document.addElement("players");
//3创建根元素的子元素
Element player=root.addElement("player");
//4子元素添加属性
player.addAttribute("id","1");
Element name=player.addElement("name");
name.addText("欧文"); //添加文本
Element height=player.addElement("height");
height.addText("190");
Element score=player.addElement("score");
score.addText("50");
OutputFormat format=OutputFormat.createPrettyPrint();
XMLWriter writer=new XMLWriter(new FileWriter("src/players.xml"),format);
writer.write(document);
writer.close();
}
}