45fan.com - 路饭网

搜索: 您的位置主页 > 网络频道 > 阅读资讯:如何采用dom4j解析xml工具?

如何采用dom4j解析xml工具?

2016-09-04 15:08:01 来源:www.45fan.com 【

如何采用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;

}

}

 

本文地址:http://www.45fan.com/a/question/72268.html
Tags: 解析 Dom4j XML
编辑:路饭网
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部