JavaSE XML操作

XML操作

HTML与XML区别

Html:超文本标记语言,属于解析型语言,不需要编译就可以运行,浏览器可以直接解析,一个网页从服务器到浏览器就是通过发送Html文件格式,采用标签来存储数据,作用是用来展示数据,不区分大小写

XML:可扩展性标记语言,用于存储数据,XML文件格式非常有利于计算机之间的数据传送,区分大小写,由开始标签和结束标签构成,有且只有一个根节点

DTD

文档类型的定义,用于约束XML,内容包括,元素定义规则,属性定义规则,元素之间的关系

?:0-1次子元素

*:0-N次子元素

+:1-N次子元素

DOM解析

dom:Document Object Model 文档对象模型

主要对象

1.      Document:表示整个XML文档

    [1]    getElementByTagName(String),

    [2]    getDocumentElement()//得到根节点

2.      NodeList:表示XML文档节点集合

    [1]    item(index)

3.      Node:表示XML文档节点

    [1]    getChildNodes()

    [2]    getNodeName()

    [3]    getNodeValue()

    [4]    getTextContent()

4.      Element:表示文档元素,与node对等

    [1]    getAttribute(attr_name:String)

解析过程:




DOM加载xml
static {
	// 1.创建解析器工厂
	DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
	// 2.根据解析器工厂获得解析器对象
	DocumentBuilder builder;
	try {
		builder = factory.newDocumentBuilder();		
		//加载XML文档
		document = builder.parse(path);
	} catch (ParserConfigurationException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (SAXException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}	
}

DOM查询
public void show() {
	//Element root = document.getDocumentElement();//取出根节点
	NodeList list = document.getElementsByTagName("student");//取出所有的student标签	
	System.out.println("node sum : " + list.getLength());
	System.out.println("===================================");
	for(int i=0; i<list.getLength(); i++) {
		Node node = list.item(i);
		//取节点的属性必须转换为Element对象
		Element element = (Element)node;
		System.out.println("id = " + element.getAttribute("id"));		
		for(Node n = node.getFirstChild(); n != null; n = n.getNextSibling()) {				
			if(n.getNodeType() == Node.ELEMENT_NODE) {
				if(!n.getNodeName().equals("scores")) {
					System.out.println(n.getNodeName() + " = " + n.getFirstChild().getTextContent());
				} else {
					System.out.println(n.getNodeName() + " :");
					int flag = 1;
					for(Node cn = n.getFirstChild(); cn != null; cn = cn.getNextSibling() ) {
						if(cn.getNodeType() == Node.ELEMENT_NODE) {
							System.out.println("\t" + cn.getNodeName() + "_" + (flag++) + " = " + cn.getTextContent());
						}				
					}	
				}
			}
		}
		System.out.println("===================================");		
	}
}
	

DOM保存节点
//保存 dom 到 xml 文档,问题:不会保存 dtd 约束
public void save() {	
	TransformerFactory factory = TransformerFactory.newInstance();
	try {
		Transformer transformer = factory.newTransformer();
		DOMSource source = new DOMSource(document);
		StreamResult result = new StreamResult(path);
		transformer.transform(source, result);
	} catch (TransformerConfigurationException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (TransformerException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}	
}

DOM添加
//向 xml文件添加一个节点
public void add() {	
	String name = "赵珊珊";
	String id = "1004";
	String sex = "女";
	String age = "20";
	String phone = "15874862470";
		
	// 创建 student 节点
	Element element = document.createElement("student");
	// 创建 id 属性并赋值
	Attr idAttr = document.createAttribute("id");
	idAttr.setValue(id);
	//把 id 属性加入到 student 节点中
	element.setAttributeNode(idAttr);
	//创建 name 子节点
	Element nameEle = document.createElement("name");
	nameEle.setTextContent(name);
	element.appendChild(nameEle);
	//创建 sex 子节点
	Element sexEle = document.createElement("sex");
	sexEle.setTextContent(sex);
	element.appendChild(sexEle);
	//创建 age 子节点
	Element ageEle = document.createElement("age");
	ageEle.setTextContent(age);
	element.appendChild(ageEle);
	//创建 phone 子节点
	Element phoneEle = document.createElement("phone");
	phoneEle.setTextContent(phone);
	element.appendChild(phoneEle);
		
	//把 student 节点加入到根节点的子节点中
	document.getDocumentElement().appendChild(element);
		
	//保存 dom 到 xml 文件中
	save();
}

DOM删除
public void delete() {
	String id = "1004";
	//取所有的 Student 节点集合
	NodeList list = document.getElementsByTagName("student");
		
	//循环每一个 student 节点
	for(int i = 0; i < list.getLength(); i++) {
		Node n = list.item(i);
		Element e = (Element) n;
			
		//取得节点的 id 值
		String idStr = e.getAttribute("id");
		//如果当前节点 id 与要删除的接的的 id 匹配
		if(idStr.equals(id)) {
			//用当前节点的父节点来移除子节点
			n.getParentNode().removeChild(n);
			break;
		}
	}
	//更新文档
	save();
}

DOM修改
public void update() {
	String id = "1004";
	//取所有的 Student 节点集合
	NodeList list = document.getElementsByTagName("student");
	//循环每一个 student 节点
	for(int i = 0; i < list.getLength(); i++) {
		Node n = list.item(i);
		Element e = (Element) n;
		
		//取得节点的 id 值
		String idStr = e.getAttribute("id");
		//如果当前节点 id 与要删除的接的的 id 匹配
		if(idStr.equals(id)) {
			//用当前节点的父节点来移除子节点
			for(Node cn = n.getFirstChild(); cn != null; cn = cn.getNextSibling() ) {	
				if(cn.getNodeType() == Node.ELEMENT_NODE) {	
					if(cn.getNodeName().equals("name")) {
						cn.setTextContent("另一个人");	
					}
				}
			}
			break;
		}
	}
	//更新文档
	save();
}


DOM4J解析
package com.etc.homework.dom4j;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;

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 StudentManage {
	
	static Document document;
	static String path = "test/xml/student.xml";
	
	static {
		SAXReader reader = new SAXReader();
		try {
			document = reader.read(new File(path));
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	@SuppressWarnings("unchecked")
	public void show() {
		//通过 document 对象获取根节点
		Element root = document.getRootElement();
		
		//通过 elements() 方法获取当前节点的所有子节点
		List<Element> list = root.elements();
		//遍历子节点集合,
		for(Element student : list) {
			//获得叫 id 的属性并取得属性值,输出
			System.out.println("id : " + student.attribute("id").getValue());
			List<Element> elements = student.elements();
			//遍历 student 节点下的所有子节点
			for (Element el : elements) {
				//如果是 scores 节点,则继续深度搜索,否则输出节点名和节点值
				if(el.getName().equals("scores")) {
					List<Element> scores = el.elements();
					System.out.print( el.getName() +" : " );
					for(Element score : scores) {
						System.out.print( "    " +score.getTextTrim() );
					}
					System.out.println();
				} else System.out.println( el.getName() +" : "+el.getTextTrim() );
			}
			System.out.println();
		}
	}
	
	public void add(Student stu) {

		
		//获取根元素并为根元素创建一个子元素
		Element root = document.getRootElement();
		Element student = root.addElement("student");
		
		//给子元素设置属性 id, 值为 1004
		student.addAttribute("id", stu.getId());
		
		//给 student 子元素添加子元素并添加文本
		Element el = student.addElement("name");
		el.setText(stu.getName());
		student.addElement("sex").setText(stu.getSex());
		student.addElement("age").setText(stu.getAge());
		student.addElement("phone").setText(stu.getPhone());
		
		//保存
		save();
	}
	
	@SuppressWarnings("unchecked")
	public void update(Student stu) {

		//获取根元素并为根元素创建一个子元素
		Element root = document.getRootElement();
		//得到根元素的所有子节点
		List<Element> list = root.elements();
		//遍历子元素集合
		for(Element student : list) {
			//如果当前元素节点的id属性的值与要修改的id的值一致
			if(student.attribute("id").getValue().equals(stu.getId())) {
				//得到该元素下的所有子元素节点
				List<Element> params = student.elements();
				//遍历子元素节点并按对应位置修改值
				for(Element param : params) {
					String type = param.getName();
					if(type.equals("name")) {
						param.setText(stu.getName());
					} else if(type.equals("sex")) {
						param.setText(stu.getSex());
					} else if(type.equals("age")) {
						param.setText(stu.getAge());
					} else if(type.equals("phone")) {
						param.setText(stu.getPhone());
					}
				}
			}
		}
		//保存dom到xml
		save();
		
	}
	
	@SuppressWarnings("unchecked")
	public void delete(String id) {
		
		//获取根元素并为根元素创建一个子元素
		Element root = document.getRootElement();
		//根据根元素获取子元素节点集合
		List<Element> list = root.elements();
		//遍历集合并找到与要删除的元素节点id一致的节点
		for(Element student : list) {
			if(student.attribute("id").getValue().equals(id)) {
				//通过该节点的父节点元素删除该节点元素
				student.getParent().remove(student);
			}
		}
		//保存dom到xml
		save();
	}
	
	private void save() {
		OutputFormat format = OutputFormat.createPrettyPrint();
		format.setEncoding("UTF-8");//指定保存的XML文件编码
		XMLWriter writer = null;
		try {
			writer = new XMLWriter(new FileOutputStream(path), format);
			writer.write(document);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值