XMLUtil -xml文件数据读取实现类

package com.zxt.basic.util;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.apache.commons.digester.Digester;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.SAXValidator;
import org.dom4j.io.XMLWriter;
import org.dom4j.util.XMLErrorHandler;


/**
 * XML文件数据读取实现类
 * @author ZHENG YI
 */
public class XMLUtil   {

	/** Document元素 */
	Document doc;
	
	/** 根元素 */
	Element root;
	
	/** XML文件路径 */
	String path;
	
	/** 验证例外 */
	Element validateErrors = null;
	
	/**
	 * 构造器
	 * @param content 构造内容
	 * @param isFile 改内容是否来自于文件
	 * @throws DocumentException 
	 */
	XMLUtil (String content, boolean isFile) throws DocumentException {
		if (isFile) {
			SAXReader reader = new SAXReader ();
			try {
				this.doc = reader.read(FileUtil.getFileInputStream(content));
			} catch (FileNotFoundException e) {
				e.printStackTrace();
				throw new DocumentException ("取得文件 : " + content + " InputStream例外 例外信息 : " + e.getMessage(), e);
			}
			path = content;
		}
		else {
			doc = DocumentHelper.parseText(content);
			path = null;
		}
		root = doc.getRootElement();
	}
	
	
	
	/**
	 * 构造器, 用一个指定的Document来构造该类实例
	 * @param document Document
	 */
	XMLUtil (Document document) {
		doc = document;
		root = doc.getRootElement();
		path = null;
	}
	
	/**
	 * 使用指定的根节点名称构造一个默认的Document
	 * @param rootName 根元素名称
	 */
	XMLUtil (String rootName) {
		doc = DocumentHelper.createDocument();
		root = doc.addElement(rootName);
		path = null;
	}
	
	/**
	 * 从根元素下取得符合指定名称的元素节点
	 * @param name 节点名称
	 * @return Iterator
	 */
	public Iterator elementIterator (String name) {
		Iterator nodes = null;
		if (name != null && !"".equals(name)) 
			nodes = root.elementIterator(name);
		else
			nodes = root.elementIterator();
		return nodes;
	}
	
	/**
	 * 取得Document元素
	 * @return Document
	 */
	public Document getDocument() {
		return doc;
	}

	/**
	 * 获取根元素
	 * @return Element
	 */
	public Element getRootElemenet() {
		return root;
	}

	/**
	 * 使用XPATH语句从XML中取得内容
	 * @param xPath 语句
	 * @return List
	 */
	public Iterator selectNodes(String xPath) {
		return doc.selectNodes(xPath).iterator();
	}

	/**
	 * 从指定的元素下取得符合指定名称的元素节点
	 * @param node 指定的元素节点
	 * @param name 节点名称
	 * @return Iterator
	 */
	public Iterator elementIterator(Node node, String name) {
		Iterator nodes = null;
		nodes = ((Element) node).elementIterator(name);
		return nodes;
	}
	
	/**
	 * 在根元素下增加一个指定名称的节点
	 * @param name 节点名称
	 * @return Element <增加的节点>
	 */
	public Element addRootElement (String name) {
		return root.addElement(name);
	}
	
	/**
	 * 在指定的Element元素下增加一个Element元素
	 * @param element 指定的Element元素
	 * @param name 增加的Element元素名称
	 * @return Element <增加的节点>
	 */
	public Element addElement (Element element, String name) {
		return element.addElement(name);
	}
	
	/**
	 * 在指定的Element元素下增加一个文本Element元素节点
	 * @param element 指定的Element元素
	 * @param name 增加的Element元素名称
	 * @param text 增加的Element元素文件值
	 * @return
	 */
	public Element addElement (Element element, String name, String text) {
		Element e = element.addElement(name);
		e.setText(text);
		return e;
	}
	
	/**
	 * 在指定的XPATH语句查询出的元素下增加一个Element元素
	 * @param xpath 指定的XPATH语句
	 * @param name 增加的Element元素名称
	 * @return Element <增加的节点>
	 */
	public Iterator addElement (String xpath, String name) {
		Iterator nodes = null;
		Node node = null;
		List rtnNodes = new ArrayList ();
		nodes = selectNodes(xpath);
		while (nodes.hasNext()) {
			node = (Node) nodes.next();
			rtnNodes.add(((Element) node).addElement(name));
		}
		return rtnNodes.iterator();
	}
	
