`
kevin_wanwei
  • 浏览: 117582 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

DOM写的xml工具类

阅读更多
package xml_util;


import java.io.File;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
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.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
 * 这里我的想法:是抛砖引玉,渴望大家提出更好和不足建议
 * 工具类只提供遍历操作,不提供增删操作
 * 在Dom xml增删操作中只是在内存中进行的
 * 在xml文档中我们是看不出的,在增删操作之后必须重新输出xml文档之后,才可以看到结果
 * @author kevin.wangwei
 * 2010-4-5
 */
public final class XmlUtil {
	/** xml 文档对象 */
	private Document document;
	/** 工具类单例对象 */
	private static XmlUtil instance;
	/** xml在系统中的路径 */
	private String xmlFilePath;
	/**xml 根元素名称 */
	private String documentElementName;
	
	private XmlUtil(String xmlFilePath)throws Exception{
		this.xmlFilePath=xmlFilePath;
		readXmlDocument();
	}

	public String getXmlFilePath() {
		return xmlFilePath;
	}

	public String getDocumentElementName() {
		return documentElementName;
	}

	/**
	 * 获得工具类实例
	 * @return
	 */
	public static XmlUtil newInstance(String xmlFilePath) throws Exception{
		if(instance==null){
			synchronized(XmlUtil.class){
			if(instance==null){
			  instance=new XmlUtil(xmlFilePath);
		    }
		  }
	    }
	  return instance;	
    }
	/**
	 * 读取xml文档
	 * @throws Exception
	 */
	private void readXmlDocument() throws Exception{
		DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
		DocumentBuilder db=dbf.newDocumentBuilder();
		document=db.parse(new File(xmlFilePath));
		Element documentElement=document.getDocumentElement();
		if(documentElement!=null){
			documentElementName=documentElement.getNodeName();
		}
	}
	/**
	 * 打印xml文档内容
	 */
	public String printerXmlDocument(){
		StringBuffer sb=new StringBuffer();
		sb.append("<?xml version=\""+document.getXmlVersion()+"\" encoding=\""+document.getXmlEncoding()+"\" ?>\n");
		printerNode(document,sb);
		return sb.toString();
	}
	/**
	 * 打印文本节点内容
	 * @param node
	 */
	private void printerTextNodeInfo(Node node,StringBuffer sb){
		if(node==null){
			return;
		}
		String value=StringUtil.validateString(node.getNodeValue());
		if(!(value.trim().equals(""))){//除去空白的文本节点
		   sb.append(value+"\n");
		}
	}
	/**
	 * 打印属性节点名称和值
	 * @param node
	 */
	private void printerAttributesNode(Node node,StringBuffer sb){
		if(node==null){
			return;
		}
		NamedNodeMap attrs=node.getAttributes();
		int length=attrs.getLength();
		for(int i=0;i<length;i++){
			Node attr=attrs.item(i);
			sb.append(" "+StringUtil.validateString(attr.getNodeName())+"=\""+StringUtil.validateString(attr.getNodeValue())+"\"");
		}
	}
	/**
	 * 打印xml文档中所有节点
	 * @param node
	 * @param sb
	 */
	private void printerNode(Node node,StringBuffer sb){
		if(node==null){
			return;
		}
		NodeList nl=node.getChildNodes();
		for(int i=0;i<(nl.getLength());i++){
			Node n=nl.item(i);
			if(n.getNodeType()==Node.ELEMENT_NODE){
				String nodeName=n.getNodeName();
				sb.append("<"+n.getNodeName());
				printerAttributesNode(n,sb);
				sb.append(">\n");
				printerNode(n,sb);
				sb.append("</"+nodeName+">\n");
			}else if(n.getNodeType()==Node.TEXT_NODE){
				printerTextNodeInfo(n,sb);
			}else if(n.getNodeType()==Node.COMMENT_NODE){
				sb.append("<"+n.getNodeName()+">");
				printerTextNodeInfo(n,sb);
				sb.append("</"+n.getNodeName()+">\n");
			}else{
				printerTextNodeInfo(n,sb);
			}
			
		}
	}
	/**
	 * 依据节点名称查找该节点的所有文本节点的值(包括该节点的子节点)
	 * @param nodeName
	 * @return
	 */
	public ArrayList<String> getNodeValue(String nodeName){
		if(!StringUtil.isValidateString(nodeName)){
			return null;
		}
		ArrayList<String> values=new ArrayList<String>();
		NodeList nl=document.getElementsByTagName(nodeName);
		int length=nl.getLength();
		for(int i=0;i<length;i++){
			Node node=nl.item(i);
			if(node.getNodeType()==Node.TEXT_NODE){
				String value=StringUtil.validateString(node.getNodeValue());
				if(!(value.trim().equals(""))){
					values.add(value);
				}
			}else if(node.getNodeType()==Node.ELEMENT_NODE){
				traversalNode(node,values);
			}
		}
		return values;
		
	}
	/**
	 * 递归查找当前节点的所有文本节点
	 * @param node
	 * @param values
	 */
	private void traversalNode(Node node,ArrayList<String> values){
		if(node==null){
			return ;
		}
		NodeList nl=node.getChildNodes();
		int length=nl.getLength();
		for(int i=0;i<length;i++){
			Node n=nl.item(i);
			if(n.getNodeType()==Node.TEXT_NODE){
				String value=StringUtil.validateString(n.getNodeValue());
				if(!(value.trim().equals(""))){
					values.add(value);
				}
			}else if(n.getNodeType()==Node.ELEMENT_NODE){
				traversalNode(n,values);
			}
		}
	}
	/**
	 *  依据当前元素名称,查找该元素的所有属性
	 * @param nodeName
	 * @return
	 */
	public Map<String,String> getNodeAttributes(String nodeName) throws Exception{
		if(!StringUtil.isValidateString(nodeName)){
			return null;
		}
		Map<String,String> map=new HashMap<String,String>();
		NodeList nl=document.getElementsByTagName(nodeName);
		int length=nl.getLength();
		for(int i=0;i<length;i++){
			Node node=nl.item(i);
			if(node.getNodeType()!=Node.ELEMENT_NODE){
				throw new Exception("这不是一个有效节点元素");
			}else{
				NamedNodeMap attrs=node.getAttributes();
				int len=attrs.getLength();
				for(int j=0;j<len;j++){
					Node attr=attrs.item(j);
					map.put(StringUtil.validateString(attr.getNodeName()), StringUtil.validateString(attr.getNodeValue()));
				}
			}
		}
		return map;
	}
	/**
	 * 依据指定输出流输出xml文档
	 * @param toFilePath
	 * @throws Exception
	 */
	public void transformer(OutputStream out) throws Exception{
		TransformerFactory tff=TransformerFactory.newInstance();
		Transformer tf=tff.newTransformer();
		DOMSource source=new DOMSource(document);
		StreamResult result=new StreamResult(out);
		tf.transform(source, result);
	}
	
	public static void main(String args[]) throws Exception{
		XmlUtil xml=XmlUtil.newInstance("d:\\test2.xml");
		//System.out.println(xml.printerXmlDocument());
		//for(String str:xml.getNodeValue("id")){
		//	System.out.println(str);
		//}
		//System.out.println(xml.getNodeAttributes("student"));
		//xml.transformer(System.out);
	}
}

 

1
0
分享到:
评论

相关推荐

    dom4j 工具类 使用例子

    在这个"dom4j工具类使用例子"中,我们将深入探讨如何利用DOM4J进行XML处理。 首先,`Dom4jUtil.java`可能是包含DOM4J实用方法的类。这个类可能包括了创建、查询、修改XML文档的各种静态方法。例如,可能会有用于...

    java Dom4j 无敌连环解析XML工具类

    在本教程中,我们将深入探讨如何使用DOM4J来解析XML文件,并创建一个无敌连环解析工具类。 首先,我们需要了解XML的基本概念。XML(可扩展标记语言)是一种标记语言,常用于数据交换和存储。它的结构化特性使其非常...

    自己写的一个dom4j解析xml文件工具类

    自己写的一个dom4j解析xml文件工具类

    利用DOM读写XML

    XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用于数据交换、配置文件、文档存储等领域。在处理XML时,DOM(Document Object...在处理复杂的数据结构和需要动态更新XML时,DOM是不可或缺的工具。

    Dom4jUtils 工具类让你更加方便操作XML的MarkerIce.Jar

    本文将深入探讨`Dom4jUtils`工具类如何增强DOM4J的功能,以及在`MarkerIce.jar`中它如何帮助开发者更便捷地处理XML。 首先,`Dom4jUtils`工具类通常包含了对DOM4J库的一系列实用方法,旨在简化XML的读取、解析、...

    xml-dom4j解析工具类

    这个“xml-dom4j解析工具类”显然是为了简化XML文档操作而设计的,它利用DOM4J库来处理XML数据。 首先,让我们详细了解一下DOM4J的核心概念。DOM4J提供了一个灵活的API,以树形结构表示XML文档。在DOM(Document ...

    读写超大类xml文件,使用dom4j读写xml文件的工具类

    基于dom4j的读写xml文件的工具包。封装了dom4j操作xml文档的常和方法。 支持两种读写方法。1:针对小文件的读取整个文档,2:针对大文件的,逐行读取。读到几百M文件毫无压力。

    dom4j 工具类

    **DOM4J工具类详解** DOM4J是一个强大的Java XML API,它提供了全面的XML处理功能,包括解析、操作和生成XML文档。DOM4J在Java社区中被广泛使用,因其简洁的API和高效的性能而受到青睐。在这个文档中,我们将深入...

    java一键xml转map,一键map转xml工具类

    本文将详细讲解如何使用Java实现XML到Map以及Map到XML的一键转换,并介绍一个已封装好的工具类`EasyXmlUtil`。 首先,XML到Map的转换涉及到XML的解析。在Java中,我们可以使用`javax.xml.parsers....

    dom4j工具类

    **DOM4J工具类详解** DOM4J是一个强大的Java XML处理库,它提供了一套灵活且功能丰富的API,使得在Java应用程序中解析、创建、修改XML文档变得异常简单。DOM4J的名字来源于“DOM for Java”,它是一个基于DOM模型的...

    一次代码重构之旅-快速读写xml文件工具类封装

    在IT行业中,代码重构是一项重要的技能,它有助于提高...总之,这次重构之旅旨在通过创建一个高效的XML工具类,提高代码的可复用性和性能。对于任何需要处理XML数据的Java开发者来说,这是一个值得学习和借鉴的案例。

    dom4j读写xml文档实例

    总结,DOM4J是Java开发中处理XML文档的强大工具,它的易用性和灵活性使得XML操作变得简单。无论是读取、写入还是搜索XML,DOM4J都能提供高效的方法。在实际项目中,结合源码阅读和使用DOM4J工具,能够更深入地理解和...

    DOM4J xml解析工具

    总之,DOM4J是Java世界中处理XML的强大工具,它集成了多种解析方式,提供了丰富的功能,且具有良好的性能和社区支持,是XML处理的首选库之一。无论是小型项目还是大型系统,DOM4J都能提供可靠的支持。

    使用dom4j 和本地dom 解析xml 文件

    在Java中,DOM解析主要通过`javax.xml.parsers.DocumentBuilderFactory`和`javax.xml.parsers.DocumentBuilder`类实现。 1. **DOM解析步骤**: - 创建`DocumentBuilderFactory`实例。 - 使用`...

    Java DOM 生成XML

    Java DOM(Document Object Model)是一种基于树形结构的XML文档...尽管DOM操作相对消耗资源,但其灵活性和强大功能使其成为处理XML的常用工具。对于复杂的XML操作,可以结合使用其他库如JAXB或JDOM,以简化编程任务。

    Dom4j工具类

    主要方法: /** * 使用条件:在发放外部建立一个静态Map, String&gt; * 此方法得到一个map,map中的key为节点的名字,value为节点的值 ... public static void getInfoFromXml(String xml, String key)

    Java解析XML工具类--(java源码)

    * 本类是专门解析XML文件的,主要用于为系统读取自己的配置文件时提供最方便的解析操作 * @author HX * */ public class XmlManager { /** * 得到某节点下某个属性的值 * @param element 要获取属性的...

    Dom4j写XML和读取XML的工具类,非常好用

    "Dom4j写XML和读取XML的工具类,非常好用" 这个标题表明我们要讨论的是一个使用Dom4j库来处理XML文档的Java工具类。Dom4j是一个非常流行的Java库,它提供了XML的解析、创建、修改以及查询功能,使得在Java中操作XML...

    xml解析工具类

    本教程将详细介绍一个名为"WXML"的XML解析工具类,该工具类能便捷地将XML数据转换为Java对象,从而简化开发流程。 首先,XML解析分为两种主要方式:DOM(Document Object Model)和SAX(Simple API for XML)。DOM...

    java通用解析XML工具类

    本文将详细介绍如何创建一个Java通用的XML解析工具类,以便于在项目中复用和简化XML处理。 首先,我们来看DOM解析方式。DOM解析器会将整个XML文档加载到内存中,形成一棵树形结构,便于对XML进行随机访问。以下是一...

Global site tag (gtag.js) - Google Analytics