采用dom4j解析xml工具

    技术2022-05-11  63

           在实际的开发中,我们通常会设计到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; }}

     


    最新回复(0)