采用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;
}
}

猜你喜欢

转载自yehlv.iteye.com/blog/2038963
今日推荐