	/**
	 * 在指定的XPATH语句查询出的元素下增加一个文本Element元素节点
	 * @param xpath 指定的XPATH语句
	 * @param name 增加的Element元素名称
	 * @param value 节点的Text文本值
	 * @return Element <增加的节点>
	 */
	public Iterator addElement (String xpath, String name, String value) {
		Iterator nodes = addElement(xpath, name);
		while (nodes.hasNext()) {
			((Element) nodes.next()).setText(value);
		}
		return nodes;
		
	}
	
	/**
	 * 在指定的XPATH语句查询出的元素下增加一个属性
	 * @param xpath 指定的XPATH语句
	 * @param name 增加的Element属性名称
	 * @param value 属性值
	 * @return Element <增加的节点>
	 */
	public void addAttribute (String xpath, String name, String value) {
		Iterator nodes = null;
		nodes = selectNodes(xpath);
		while (nodes.hasNext()) {
			((Element) nodes.next()).addAttribute(name, value);
		}
	}
	
	/**
	 * 将指定的Element原素设置对于的文本值
	 * @param element  Element原素
	 * @param text 文本值
	 */
	public void setNodeText (Element element, String text) {
		element.setText(text);
	}
	
	/**
	 * 将指定的Element原素设置对于的属性
	 * @param element  Element原素
	 * @param attrName 属性名称
	 * @param attrValue 属性值
	 */
	public void addAttribute (Element element, String attrName, String attrValue) {
		element.addAttribute(attrName, attrValue);
	}
	
	/**
	 * 修改Element元素对应的属性的属性值
	 * @param element  Element原素
	 * @param attrName 属性名称
	 * @param attrValue 属性值
	 */
	public void setAttribute(Element element, String attrName, String attrValue) {
		element.attribute(attrName).setValue(attrValue);
	}
	
	
	/**
	 * 取得XML字符串
	 * @return String
	 */
	public String asXML () {
		return doc.asXML();
	}

	/**
	 * 取得文件保存的路径
	 * @return String
	 */
	public String getPath() {
		return path;
	}

	/**
	 * 设置文件保存的路径
	 * @param path 文件保存的路径
	 */
	public void setPath(String path) {
		this.path = path;
	}
	
	/**
	 * 将XML内容以文件形式保存
	 * @param encoding 编码
	 * @throws TipException 操作例外
	 */
	public void save (String encoding) throws Exception {
		if (path == null)
			throw new Exception ("空的文件存储路径。例外发生DomControl接口中save方法");
		FileUtil.makeParentDirectory(path);
		try {
			FileWriter writer = new FileWriter (new File (path));
			write(writer, doc, encoding);
		} catch (IOException e) {
			throw new Exception ("XML文件保存例外。例外发生DomControl接口中save方法", e);
		}
	}
	
	/**
	 * 将XML内容以文件形式保存
	 * @throws TipException 操作例外
	 */
	public void save () throws Exception {
		save (null);
	}
	
