XML - -DOM解析

========

                 理解熟悉:

// StreamResult result=new StreamResult(new FileOutputStream(path));
// SteamResult:充当转换结果的持有者,可以为 XML、纯文本、HTML 或某些其他格式的标记。
// StreamResult(OutputStream outputStream);从字节流构造 StreamResult。
                 StreamResult result=new StreamResult(new OutputStreamWriter(new FileOutputStream(path), "gb2312"));
// 然后将被变换的Document对象封装到一个DOMSource对象中,DOMSource类在javax.xml.transform.dom包中。 
                DOMSource  source=new DOMSource(document);
                transformer.transform(source, result);

========

 ================================代码开始========================================

一。XMLDemo

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 XMLDemo {
	private Document document = null;
	public static void main(String[] args) {
		XMLDemo xd=new XMLDemo();
		xd.getDocument();
		xd.showInfo();
//		xd.add();
//		xd.update();
//		xd.savaXML("new.xml");
//		xd.delete();
	}
	public void getDocument(){
		try {
			//创建解析器工厂实例
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			//通过工厂获得解析器
			DocumentBuilder db;
			db = factory.newDocumentBuilder();
			//解析器对象指定XML文件创建Document对象
			document = db.parse("收藏信息.xml");
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	//载入元素
	public void showInfo(){
		//以Document为起点操作DOM树,拿到brand节点集合
		NodeList brands =document.getElementsByTagName("brand");
		for(int i=0;i<brands.getLength();i++){
			//获得集合里的各个元素(element)
			Node node=(Node)brands.item(i);
			//类型转换为(element)
			Element eleBrand=(Element)node;
			//取得元素里 属性名name的属性值
			System.out.println(eleBrand.getAttribute("name"));
			
			//拿到brand节点下子节点type集合
			NodeList types=eleBrand.getChildNodes();
			for(int j=0;j<types.getLength();j++){
				Node typeNode=types.item(j);
				//为了过滤掉文本里空格和文本等,加上判断是否为元素,不然运行容易报错
				if(typeNode.getNodeType()==Node.ELEMENT_NODE){
					Element eleType=(Element)typeNode;
					System.out.println("  "+eleType.getAttribute("typename"));
				}
			}
		}
	}
		
	//保存新新XML文件
	public void savaXML(String path){
/*
 *  DOM对象转化为XML文件
        解析器通过在内存中建立和XML结构相对应的树状结构数据,使得应用程序可以方便地获得XML文件中的数据,
        同时提供了使用内存中的树状结构数据建立一个XML文件的API,即使用解析器得到的Document对象建立一个新的XML文件。
        但是需要注意的是,Android2.1中没有相应的类包,从2.2开始才加入了。
        解析器的parse方法将整个被解析的XML文件封装成一个Document节点返回,
        我们可以对Document节点进行修改,然后使用 Transformer对象将一个Document节点变换为一个XML文件。
 * */
		TransformerFactory factory=TransformerFactory.newInstance();
		factory.setAttribute("indent-number", "4");
		try {
			Transformer transformer=factory.newTransformer();
			transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312");
			transformer.setOutputProperty(OutputKeys.INDENT, "yes");
//			StreamResult result=new StreamResult(new FileOutputStream(path));
//			SteamResult:充当转换结果的持有者,可以为 XML、纯文本、HTML 或某些其他格式的标记。
//			StreamResult(OutputStream outputStream);从字节流构造 StreamResult。
			StreamResult result=new StreamResult(new OutputStreamWriter(new FileOutputStream(path), "gb2312"));
//			然后将被变换的Document对象封装到一个DOMSource对象中,DOMSource类在javax.xml.transform.dom包中。			
			DOMSource  source=new DOMSource(document);
			transformer.transform(source, result);
		} catch (TransformerConfigurationException e) {
			e.printStackTrace();
		} catch (TransformerException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		
	}
	
	//增加元素
	public void add(){
		Element element=document.createElement("Brand");
		element.setAttribute("name", "三星");
		Element ele1=document.createElement("Type");
		ele1.setAttribute("typename", "Note3");
		element.appendChild(ele1);
		document.getElementsByTagName("PhoneInfo").item(0).appendChild(element);
		this.savaXML("new.xml");
	}
	
	//删除元素
	public void delete(){
		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("苹果")){
				eleBrand.getParentNode().removeChild(eleBrand);
			}
		}
	//	this.savaXML("new.xml");
	}
	
	//修改元素,为每一个Brand增加一个id 属性分别为 0 1 2 ;
	public void update(){
		NodeList brands=document.getElementsByTagName("Brand");
		for(int i=0;i<brands.getLength();i++){
			Node brand=brands.item(i);
			Element eleBrand=(Element)brand;
			eleBrand.setAttribute("id", i+"");
		}
	//	this.savaXML("new.xml");
	}
}

 二、收藏信息.xml

<?xml version="1.0" encoding="GB2312"?>
<PhoneInfo>
	<brand name="华为">
		<type typename="U8650"/>
		<type typename="HW123"/>
		<type typename="HW321"/>
	</brand>
	<brand name="苹果">
		<type typename="iphone4"/>
		<type typename="iphone5"/>
		<type typename="iphone6"/>
	</brand>
</PhoneInfo>

猜你喜欢

转载自4636.iteye.com/blog/2316852