如何使用DOM解析XML文件?

import java.io.FileOutputStream;
import java.io.OutputStreamWriter;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
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;

public class XmlParse {
	
	private Document doc=null;
	//测试
	public static void main(String[] args) throws Exception {
		XmlParse aa=new XmlParse();
		aa.getDocument();
		
		//aa.add();
		//aa.update();
		aa.delete();
		aa.show();
		
		
	}
	
	//获得XML文件
	public void getDocument()throws Exception{
		       //1.建立一个DocumentBuilderFactory工厂
				DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
				//2.
				DocumentBuilder builder=factory.newDocumentBuilder();
				//3.
				doc=builder.parse("test.xml");
	}

  //查
	public void show(){
		// TODO Auto-generated method stub
		//1.获取《Brand》所有的节点集合:
		NodeList brands=doc.getElementsByTagName("Brand");
		//2.遍历brand
		for(int i=0;i<brands.getLength();i++){
			//3。类似于数组,  用item(i):遍历返回的每一个节点
			Node node=brands.item(i);//得到是元素节点
			
			Element ele=(Element)node;
			//4.通过属性名得到属性值
			System.out.println(ele.getAttribute("name"));
			//5.接下来查找brand元素节点里面的子节点,输出
			NodeList types=ele.getChildNodes();
			//6.遍历子节点
			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("name"));
				}
			}
			
			
		}
			
	}


	//添加
	private void add() throws Exception {
		// TODO Auto-generated method stub
		//1.建立一个元素    createElement("Brand");
		Element ele=doc.createElement("Brand");
		//2.给元素设置一个属性
		ele.setAttribute("name", "苹果");
		Element el=doc.createElement("Type");
		el.setAttribute("name", "苹果6");
		//3.将type作为brand的子元素添加进去     appendChild(el)
		ele.appendChild(el);
		//4.将brand添加到phoneinfo
		doc.getElementsByTagName("PhoneInfo").item(0).appendChild(ele);
		sava();
	}

	//删除
	private void delete() throws Exception {
		// TODO Auto-generated method stub
		//1.先找到brand
		NodeList brands=doc.getElementsByTagName("Brand");
		for(int i=0;i<brands.getLength();i++){
			Node brand=brands.item(i);
			//3.把节点变成元素
			Element ele=(Element)brand;
			if(ele.getAttribute("name").equals("华为")){
				//4.先找到父节点,通过父节点来删除getParentNode()
				ele.getParentNode().removeChild(ele);
			}
		}
		sava();
	}

	//修改     给他加一个id属性
	private void update() throws Exception {
		// TODO Auto-generated method stub
		//1.首先获取brand指定标记名称的所有元素的集合
		NodeList brands=doc.getElementsByTagName("Brand");
		//2.遍历
		for(int i=0;i<brands.getLength();i++){
			Node brand=brands.item(i);
			//3.把节点变成元素
			Element ele=(Element)brand;
			ele.setAttribute("id", i+"");
		}
		sava();
	}

	//增删改后的保存操作
	private void sava() throws Exception {
		// TODO Auto-generated method stub
		//1.转换器工厂
		TransformerFactory factory=TransformerFactory.newInstance();
		//设置缩进
		factory.setAttribute("indent-number", 4);
		//2.通过转换器工厂得到一个转换器
		Transformer transformer=factory.newTransformer();
		transformer.setOutputProperty(OutputKeys.INDENT, "yes");
		DOMSource Source=new DOMSource(doc);  
		StreamResult result=new StreamResult(new OutputStreamWriter(new FileOutputStream("test.xml"),"utf-8"));
		
		//3.调方法transform()
		transformer.transform(Source, result);
	}
	
}

猜你喜欢

转载自blog.csdn.net/Java_stud/article/details/82349882
今日推荐