解析XML:DOM和DOM4j

DOM解析XML文件

DOM一些介绍请看前一篇文章http://t.csdn.cn/aVY2E

DOM解析XML文件步骤  

1.创建解析器工厂对象  

2.解析器工厂对象创建解析器对象  

3.解析器对象指定XML文件创建Document对象  

4.以Document对象为起点操作DOM树 

对XML文件进行添加元素,删除元素,修改元素,查找元素,保存修改后的XML文件这五项操作,

涉及Document接口,DocumentBuilderFactory类,DocumentBuilder类,Element接口,Node接口,NodeList接口,TransformerFactory类,Transformer类,DOMSource类,StreamResult类。通过对象调用涉及以上接口,类的方法来执行对XML文件的操作

保存XML文件步骤: 

1.获得TransformerFactory对象

2.创建Transformer对象

3.创建DOMSource对象 包含XML信息

4.设置输出属性 编码格式

5.创建StreamResult对象 包含保存文件的信息

6.将XML保存到指定文件中 

实例:

package demo01;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class ParseXMLDemo {
	private Document document = null;

	//定义一个方法,将XML文件转换为Document对象
	public void getDocument(String url) {
		//获取解析器工厂引用
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		try {
			//通过解析器工厂引用调用方法获取解析器的引用
			DocumentBuilder builder = factory.newDocumentBuilder();
			//通过解析器引用调用方法将指定的XML文件转换为Document类对象
			document = builder.parse(url);
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	// 获取手机品牌和属性
	public void showInfo() {
		//从document对象出发,调用方法获取节点,根据标签的名称来获取节点,获取的可能有多个节点,所以得到的是一个节点集合
		NodeList brands = document.getElementsByTagName("Brand");
		//遍历节点集合,取出里面的元素,getLength():获取节点集合中的元素个数
		for (int i = 0; i < brands.getLength(); i++) {
			//item():将元素从集合中取出来,取出来的是父类型Node
			Node node = brands.item(i);
			//将父类型向下转型为真正的类型,Brand是一个标签节点,所以向下转型为Element
			Element eleBrand = (Element) node;
			//得到标签节点后,调用方法获取指定属性的属性值
			System.out.println(eleBrand.getAttribute("name"));

			//获取Brand标签的子节点,可能有多个不同类型的子节点,将获取的子节点存储在节点集合中  getChildNodes():获取子节点的方法
			NodeList types = eleBrand.getChildNodes();
			//遍历子节点的集合
			for (int j = 0; j < types.getLength(); j++) {
				//从集合中取出子节点
				Node typeNode = types.item(j);
				//从集合中取出来的子节点类型可能是文本节点,也可能是标签节点,所以在进行类型转换之前,要进行类型判断, getNodeType() 获取节点的类型值,是一个short值,Node里面给不同类型的节点赋予了一个静态常量值,其中Element类型节点的值为1
				if (typeNode.getNodeType() == Node.ELEMENT_NODE) {
					//将父节点向下转型为子节点类型
					Element eleType = (Element) typeNode;
					//通过子节点调用方法获取执行属性的属性值
					System.out.println("\t"+eleType.getAttribute("name"));
				}
			}
		}
	}

	// 保存XML文件:将Java内存中的document对象存储到外部xml文件中,需要借助转换器对象实现此功能
	public void savaXML(String path) {
		//创建转换器工厂对象
		TransformerFactory factory = TransformerFactory.newInstance();
		//设置首行缩进4个字符
		factory.setAttribute("indent-number", "4");
		try {
			//通过转换器工厂对象创建转换器对象
			Transformer transformer = factory.newTransformer();
			//设置存储的格式
			transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
			transformer.setOutputProperty(OutputKeys.INDENT, "yes");
			//创建transform()方法需要的两个参数对象
			StreamResult result = new StreamResult(new OutputStreamWriter(
					new FileOutputStream(path), "UTF-8"));
			DOMSource source = new DOMSource(document);
			
			/*通过转换器对象调用方法将Java内存中的document对象存储到外部XML文件中,
			 * transform(Source source,Result result)需要两个参数,
			 * Source表示源头,也就是Java内存中的document对象,而Source是一个接口,不能直接创建对象,可以使用其实现类DOMSource
			 * Result表示结果,也就是Java内存中的document对象要存储的位置,而Result是一个接口,不能直接创建对象,可以使用其实现类StreamResult
			 * 
			 */
			transformer.transform(source, result);
		} catch (TransformerConfigurationException e) {
			e.printStackTrace();
		} catch (TransformerException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	}

	// 添加元素到XML文件中
	public void add() {
		//通过document对象调用方法创建一个元素节点
		Element element = document.createElement("Brand");
		//通过创建的元素节点调用方法给元素节点设置属性及属性值
		element.setAttribute("name", "三星");
		通过document对象调用方法创建一个元素节点
		Element ele1 = document.createElement("Type");
		//通过创建的元素节点调用方法给元素节点设置属性及属性值
		ele1.setAttribute("name", "Note3");
		//将创建好的两个节点建立关系
		element.appendChild(ele1);
		//获取xml文件中的第一个PhoneInfo元素节点,然后将创建好的brand标签作为子节点追加到获取的第一个PhoneInfo元素节点中
		document.getElementsByTagName("PhoneInfo").item(0).appendChild(element);
		//元素添加完毕之后,需要将java内存中的document对象存储到xml文件中
		this.savaXML("收藏信息.xml");
	}

	// 修改:修改xml文件中的内容
	public void update() {
		//通过document对象获取你想要修改的元素,将获取的元素存储在节点集合中
		NodeList brands = document.getElementsByTagName("Brand");
		//遍历节点结合,修改节点(给节点添加了一个id属性)
		for (int i = 0; i < brands.getLength(); i++) {
			//取出节点集合中的元素
			Node brand = brands.item(i);
			//将节点元素转换成其真正的类型
			Element eleBrand = (Element) brand;
			//给元素节点添加了一个新的属性id
			eleBrand.setAttribute("id", i + "");
		}
		this.savaXML("收藏信息.xml");
	}

	// 删除:删除xml文件中的某一些标签
	public void delete() {
		//通过Document对象获取你想要删除的元素节点,将元素节点存储在节点集合中
		NodeList brands = document.getElementsByTagName("Brand");
		//遍历结合
		for (int i = 0; i < brands.getLength(); i++) {
			//取出节点集合中的元素
			Node brand = brands.item(i);
			//将节点转换成真正的类型
			Element eleBrand = (Element) brand;
			//从遍历出的元素节点找出你要删除的元素节点,通过元素节点的属性值值来找
			if (eleBrand.getAttribute("name").equals("华为")) {
				//删除元素,不能自己删除自己,需要通过其父元素来删除   getParentNode():获取父节点   removeChild(元素节点名):删除子节点
				eleBrand.getParentNode().removeChild(eleBrand);
			}
		}
		this.savaXML("收藏信息.xml");
	}
	
	//测试
	public static void main(String[] args) {
		//创建ParseXMLDemo类对象
		ParseXMLDemo pd = new ParseXMLDemo();
		pd.getDocument("收藏信息.xml");
//		pd.showInfo();
		 pd.add();
		 pd.showInfo();
//		 pd.update();
//		 pd.delete();
//		 pd.showInfo();
	}

	
	
}

DOM4j解析XML文件

DOM4j简介

        DOM4J是 dom4j.org 出品的一个开源 XML 解析包。DOM4J应用于 Java 平台,采用了 Java 集合框架并完全支持 DOM,SAX 和 JAXP

DOM4J 使用起来非常简单。只要你了解基本的 XML-DOM 模型,就能使用

Dom:把整个文档作为一个对象

DOM4J 最大的特色是使用大量的接口。它的主要接口都在org.dom4j里面定义

Document:定义XML文档

Element:定义XML元素

Text:定义XML文本节点

Attribute:定义了XML 的属性

JDK中是没有DOM4j解析XML文件所需的类和接口,需要从网页下载,网址如下:dom4jicon-default.png?t=M7J4https://dom4j.github.io/#parsing下载完成是需要配置入你所写文件中;

以MyEclipse为例,配置步骤如下:

1.在工程右击点开Build Path,点击Configure Build Path...

2.点击Add Library...

 

 

3.点击Add Library...后,出现这个界面,点击User Library,再点击Next

 

4.点击User Libraries...

 

5.点击New...,新建文件,给文件取名,点击OK

 

 

6.点击新建文件,再点击Add JARs...,寻找到从dom4j网站下载的文件,点击OK

 

 

7.出现文件前像奶杯的图标,表示文件已配置完成,一路点OK就行了。至此,就可以使用DOM4j所需要的类和接口了

 完成之后工程界面图案:

 

 

 

实例:

package cn.bdqn.demo02;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;



public class Dom4j {
	public static Document doc;
	
	//定义方法:将xml文件转换为document类对象
	public static void loadDocument(){
		//创建SAXReader类对象,调用方法read()方法将xml文件转换为document类对象
		SAXReader saxReader = new SAXReader();
		try {
			doc = saxReader.read(new File("收藏信息.xml"));
		} catch (DocumentException e) {
			e.printStackTrace();
		}
				
	}
	
	//修改:修改xml文件中的内容
	public static void updatePhoneInfo(){
		//获取XML的根节点
		Element root = doc.getRootElement();
		int id =0;
		for (Iterator itBrand = root.elementIterator();itBrand.hasNext();) {
			Element brand =(Element) itBrand.next();
			id++;
			brand.addAttribute("id", id+"");
			
			
		}
		saveXML("收藏信息.xml");
	}
	
    //删除:删除xml文件中的某一些标签
	public static void deleteItem(){
		//获取XML的根节点
		Element root = doc.getRootElement();
		for(Iterator itBrand = root.elementIterator();itBrand.hasNext();){
			Element brand =(Element) itBrand.next();
			if(brand.attributeValue("name").equals("华为")){
				//删除元素需要通过其父元素来进行删除
				brand.getParent().remove(brand);
			}
		}
		saveXML("收藏信息.xml");
	}
	
	//定义方法:显示xml文件中的手机品牌和类型
	public static void showPhoneInfo(){
		//获取xml的根节点
		Element root = doc.getRootElement();
		//通过根节点调用elementIterator()方法获取根节点的所有子元素Brand,将获取的brand标签存储在迭代器,然后遍历所有的Brand标签
		for(Iterator itBrand = root.elementIterator();itBrand.hasNext();){
			Element brand = (Element) itBrand.next();
			//attributeValue(属性名):根据属性名输出标签的属性值
			System.out.println("品牌:"+brand.attributeValue("name"));
			//使用brand节点调用elementIterator()方法获取brand标签的子标签type,然后遍历Type标签
			for (Iterator itType = brand.elementIterator();itType.hasNext();) {
				Element type = (Element) itType.next();
				//attributeValue(属性名):根据属性名输出标签的属性值
				System.out.println("\t型号:"+type.attributeValue("name"));
				
				
			}
		}
	}
	
	
    //保存XML文件
	public static void saveXML(String path){
		try {
			OutputFormat format = OutputFormat.createPrettyPrint();
			format.setEncoding("GBK");// 指定XML编码
			XMLWriter writer= new XMLWriter(new FileWriter(path), format);
			writer.write(doc);
			writer.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	//添加元素到XML文件中
	public static void addNewPhoneInfo(){
		//获取xml的根节点
		Element root = doc.getRootElement();
		//创建Brand标签
		Element el = root.addElement("Brand");
		//给Brand标签设置属性
		el.addAttribute("name", "三星");
		//创建Type标签
		Element typeEI = el.addElement("Type");
		//给Type标签设置属性
		typeEI.addAttribute("name", "Note4");
		saveXML("收藏信息.xml");
				
	}
	
	
	public static void main(String[] args){
		loadDocument();
//		 showPhoneInfo();
		// saveXML("收藏.xml");
//		 addNewPhoneInfo();
//		 updatePhoneInfo();
		deleteItem();
		showPhoneInfo();
	}
	
	
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值