现在的位置: 首页 > 综合 > 正文

简单的DOM解析XML文件,并实现增,删,改,查的操作

2014年07月03日 ⁄ 综合 ⁄ 共 6144字 ⁄ 字号 评论关闭
JAVA项目文件
package dom_jiexi;

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
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.junit.Test;
import org.w3c.dom.Attr;
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 XmlCrudDemo {
	@Test
	public void test() throws ParserConfigurationException, SAXException,
			IOException, TransformerException {
		// 调用DocumentBuilderFactory中的newInstance(),创建新的DocumentBuilderFactory实例对象
		DocumentBuilderFactory builderFactory = DocumentBuilderFactory
				.newInstance();
		// 调用DocumentBuilderFactory中的newDocumentBuilder();创建一个新的Documentbuilder实例对象
		DocumentBuilder builder = builderFactory.newDocumentBuilder();
		// 调用DocumentBuilder中的parse(File f);方法创建指定文件的Document对象
		Document document = builder.parse(this.getClass().getClassLoader()
				.getResourceAsStream("dom_jiexi//java.xml"));
		String tagname = "王亮";
		// insert(document);
		// findByElementName(document);
		// findByName(document, "Boss姚");
		// findById(document, "x121");
		// deleteNodeById(document, "x121");
		// updateNodeById(document, "x121");
		insert(document, "x121");
	}

	// 向xml文件中指定的节点后添加节点
	public void insert(Document document, String id)
			throws TransformerException {
		// 获取要操作的元素节点对象
		Element elm = document.getElementById(id);
		// 获取该节点的父节点
		Node nodeparent = elm.getParentNode();
		// 通过传入的document对象创建一个指定的元素节点对象
		Element nd = document.createElement("student");
		// 设置属性并赋值
		nd.setAttribute("id", "x13333");
		// 创建元素节点对象
		Node name = document.createElement("name");
		Node age = document.createElement("age");
		Node sex = document.createElement("sex");
		// 为创建的元素节点对象的文本节点赋值
		name.setTextContent("donghongyujava");
		age.setTextContent("20");
		sex.setTextContent("男");

		// 将创建的子节点子节点的对象添加到子节点下
		nd.appendChild(name);
		nd.appendChild(age);
		nd.appendChild(sex);

		// 将子节点添加到父节点
		nodeparent.appendChild(nd);

		// 创建TransformerFactory对象
		TransformerFactory transformerFactory = TransformerFactory
				.newInstance();
		// Transformer类用来将代表xml文件的Document对象装换位某种格式后进行输出
		// Transformer对象通过TransformerFactory获得
		Transformer transformer = transformerFactory.newTransformer();
		// 将处理后的Document对象重新写入 到另一个xml文件
		transformer.transform(new DOMSource(document), new StreamResult(
				new File("src//c.xml")));

	}

	// 根据标签名称来查找所有改名称的节点对象
	public void findByElementName(Document document) {
		// 获取指定的标记名称的所有元素的节点集合
		NodeList nodelist = document.getElementsByTagName("teacher");
		System.out.println(nodelist.getLength());
		for (int i = 0; i < nodelist.getLength(); i++) {
			// 遍历得到集合中的每一个元素
			Node node = nodelist.item(i);
			System.out.println(node.getNodeName());
		}
	}

	// 根据属性的值查找节点对象
	public Node findByName(Document document, String tagname) {
		// 获取指定的标记名称的所有元素的节点集合
		NodeList nodelist = document.getElementsByTagName("teacher");
		for (int i = 0; i < nodelist.getLength(); i++) {
			// 遍历得到集合中的每一个元素
			Element node = (Element) nodelist.item(i);
			// 获取指定的元素中的指定的属性
			Attr attr = node.getAttributeNode("name");
			// 判断属性的值
			if (attr.getValue().equals(tagname)) {
				System.out.println(attr);
				// 返回符合条件的元素
				return node;
			}
		}
		return null;
	}

	// 根据ID产找节点对象
	public Node findById(Document document, String id) {
		Node node = document.getElementById(id);
		System.out.println(node);
		return node;
	}

	// 删除获取到的节点
	public void deleteNodeById(Document document, String id)
			throws TransformerException {
		// 获取要删除的节点对象
		Node node = document.getElementById(id);
		// 得到父节点后在删除子节点
		Node nod = node.getParentNode().removeChild(node);
		// 创建TransformerFactory对象
		TransformerFactory transformerFector = TransformerFactory.newInstance();
		// Transformer类用于把代表XML文件的Document对象转换为某种格式后进行输出
		// Transformer对象通过TransformerFactory获得
		Transformer transformer = transformerFector.newTransformer();
		// 调用transform();将Document对象重新写入一个XML文件中
		transformer.transform(new DOMSource(document), new StreamResult(
				new File("src//a.xml")));
	}

	// 更新指定数据
	public void updateNodeById(Document document, String id)
			throws TransformerException {
		// 根据id获取指定元素的节点对象
		Element node = document.getElementById(id);
		// 获取元素节点的id属性节点对象
		Attr attr = node.getAttributeNode("id");
		// 修改元素节点的属性值
		attr.setValue("x122");

		// 获取该节点的对象的所有孩子节点对象name,age,sex节点
		NodeList nodelist = node.getChildNodes();
		// 遍历集合
		for (int i = 0; i < nodelist.getLength(); i++) {
			// 得到每一个子节点的实体
			Node no = nodelist.item(i);
			// 判断是否是元素节点对象
			if (no.getNodeType() == Node.ELEMENT_NODE) {
				// 判断是否是name节点
				if (no.getNodeName().equals("name")) {
					// 设置name元素节点下的文本节点内容
					no.setTextContent("董宏宇");
				} else if (no.getNodeName().equals("age")) {
					no.setTextContent("20");
				} else if (no.getNodeName().equals("sex")) {
					no.setTextContent("男");
				} else {
					System.out.println("没有可修改元素节点对象");
				}
			}
		}
		// 创建TransformerFactory对象
		TransformerFactory transformerFactory = TransformerFactory
				.newInstance();
		// Transformer类用于把代表xml文件的Document对象转换为某种格式后进行输出
		// transformer对象通过transformerFactory获得
		Transformer transformer = transformerFactory.newTransformer();
		// 把更改后的document对象重新写入到一个xml文件中
		transformer.transform(new DOMSource(document), new StreamResult(
				new File("src//b.xml")));
	}

}

