如何采用dom4j解析xml工具?
在实际的开发中,我们通常会设计到xml文件的解析,其中dom4j就是一个不错的选择.dom4j的性能和易用性方面都是屈指可数的.为了更加方便使用dom4j解析xml文件,本人写出了一个xml的解析工具类,从更大粒度上支持xml文件的解析.该工具支持通配符号,应该算的上是一个很方便和功能强健的类.
/**
* Author: crazy_rain * Date: 2007-2-14 * Time: 上午09:45:17 * Introduction:处理xml 文件的工具类 */ public class XMLUtil {/** ************解析xml 元素时需要的变量 **************** */
private static final Log log = LogFactory.getLog(XMLUtil.class);
private static SAXReader saxReader = new SAXReader(); private XMLUtil(){}/**
* 将xml元素输出到控制台 * * @param xml */ public static void dump(Node xml) { OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("GBK"); XMLWriter writer; try { writer = new XMLWriter(System.out, format); writer.write(xml); writer.flush(); // do not call writer.close(); ! } catch (Throwable t) { // otherwise, just dump it System.out.println(xml.asXML()); } }/**
* 将document 对象写入指定的文件 * * @param xml * @param fileName */ public static void dumpToFile(Node xml, String fileName) { OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("GBK"); try { XMLWriter writer = new XMLWriter(new FileWriter(fileName), format); writer.write(xml); writer.close(); } catch (IOException e) { log.error("将document 对象写入指定的文件时出现IO错误 !", e); } }/**
* 获得Xml 文档对象 * * @param xmlFile * 指向xml 文件的引用 * @return xmlDoc 从文件读取xml Document */ public static Document read(File xmlFile) { Document document = null; try { document = saxReader.read(xmlFile); } catch (DocumentException e) { log.error("通过指向xml文件的文件获得Document对象时出错 !", e); } return document; }/**
* 通过xml 文件的名字读取Document对象 * * @param xmlFileName * @return Document */ public static Document read(String xmlFileName) { return read(new File(xmlFileName)); }/**
* 通过指向xml 文件的URL获得Document对象 * * @param url * @return Document */ public static Document read(URL url) { Document document = null; try { document = saxReader.read(url); } catch (DocumentException e) { log.error("通过指向xml文件的URL获得Document对象时出错...", e); } return document; }/**
* 将xml Node 对象转换成 String * * @param node * @return string */ public static String NodeToString(Node node) { return node.asXML(); }/**
* 将字符串解析成Node * * @param xmlString * @return node */ public static Node StringToNode(String xmlString) { Node node = null; try { node = DocumentHelper.parseText(xmlString); } catch (DocumentException e) { log.error("将字符串解析成doc时出错", e); } return node; }/**
* 根据给定路径查询给定 xml 元素的子元素 * * @param parent * 父节点元素 * @param childPath * 相对与父节点的子节点路径,路径组成部分之间用"/"分割,支持通配符号"*" * @return child 子节点元素 */ public static Element child(Element parent, String childPath) { String names[] = childPath.split("/"); Element child = parent; for (String name : names) { if (name.equals("*")) { child = (Element) child.elements().get(0); } else { child = child.element(name); } if (child == null) { log.debug("未找到指定元素[" + name + "],返回null..."); } } return child; } /** * 根据给定路径查询给定 xml 元素的子元素 * * @param parent * 父节点元素 * @param childPath * 相对与父节点的子节点路径,路径组成部分之间用"/"分割,支持通配符号"*" * @param index 子节点在兄弟列表中的位置 * @return child 子节点元素 */ public static Element child(Element parent, String childPath,int index) { String names[] = childPath.split("/"); Element child = parent; for (String name : names) { if (name.equals("*")) { child = (Element) child.elements().get(index); } else { child = child.element(name); } if (child == null) { log.debug("未找到指定元素[" + name + "],返回null..."); } } return child; }/**
* 查询父节点的子节点的属性值 * * @param parent * 父节点 * @param attributePath * 子节点属性相对于父节点的路径,路径各组成部分用"/"分割, 属性名称前要添加"@"符号 * 支持通配符号"*" * @return 子节点的属性值,如果找不到返回null */ public static String childAttribute(Element parent, String attributePath) { if (attributePath.indexOf('@') == -1) throw new IllegalArgumentException("属性查询要使用 '@'"); int slashLoc = attributePath.lastIndexOf('/'); String childPath = attributePath.substring(0, slashLoc); Element child = child(parent, childPath); String attributeName = attributePath.substring(slashLoc + 2); String attributeValue = child.attributeValue(attributeName); if (null == attributeValue) { log.debug("未找到指定属性[" + attributeName + "],返回null..."); } return attributeValue; }/**
* 根据相对于父节点的子节点路径,查询子节点列表 * * @param parent * 父节点 * @param childrenPath * 子节点路径 * @return children 子节点列表 */ public static List children(Element parent, String childrenPath) { int slashLoc = childrenPath.lastIndexOf('/'); Element child = child(parent, childrenPath.substring(0, slashLoc)); if (child == null) return Collections.EMPTY_LIST; String childrenName = childrenPath.substring(slashLoc + 1); List children; if (childrenName.equals("*")) { children = child.elements(); } else { children = child.elements(childrenName); } return children; } /** * 创建一个xml 元素 * @param name xml 元素的名称 * @param attributes 元素属性 * @param ns 命名空间 * @return */ public static Element createElement(String name,Map<String,String> attributes,Namespace ns){ Element element = null; if(ns == null){ element = DocumentHelper.createElement(name); }else{ element = DocumentHelper.createElement(new QName(name,ns)); } for(String key: attributes.keySet()){ element.addAttribute(key, attributes.get(key)); } return element; } /** * 创建xml 文档 * @param nsArray 命名空间数组 * @param root * @return */ public static Document createDocument(Namespace[]nsArray,Element root){ Document document = DocumentHelper.createDocument(); if(root != null){ document.add(root); } if(nsArray != null && nsArray.length > 0){ for(Namespace ns : nsArray){ document.add(ns); } } return document; } }