开发使用的doc挺多的,以备以后的需要,将其封装了一下,以后直接拿来使用了。
jar下载:http://download.csdn.net/detail/xumajie88/6928377
代码如下:
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.StringReader;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
import org.jdom.xpath.XPath;
import org.xml.sax.InputSource;
/**
* utility for read or wirte xml
* @author xumajie
* @version SourceTrace4.0 2014.2.17
*/
final public class SimpleXMLUtil {
private SimpleXMLUtil(){
}
/**
* 将文件转为文档对象
* @param xmlPath= 文件路径
* @return 文档对象
*/
public static Document file2Doc(String xmlPath){
return file2Doc(xmlPath,false);
}
public static void main(String[] args) {
// JarFile jar = null;
// try {
// jar = new JarFile("D:\\workspace\\nmsi\\WebContent\\WEB-INF\\lib\\sourceview.jar");
// Enumeration e = jar.entries();
// while(e.hasMoreElements()){
// JarEntry je = e.nextElement();
// System.out.println(je.getName());
// }
// } catch (IOException e) {
// e.printStackTrace();
// }finally{
// try {
// if(jar!=null)
// jar.close();
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// }
// Document d = file2Doc("file:/D:/workspace/nmsi/WebContent/WEB-INF/lib/sourceview.jar!/com/shine/sourceview/host/config/pollers.xml");
// System.out.println(d);
Document d = file2Doc("E:\\project\\nms47\\src\\com\\shine\\project\\jyzfw\\config\\sysMenu.xml");
List es = d.getRootElement().getChildren("item");
for(Element e : es){
// System.out.println(e.getAttributeValue("id"));
if("5".equals(e.getAttributeValue("id"))){
System.out.println(e.getAttributeValue("text"));
//报表一级分类列表
List rs =e.getChildren();
for(Element re : rs){
System.out.println(re.getAttributeValue("id")+":"+re.getAttributeValue("text"));
//报表二级分类列表
List ss =re.getChildren();
for(Element se:ss){
System.out.println("\t"+se.getAttributeValue("text"));
}
}
}
}
// System.out.println(doc2String(d));
// System.out.println(BasePortTablePoller.class.getProtectionDomain().getCodeSource().getLocation().getPath());
}
private synchronized static InputStream readFromJar(JarFile jar,String path){
InputStream is = null;
int p = path.indexOf(".jar");
int s = 6;
if(!path.startsWith("file:"))
s = 0;
String jpath = path.substring(s,p)+".jar";
int s2 = 6;
if(!path.contains(".jar!"))
s2 = 5;
String fpath = path.substring(p+s2);
try{
jar = new JarFile(jpath);
Enumeration e = jar.entries();
while(e.hasMoreElements()){
JarEntry je = e.nextElement();
if(je.getName().equals(fpath)){
is = jar.getInputStream(je);
}
}
}catch(IOException e){
e.printStackTrace();
}
return is;
}
/**
* 将文件转为文档对象
* @param xmlPath= 文件路径
* @param validate =是否校验个文件
* @return 文档对象
*/
public static Document file2Doc(String xmlPath,boolean validate){
SAXBuilder builder = new SAXBuilder(validate);
Document doc = null;
JarFile jar = null;
try{
xmlPath = xmlPath.replace("%20", " ");
if(xmlPath.contains(".jar")){
doc = builder.build(readFromJar(jar,xmlPath));
}else{
doc = builder.build(new File(xmlPath));
}
}catch(Exception e){
e.printStackTrace();
}finally{
try {
if(jar!=null)
jar.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return doc;
}
/**
* 将文件流转为文档对象
* @param stream =文件流
* @param validate =是否校验个文件
* @return 文档对象
*/
public static Document file2Doc(InputStream stream,boolean validate){
SAXBuilder builder = new SAXBuilder(validate);
Document doc = null;
try{
doc = builder.build(stream);
}catch(Exception e){
e.printStackTrace();
}
return doc;
}
/**
* 将文件流转为文档对象
* @param stream= 文件流
* @return 文档对象
*/
public static Document file2Doc(InputStream stream){
SAXBuilder builder = new SAXBuilder(false);
Document doc = null;
try{
doc = builder.build(stream);
}catch(Exception e){
e.printStackTrace();
}
return doc;
}
/**
* 将文档对象转换为字符串
* @param doc= 文档对象
* @return 文档字符串
*/
public static String doc2String(final Document doc){
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintWriter pw = new PrintWriter(baos);
Format format = Format.getCompactFormat();
format.setEncoding("UTF-8");
XMLOutputter xmlop = new XMLOutputter();
xmlop.setFormat(format);
xmlop.output(doc, pw);
return baos.toString();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 将文档对象中的某个元素转换为字符串
* @param element= 文档对象中的某个元素
* @return 元素字符串
*/
public static String element2String(final Element element){
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintWriter pw = new PrintWriter(baos);
Format format = Format.getCompactFormat();
format.setEncoding("UTF-8");
XMLOutputter xmlop = new XMLOutputter();
xmlop.setFormat(format);
xmlop.output(element, pw);
return baos.toString();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 将字符串转换为文档对象
* @param xml= 需要转为文档对象的xml格式的字符串
* @return 文档对象
*/
public static Document string2Doc(final String xml){
Document doc = null;
try{
StringReader sr = new StringReader(xml);
InputSource is = new InputSource(sr);
doc = (new SAXBuilder()).build(is);
}catch(Exception e){
e.printStackTrace();
}
return doc;
}
/**
* 更新文档对象
* @param xmlPath= 需要更新文件的路径
* @param doc= 需要的文档对象
*/
public static void updateXML(String xmlPath,Document doc){
try{
xmlPath = xmlPath.replace("%20", " ");
Format format = Format.getCompactFormat();
format.setEncoding("UTF-8");
format.setIndent(" ");
XMLOutputter serializer = new XMLOutputter(format);
FileOutputStream fos = new FileOutputStream(xmlPath);
serializer.output(doc, fos);
fos.close();
}catch(Exception e){
e.printStackTrace();
}
}
/**
* 获取xml格式的字符串的元素
* @param xmlPath= 需要更新文件的路径
* @param xpathString= 需要查找的元素的节点路径 如: "a/b"表示查找b元素
* @return 查找的元素
*/
public static List getElements(String xmlPath,String xpathString){
return getElements(file2Doc(xmlPath).getRootElement(),xpathString);
}
/**
* 获取xml格式的字符串的元素
* @param root= 查找文档对象的根节点
* @param xpathString= 需要查找的元素的节点路径 如: "a/b"表示查找b元素
* @return 查找的元素
*/
public static List getElements(Element root,String path){
try {
return XPath.selectNodes(root,path);
} catch (JDOMException e) {
e.printStackTrace();
}
return null;
}
/**
* 获取文档对象的根节点指定节点路径元素
* @param root= 查找文档对象的根节点
* @param path= 需要查找的元素的节点路径 如: "a/b"表示查找b元素
* @return 查找的元素
*/
public static Element getElement(Element root,String path){
try {
return (Element)XPath.selectSingleNode(root, path);
} catch (JDOMException e) {
e.printStackTrace();
}
return null;
}
/**
* 删除节点
* @param xml=xml文本
* @param xpathString=xpath条件;
* @return
*/
public static Document removeNode(String xml,String xpathString){
return removeNode(string2Doc(xml),xpathString);
}
/**
* 删除节点
* @param doc=xml文档对象
* @param xpathString=xpath条件;
* @return
*/
public static Document removeNode(Document doc,String xpathString){
Element anode=null;
try {
XPath xpath=XPath.newInstance(xpathString);
anode = (Element)xpath.selectSingleNode(doc);
} catch (JDOMException e) {
e.printStackTrace();
}
anode.getParentElement().removeContent(anode);
return doc;
}
/**
* 判断节点是否存在
* @param xmlPath=xpath条件;
* @return
*/
public static boolean isXMLExists(String xmlPath) {
File file = new File(xmlPath);
return file.exists();
}
/**
* 把xml的所有子节点转化为Map
* @param path=文档对象的路径
* @param xpathString=需要转换的节点位置
* @return map
* */
public static Map getChildrenMap(String path,String xpathString){
Document doc=file2Doc(path);
List list=getElement(doc.getRootElement(),xpathString).getChildren();
Map map=null;
if(null==list||0==list.size())
return map;
map=new HashMap();
for (Element element:list) {
map.put(element.getName(), element.getText());
}
return map;
}
}