`

(备忘录)xml文件的生成和解析_DOM_1

阅读更多
xml的解析一般分为两种方式,一种是SAX事件流的方式,另外一种是基于DOM的xml文档树结构解析,SAX是一边解析一边加载,而DOM需要一次性将XML文件全部加载到内存中,再解析构建成文档数的模式。

首先看一下基于DOM的XML解析和创建。


案例xml内容:

引用

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<employees>
<employee>
<name>ddviplinux</name>
<sex>m</sex>
<parents>
<father>xxx</father>
<mother>yyy</mother>
</parents>
</employee>
</employees>


1.首先定一个方法接口:
import org.w3c.dom.Document;

public interface XmlDocument {
	
	public void createDocument(String fileName);
	
	public void parserDocument(String fileName);

}


里面包含了创建和解析的方法定义。

2.实现这个接口:


import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;

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.TransformerFactoryConfigurationError;
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;

import com.ailk.xmlparserdemon.intf.XmlDocument;

public class DomXmlDemon implements XmlDocument {
	Document document;
	static String fileName;
	
	public void init(){
		try {
			DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();
			DocumentBuilder builder=builderFactory.newDocumentBuilder();
[b]			this.document=builder.newDocument();[/b]		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * DOM方式生成xml文件
	 */
	public void createDocument(String fileName) {
		Element root=this.document.createElement("employees");
		this.document.appendChild(root);
		
		Element employee=this.document.createElement("employee");
		Element name=this.document.createElement("name");
		name.appendChild(this.document.createTextNode("ddviplinux"));
		employee.appendChild(name);
		
		Element sex=this.document.createElement("sex");
		sex.appendChild(this.document.createTextNode("m"));
		employee.appendChild(sex);
		
		Element parents=this.document.createElement("parents");
		
		
		Element father=this.document.createElement("father");
		father.appendChild(this.document.createTextNode("xxx"));
		parents.appendChild(father);
		
		Element mother=this.document.createElement("mother");
		mother.appendChild(this.document.createTextNode("yyy"));
		parents.appendChild(mother);
		
		employee.appendChild(parents);
		root.appendChild(employee);
		
		
		try {
			DOMSource source=new DOMSource(this.document);
			TransformerFactory tf=TransformerFactory.newInstance();
			Transformer transf=tf.newTransformer();
			transf.setOutputProperty(OutputKeys.ENCODING, "UTF-8");//设置编码格式
			transf.setOutputProperty(OutputKeys.INDENT, "yes");//设置是否在格式化时添加多于的空格
			PrintWriter pw=new PrintWriter(new FileOutputStream(fileName));
			StreamResult result=new StreamResult(pw);
			transf.transform(source, result);
			System.out.println("生成文件成功:"+fileName);
		} catch (TransformerConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (TransformerFactoryConfigurationError e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (TransformerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	public void parserDocument(String fileName) {
		
		try {
			DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
			DocumentBuilder db=dbf.newDocumentBuilder();
[b]			Document document=db.parse(fileName);[/b]			
			NodeList employees=document.getChildNodes();
			for(int i=0;i<employees.getLength();i++){
				Node employee=employees.item(i);
				NodeList employeeInfo=employee.getChildNodes();
				for(int j=0;j<employeeInfo.getLength();j++){
					Node node=employeeInfo.item(j);
					NodeList employeeMeta=node.getChildNodes();
					for(int k=0;k<employeeMeta.getLength();k++){
						System.out.println(employeeMeta.item(k).getNodeName()+" : "+employeeMeta.item(k).getTextContent());
					}
				}
			}
			
			System.out.println("解析完毕!");
		} 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();
		}

	}
	
	public static void main(String[] args){
		DomXmlDemon dom=new DomXmlDemon();
		DomXmlDemon.fileName="E:\\OneNote\\dom.xml";
		dom.init();
		dom.createDocument(fileName);
		dom.parserDocument(fileName);
	}

}





从上面的实现方法中,我们可以看出来,不管是在解析或者是生成的时候,首先都需要或许到一个documentbuilder,而这里面用到了一个工厂方法,直接获取:
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
DocumentBuilder db=dbf.newDocumentBuilder();







分享到:
评论

相关推荐

    Swing实现的备忘录(桌面版)

    开发者可能使用Java的DOM(文档对象模型)或SAX(简单API for XML)解析器来读取和写入XML文件。 项目的实现可能涉及以下关键点: 1. **Swing组件的使用**:创建窗口、布局管理、组件交互等。Swing提供了各种布局...

    jQuery+json+struts2 开发备忘录(一)

    总结来说,这个备忘录主要涵盖了如何使用jQuery处理前端交互,使用Struts2的JSON插件进行后端数据返回,以及如何在JavaScript中解析和应用JSON数据。这些技术结合使用,能帮助开发者构建出响应式、功能丰富的Web应用...

    calendarnotes:小型Web应用程序可为您的日历事件生成会议备忘

    【标题】:“calendarnotes”是一个小型的Web应用程序,其主要功能是为用户的日历事件生成会议备忘录,方便用户记录和管理各种日程安排。这个应用程序利用了JavaScript技术,提供了一种便捷的方式,将日历数据转化为...

    超级有影响力霸气的Java面试题大全文档

    引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始...

    java 面试题 总结

    引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始...

    23种模式详解-java附详细文档

    Java中较少直接使用,但在XML解析、DOM树操作等场景可见。 22. **状态模式**:允许对象在其内部状态改变时改变其行为。在Java中,`java.util.concurrent.atomic`包中的原子类就用到了状态模式。 23. **策略模式**...

Global site tag (gtag.js) - Google Analytics