XML小结

什么是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();
		}
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值