XML文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE classes SYSTEM "bin//dom_jiexi//java.dtd">
<classes>
	<java班 name="CSDNJava01班">
		<teachers>
			<teacher name="军哥" sex="男" age="28" />
			<teacher name="丽华" sex="女" age="28" />
		</teachers>
		<students>
			<student id="x121">
				<name>Martin</name>
				<sex>女</sex>
				<age>28</age>
			</student>
		</students>
	</java班>
	<!-- 注释0 -->
	<net班 name="CSDNNet01班">
		<teachers>
			<teacher name="Boss姚" sex="男" age="28" />
			<teacher name="石老师" sex="女" age="28" />
		</teachers>
	</net班>
	<php班 name="CSDNPhp01班"></php班>
	<ios班 name="CSDNIos01班"></ios班>
</classes>
<!-- 对java.xml文件进行CRUD的操作 -->
<!-- 节点 
        nodeName nodeValue nodeType 
element 标签名                null        1 
Attr    属性名               属性值                         2 
text    #text   文本的值                       3 
 -->

DTD约束文件

<!ELEMENT classes (java班,net班,php班,ios班)>
<!ELEMENT java班 (teachers?,students?)>
<!ELEMENT net班 (teachers?,students?)>
<!ELEMENT php班 (teachers?,students?)>
<!ELEMENT ios班 (teachers?,students?)>
<!ELEMENT teachers (teacher*)>
<!ELEMENT teacher EMPTY>
<!ELEMENT students (student*)>
<!ELEMENT student (name,sex,age)>
<!ATTLIST java班 name CDATA #IMPLIED>
<!ATTLIST net班 name CDATA #IMPLIED>
<!ATTLIST php班 name CDATA #IMPLIED>
<!ATTLIST ios班 name CDATA #IMPLIED>
<!ATTLIST teacher name CDATA #IMPLIED>
<!ATTLIST teacher sex CDATA #IMPLIED>
<!ATTLIST teacher age CDATA #IMPLIED>
<!ELEMENT name (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ATTLIST student id ID #IMPLIED>

抱歉!评论已关闭.