什么是XML?
xml
是可扩展标识语言,
开发者在符合 xml 命名规则的基础之上,可以根据自己的需求定义自己的标签
作用:存储数据
解析
方法:
DOM
、
DOM4J
、
SAX
Dom4J 解析 xml 文件
1.导入 Dom4J.jar 包
2.Dom4J
常用的对象:
- SAXReader:读取 xml 文件到 Document 树结构文件对象
- Document:是一个 xml 文档对象树,类比 Html 文档对象。
- Element:元素节点。通过 Document 对象可以查找单个元素
3.Dom4j
解析步骤:
(1)创建解析器
SAXReader reader = new SAXReader();
(2)Document
对象:通过解析器
read
方法获取
Document doc = reader.read("");
(3)获取 xml 根节点
Element root = doc.getRootElement();
(4)遍历解析子节点
//遍历 root 根节点下的 student 子节点
for(Iterator iter = root.elementIterator();iter.hasNext();){
//获取 student 节点对象
Element stuElement = (Element)iter.next();
//遍历 stuElement 节点下的所有子节点
for(Iterator innerIter = stuElement.elementIterator();innerIter.hasNext();){
//获取 student 节点下的子节点对象
Element innerElement = (Element)innerIter.next();
//通过 innerElement 的 getName()获取节点名称,getStringValue()获取节点值
String innerElementName=innerElement.getName();
String innerElementValue=innerElement.getStringValue();
}
}
实例:
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student>
<name>吴飞</name>
<college>信息学院</college>
<telephone>62354666</telephone>
<notes>男,1982年生,硕士,现就读于北京邮电大学</notes>
</student>
<student>
<name>李雪</name>
<college>信息学院</college>
<telephone>62358888</telephone>
<notes>男,1987年生,硕士,现就读于中国农业大学</notes>
</student>
<student>
<name>Jack</name>
<college>信息学院</college>
<telephone>66666666</telephone>
<notes>我是澳洲人</notes>
</student>
</students>
package com.xmltest;
import java.util.Iterator;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Dom4jTest {
public static void main(String[] args) {
//创建解析器
SAXReader reader=new SAXReader();
try {
//获取Document 对象
Document doc=reader.read("conf/student.xml");
//获取 xml 根节点
Element root=doc.getRootElement();
//遍历根节点,获取子节点
for(Iterator<Element> iter=root.elementIterator();iter.hasNext();) {
//获取student节点对象
Element stuElement=(Element)iter.next();
//打印出student节点名称
System.out.println(stuElement.getName()+":");
//遍历student节点的子节点:name,college,telephone,note
for(Iterator innerIter=stuElement.elementIterator();innerIter.hasNext();) {
//获取student子节点的对象
Element innerElement=(Element)innerIter.next();
String innerElementName=innerElement.getName();
String innerElementValue=innerElement.getStringValue();
System.out.println(innerElementName+":"+innerElementValue);
}
}
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Sax 解析 xml 文件
SAX 方式:事件驱动,边读边写
优点:无需将整个文档加载到内存中,所以内存消耗少,适合解析特别大的 xml文件
过程:
(1)创建解析工厂:通过
newInstance()
方法获取
SAXParserFactory saxParserFactory = SAXParaserFactory.newInstance();
(2)创建解析器
SAXParser saxParser = saxParserFactory.newSAXParser();
(3)执行 parser 方法,传入两个参数:xml 文件路径、事件处理器
saxParser.parser("", new MyDefaultHander1());
(4)创建一个类,继承 DefaultHander 类,重写三个方法
- startElement方法:获取开始标签
- qName:把标签名称返回
- attributes:返回标签中的属性对象
- character方法:获取标签文本内容
- endElement方法:获取结束标签
实例:
<?xml version="1.0" encoding="UTF-8"?>
<person>
<p1>
<name>zhangsan</name>
<age>20</age>
</p1>
<p1>
<name>lisi</name>
<age>21</age>
</p1>
</person>
package com.xmltest;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SAXTest {
public static void main(String[] args) throws IOException {
try {
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
SAXParser saxParser=saxParserFactory.newSAXParser();
saxParser.parse("conf/person.xml",new MyDefaultHandler());
} catch (ParserConfigurationException | SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class MyDefaultHandler extends DefaultHandler{
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.out.print("<"+qName+">");
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
System.out.print(new String(ch,start,length));
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.print("<"+qName+">");
}
}
XPath 解析 xml 文件
路径表达式:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<database-info>
<driver-name>com.mysql.jdbc.Driver</driver-name>
<url>jdbc:mysql:/test</url>
<user>root</user>
<password>123</password>
</database-info>
</config>
url的路径为:config --> database-info --> url
url的xpath:/config/database-info/url
url的xpath:config//url
url的xpath://url
步骤:
(1)通过 SAXReader 获取解析器
SAXReader reader = new SAXReader();
(2)通过解析器的 read 方法获取 Document 对象
Document doc = reader.read("");
(3)通过 xpath 语法获取具体节点
package com.xmltest;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class SysConfigParser {
public static void main(String[] args) {
SAXReader reader=new SAXReader();
try {
Document doc=reader.read("conf/sys.xml");
Element driverNameElt = (Element) doc.selectObject("/config/database-info/driver-name");
String driverName= driverNameElt.getStringValue();
System.out.println(driverName);
Element urlElt=(Element) doc.selectSingleNode("config//url");
String url=urlElt.getStringValue();
System.out.println(url);
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}