DOM解析XML文件,增删改查

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_40969422/article/details/80391734
<?xml version="1.0" encoding="UTF-8"?>
<PhoneInfo>
	<Brand name="华为">
		<type name="U8650"/>
		<type name="HW123"/>
		<type name="HW456"/>
	</Brand>
	<Brand name="苹果">
		<type name="iphone6"/>
		<type name="iphone6p"/>
		<type name="iphone7"/>
	</Brand>
</PhoneInfo>
package cn.dom;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
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;

/**
 *使用DOM解析文件
 */
public class ParseXMLDemo {
	//收藏信息.xml对应的Document
	private Document document;
	public void getDom(){
		//获得工厂解析器
		DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
		try {
			//根据解析器工厂获得解析器
			DocumentBuilder builder=factory.newDocumentBuilder();
			//解析器来解析XML文件获得Document对象,一个路径下的文件
			document=builder.parse("收藏信息.xml");
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	/**
	 * 获取手机品牌相关信息
	 */
	public void showInfo(){
		//以Document做起点,先拿到所有Brand节点
		NodeList brands=document.getElementsByTagName("Brand");
		//遍历brands,从中拿出每一个brand节点
		//新方法,getLength()
		for (int i = 0; i < brands.getLength(); i++) {
			Node node=brands.item(i);
			Element eleBrand=(Element) node;
			//拿到属于brand的name
			System.out.println(eleBrand.getAttribute("name"));
			//继续往下,找每个Brand的子节点
			NodeList types=eleBrand.getChildNodes();
			for (int j = 0; j < types.getLength(); j++) {
				Node typeNode=types.item(j);
				//判断该子节点是否为元素节点
				//Node.ELEMENT_NODE是否为元素
				if(typeNode.getNodeType()==Node.ELEMENT_NODE){
					Element eleType=(Element) typeNode;
					System.out.println("\t"+eleType.getAttribute("name"));
				}
			}
		}
	}
	/**
	 * 为XML文件添加元素
	 */
	public void addEle(){
		//(1)创建<Brand name="三星">
		Element brand=document.createElement("Brand");
		//为<Brand>设置name属性取值为三星
		brand.setAttribute("name", "三星");
		//<Type name="NOTE2"/>
		Element type = document.createElement("Type");
		type.setAttribute("name", "NOTE2");
		//将type作为Brand的子元素
		brand.appendChild(type);
		//将Brand放到PhoneInfo中去,位置为第一个PhoneInfo,item(0)
		document.getElementsByTagName("PhoneInfo").item(0).appendChild(brand);
		saveXML("收藏信息.xml");
	}
	/**
	 * 保存XML文件(需借助转换器:源(最新DOM树)--》目的地(收藏信息.xml),借助输出流来实现)
	 */
	public void saveXML(String path){
		//转换器工厂
		TransformerFactory factory=TransformerFactory.newInstance();
		//设置格式,首行缩进4个空格
		factory.setAttribute("indent-number", 4);
		try {
			//转换器
			Transformer transformer=factory.newTransformer();
			//指定转换格式,ENCODING文字编码格式
			transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
			//设置准许缩进YES
			transformer.setOutputProperty(OutputKeys.INDENT, "YES");
			//源(最新DOM树)-->目的地(收藏信息.xml)
			DOMSource source=new DOMSource(document);
			//传进一个要保存的文件地址path
			OutputStream out=new FileOutputStream(path);
			StreamResult result=new StreamResult(new OutputStreamWriter(out,"UTF-8"));
			transformer.transform(source, result);
		} catch (TransformerConfigurationException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (TransformerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	/**
	 * 修改元素
	 * 给Brand添加id属性 值为下标+""一个空字符,String类型
	 */
	public void updateEle(){
		//获得所有元素
		NodeList brands=document.getElementsByTagName("Brand");
		for (int i = 0; i < brands.getLength(); i++) {
			Node brand=brands.item(i);
			Element brandEle=(Element) brand;
			brandEle.setAttribute("id", i+"");
		}
		saveXML("收藏信息.xml");
	}
	/**
	 * 删除华为手机
	 */
	public void deleteEle(){
		NodeList brands=document.getElementsByTagName("Brand");
		for (int i = 0; i < brands.getLength(); i++) {
			Node brand=brands.item(i);
			Element brandEle=(Element) brand;
			if(brandEle.getAttribute("name").equals("华为")){
				//用父类节点删除子节点
				brandEle.getParentNode().removeChild(brandEle);
			}
		}
		saveXML("收藏信息.xml");
	}
}
package cn.dom;

public class Test {
	public static void main(String[] args) {
		ParseXMLDemo pd=new ParseXMLDemo();
		pd.getDom();
		//pd.addEle();
		//pd.updateEle();
		pd.deleteEle();
		pd.showInfo();
	}
}

Element:XML文档中的一个元素 String getTagName 获取元素名称

常用接口 常用方法 说明
Document:表示整个XML文档

NodeList

getElementsByTagName(String Tag)

按文档顺序返回文档中指定标记名称的所有元素集合
  Element createElement(String tagName) 创建指定标记名称的元素
Node:该文档树中的单个节点 NodeList getChildNodes()

获取该元素所有子节点,返回节点集合

猜你喜欢

转载自blog.csdn.net/weixin_40969422/article/details/80391734