	/**
	 * 将XML内容写入指定的输出流中
	 * @param out OutputStream
	 * @param encoding 字符编码级
	 * @throws TipException 操作例外
	 */
	public void write (OutputStream out, String encoding) throws Exception {
		Writer writer = null;
		try {
			if (encoding == null)
				writer = new OutputStreamWriter (out);
			else
				writer = new OutputStreamWriter (out, encoding);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		write(writer, doc, encoding);
	}
	
	/**
	 * 将XML内容写入指定的输出流中
	 * @param out OutputStream
	 * @param encoding 字符编码级
	 * @throws TipException 操作例外
	 */
	public void write (OutputStream out) throws Exception {
		write(out, null);
	}
	
	/**
	 * 写入文件
	 * @param writer 写入流
	 * @param document Document
	 * @param encoding 编码
	 * @throws TipException 写入文件例外
	 */
	private void write (Writer writer, Document document, String encoding) throws Exception {
		XMLWriter xmlWriter = null;
		OutputFormat format = OutputFormat.createPrettyPrint();
		if (encoding != null && !"".equals(encoding.trim()))
			format.setEncoding(encoding);
        try {
        	xmlWriter = new XMLWriter(writer, format);
			xmlWriter.write(document);
			
		} catch (IOException e) {
			throw new Exception ("XML文件写入失败", e);
		} finally {
			if (writer != null) {
				try {
					writer.close();
				} catch (IOException e) {
					throw new Exception ("关闭XML文件写入流失败", e);
				}
			}
		}
	}

	/**
	 * 清除根元素下的所有元素
	 */
	public void clearRootContent() {
		root.clearContent();
	}
	
	/**
	 * XSD验证XML文件
	 * @param xsdFilePath XSD文件的路径
	 * @return
	 * @throws Exception  boolean   
	 * @exception    
	 * @since  1.0.0
	 */
	public boolean validateXSD (String xsdFilePath) throws Exception {
		boolean validate = true;
		try {
			//创建默认的XML错误处理器 
			XMLErrorHandler errorHandler = new XMLErrorHandler();
			//获取基于 SAX 的解析器的实例 
			SAXParserFactory factory = SAXParserFactory.newInstance();
			//解析器在解析时验证 XML 内容。 
			factory.setValidating(true);
			//指定由此代码生成的解析器将提供对 XML 名称空间的支持。 
			factory.setNamespaceAware(true);
			//使用当前配置的工厂参数创建 SAXParser 的一个新实例。 
			SAXParser parser = factory.newSAXParser();
			
			//设置 XMLReader 的基础实现中的特定属性。核心功能和属性列表可以在 [url]http://sax.sourceforge.net/?selected=get-set[/url] 中找到。 
			parser.setProperty(
					"http://java.sun.com/xml/jaxp/properties/schemaLanguage",
					"http://www.w3.org/2001/XMLSchema");
			parser.setProperty(
					"http://java.sun.com/xml/jaxp/properties/schemaSource",
					"file:" + xsdFilePath);
			//创建一个SAXValidator校验工具,并设置校验工具的属性 
			SAXValidator validator = new SAXValidator(parser.getXMLReader());
			//设置校验工具的错误处理器,当发生错误时,可以从处理器对象中得到错误信息。 
			validator.setErrorHandler(errorHandler);
			//校验 
			validator.validate(this.doc);
			//如果错误信息不为空,说明校验失败 
			if (errorHandler.getErrors().hasContent()) {
				this.validateErrors = errorHandler.getErrors();
				validate = false;
			} 
		} catch (Exception ex) {
			System.out.println("XML文件: " + this.path + " 通过XSD文件:"
					+ xsdFilePath + "检验失败。\n原因: " + ex.getMessage());
			ex.printStackTrace();
		}
		return validate;
	}
	
	
	private static Document document = null;
    
	public static File file= null;
	
	/**
	 * 
	 * @author zhangmin fildElementByiD 
	 * 载入一个xml文档
	 * @param filePath     文件路径
	 * @exception
	 * @since 1.0.0
	 */

	public static void  LoadXML(String filePath)throws Exception   {
		SAXReader saxReader = new SAXReader();
		file = new File(filePath);
		if (file.exists()) {
			try {
				document = saxReader.read(file);
			} catch (DocumentException e) {
				e.printStackTrace();
			}
		}
	}
	
	public static Document  getDoc()   {
		return document;
	}
	
	public static File  getFile()   {
		return file;
	}
	


	/**
	 * 
	 * @author zhangmin fildElementByiD 
	 * 通过标识查找xml中相关的节点信息
	 * @param id  标识的值
	 * @return Element  该标识对应的节点
	 * @exception
	 * @since 1.0.0
	 */

	public static Element findElement(String id)  {
		Element ele = null;
		if (document != null) {
			ele = document.elementByID(id);
		} else {
			System.out.println("没有找到相应节点信息");
		}
		return ele;
	}
	
	/**
	 * 
	 * @author zhangmin  
	 * findElements  通过xpath查找原色节点 
	 * @param XPath  节点路径
	 * @return  List
	 * @exception    
	 * @since  1.0.0
	 */
	public static List findElements(String XPath)  {
		List ele = null;
		if (document != null) {
			ele = document.selectNodes(XPath);
		} else {
			System.out.println("没有找到相应节点信息");
		}
		return ele;
	}
	
	
	
	/**
	 * 
	 * @author zhangmin  
	 * findElement  查找XPath路径下,属性attrName的值为属性是节点集合   
	 * @param XPath   节点路径
     * @param attrName  属性名称
     * @param attrValue  属性值
     * @return  List    符合条件的element
	 * @exception    
	 * @since  1.0.0
	 */
	public static List findElement(String XPath,String attrName,String attrValue)  {
		List element = new ArrayList();
		if (document != null) {
			List list = document.selectNodes(XPath);

			for (int i = 0; i < list.size(); i++) {
				Element node = (Element) list.get(i);
				String s1 = node.attributeValue(attrName);
				if (s1 != null && s1.equals(attrValue)) {
					element.add(node);
				}

			}
		}
		// TODO: implement
		return element;
	}
	/**
	 * 
	 * @author zhangmin  
	 * findAttr  查找某标识节点的相关属性值  
	 * @param id   要查找的节点的id值
	 * @param attr  要查找的节点的属性名称
	 * @return  String  相应的节点下的属性的值
	 * @exception    
	 * @since  1.0.0
	 */

	public static String findAttrbuteValue(String id, String attr) {
		// TODO: implement
		Element ele = findElement(id);
		String str = ele.attributeValue(attr);
		return str;
	}

/**
 * 
 * @author zhangmin  
 * findChildEle  查找XPath路径下,父节点属性attrName的值为属性是节点集合
 * @param XPath   节点路径
 * @param attrName  属性名称
 * @param attrValue  属性值
 * @return  List    符合条件的element
 * @exception    
 * @since  1.0.0
 */
	public static List findChildren(String XPath,String attrName,String attrValue) {
		List element = new ArrayList();
		if(document!=null){
		List list = document.selectNodes(XPath);
		
		for (int i = 0; i < list.size(); i++) {
			Node node = (Node) list.get(i);
			String s1 = node.getParent().attributeValue(attrName);
			if (s1!=null&&s1.equals(attrValue)) {
				element.add(node);
			}
		}
		}

		// TODO: implement
		return element;
	}

	/**
	 * 
	 * @author zhangmin  
	 * findText  查找某一节点的文本信息 
	 * @param id  对应的id
	 * @return  String  返回相应的字符串
	 * @exception    
	 * @since  1.0.0
	 */
	public static String findText(String id) {
		// TODO: implement
		return findElement(id).getText();
	}
	/**
	 * 
	 * @author zhangmin  
	 * findChilderAttribute  查找一个节点集合的attrName的属性属性值
	 * @param list   元素为element的集合
	 * @param childerAttr   element节点的属性名称
	 * @return  String
	 * @exception    
	 * @since  1.0.0
	 */
	
	public static List findAttributeValue(List list,String attr) {
		// TODO: implement 
		List attrValueList = new ArrayList();
		for (int i = 0; i < list.size(); i++) {
			Element el = (Element) list.get(i);
			attrValueList.add(el.attributeValue(attr));
		}
		return attrValueList;
	}
	/**
	 * 
	 * @author zhangmin  
	 * findAttributeValue  查找一个节点的attrName属性对应的值
	 * @param element   节点元素的集合
	 * @param attr       属性名称
	 * @return  String
	 * @exception    
	 * @since  1.0.0
	 */
	public static String findAttributeValue(Element element,String attr) {
		// TODO: implement 
		String attrValue = null;
		if (element!=null) {attrValue = element.attributeValue(attr);}
		return attrValue;
	}
	/**
	 * 
	 * @author zhangmin  
	 * findChilderText  查找节点元素的文本信息  
	 * @param element    节点元素
	 * @return  String
	 * @exception    
	 * @since  1.0.0
	 */
	public static String findElementText(Element element) {
		// TODO: implement 
		String text = null;
		
		if (element!=null){text = element.getText();}
		return text;
	}
/**
 * 
 * @author zhangmin  
 * getDigester  封装tomcat的解析xml文件的方法,用于xml文件与javabean的映射
 * @return  Digester   Digester对象
 * @exception    
 * @since  1.0.0
 */
	public static Digester getDigester() {
		// TODO: implement 
		Digester digester = new Digester(); 
		return digester;
	}
}

 

转载于:https://www.cnblogs.com/huojuncheng/p/3415838.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值