使用dom4j创建和解析xml文件
在项目开发中,我们经常会遇到xml文件的创建和解析从别人接口得到的xml文件,而我们最常使用的组件是dom4j。
下面我就以代码来讲解一下如何使用dom4j来创建xml文件。
1.项目结构
在这里我们要,引入dom4j中的两个jar包,分别是:
dom4j-1.6.1;
jaxen-1.1-beta-6;
2.简要介绍
>创建xml 的主要类 DocumentHelper
document = DocumentHelper.createDocument();
>写入文件的主要类XMLWriter
>格式化xml的辅助类OutputFormat
OutputFormat format = OutputFormat.createPrettyPrint();
writer = new XMLWriter(new FileWriter(filepath), format);
>格式化输出 OutputFormat 相应的还有createCompactFormat() 创建压缩的xml文件,删去了所有的换行等无用的字符。createPrettyPrint() 则是生成格式化的xml 代码,让看起来好读一点。
3.实例
下面以代码来详细讲解,注释很清楚。
代码清单【1】XmlUtils.java
1 package com.lxf.xmlUtils; 2 3 import java.io.File; 4 import java.io.FileNotFoundException; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.io.InputStream; 8 import java.io.OutputStreamWriter; 9 import java.util.List; 10 import java.util.Properties; 11 import java.util.UUID; 12 13 import org.dom4j.Attribute; 14 import org.dom4j.Document; 15 import org.dom4j.DocumentException; 16 import org.dom4j.DocumentHelper; 17 import org.dom4j.Element; 18 import org.dom4j.io.OutputFormat; 19 import org.dom4j.io.SAXReader; 20 import org.dom4j.io.XMLWriter; 21 22 23 /** 24 * 使用dom4j生成和解析xml文件 25 * @author Administrator 26 *2016/12/05 27 */ 28 public class XmlUtils 29 { 30 private static final XmlUtils INSTANCE = new XmlUtils(); 31 32 private static final String UU_STRING = UUID.randomUUID().toString().substring(0, 5); 33 private static final String FILEBASEPATH = getPropertiesInfo("filepath") +"\\"+ UU_STRING + ".xml" ; 34 35 public static XmlUtils getInstance() 36 { 37 return INSTANCE; 38 } 39 40 41 /** 42 * 1.使用dom4j创建xml文档对象 43 */ 44 public static Document createDocument() 45 { 46 /* 47 * 1.使用DocumentHelper创建文档对象. 48 */ 49 Document document = DocumentHelper.createDocument(); 50 /* 51 * 2.创建根节点 52 */ 53 Element root = DocumentHelper.createElement("message"); 54 document.setRootElement(root); 55 /* 56 * 3.为根节点设置一级节点 57 */ 58 Element element1 = root.addElement("name"); 59 element1.setText("java"); 60 61 Element element2 = root.addElement("age"); 62 element2.setText("23"); 63 /* 64 * 为一级节点设置子节点 65 */ 66 Element element3 = root.addElement("address"); 67 Element element31 = element3.addElement("id"); 68 element31.setText("1"); 69 Element element32 = element3.addElement("province"); 70 element32.setText("北京市"); 71 Element element33 = element3.addElement("street"); 72 element33.setText("长安街"); 73 /* 74 *4.为节点设置属性 75 */ 76 root.setAttributeValue("version", "2.0"); 77 element1.setAttributeValue("kind", "book"); 78 79 return document; 80 81 } 82 83 /** 84 * 2.使用dom4j创建输出xml文件 85 */ 86 public static void createXml() 87 { 88 /* 89 * 1.创建文档对象 90 */ 91 Document document = createDocument(); 92 //生成的xml文件存放路径 93 String filePath =FILEBASEPATH; 94 File file = new File(filePath); 95 96 OutputStreamWriter osw = null; 97 try 98 { 99 osw = new OutputStreamWriter(new FileOutputStream(file)); 100 /* 101 * 2.设置xml文档的输出格式为缩进 102 */ 103 OutputFormat format = OutputFormat.createPrettyPrint(); 104 /* 105 *3.设置输出文档的编码为UTF-8 106 */ 107 format.setEncoding("UTF-8"); 108 XMLWriter out = new XMLWriter(osw, format); 109 /* 110 * 4.输出xml文档 111 */ 112 out.write(document); 113 114 } 115 catch (FileNotFoundException e) 116 { 117 e.printStackTrace(); 118 } 119 catch (IOException e) 120 { 121 e.printStackTrace(); 122 } 123 finally 124 { 125 //关闭输出流 126 if(null != osw ) 127 { 128 try 129 { 130 osw.close(); 131 } 132 catch (IOException e) 133 { 134 e.printStackTrace(); 135 } 136 } 137 } 138 } 139 140 /** 141 * 3.使用dom4j解析xml文件 142 */ 143 public static void analyzeXml() 144 { 145 //生成的xml文件存放路径 146 String filePath =FILEBASEPATH; 147 File file = new File(filePath); 148 /* 149 * 1.使用SAXReader创建Document文档对象 150 */ 151 SAXReader reader = new SAXReader(); 152 try 153 { 154 Document document = reader.read(file); 155 /* 156 * 2.获取xml文件的根节点 157 */ 158 Element root = document.getRootElement(); 159 /* 160 * 3.获取子节点和属性 161 */ 162 iteratorCherk(root); 163 } 164 catch (DocumentException e) 165 { 166 e.printStackTrace(); 167 } 168 169 } 170 171 /** 172 * 4.获取节点名,节点属性 173 */ 174 public static void iteratorCherk(Element element) 175 { 176 List<Element> elements = element.elements(); 177 for(Element e : elements) 178 { 179 List<Attribute> attributeList = e.attributes(); 180 String name = e.getName(); 181 String text = e.getTextTrim(); 182 if(text.length()==0) 183 { 184 System.out.println(name+":"); 185 }else 186 { 187 System.out.println(name+"="+ text); 188 } 189 for(Attribute att : attributeList) 190 { 191 String aname = att.getName(); 192 String atext = att.getText(); 193 System.out.println(aname +"="+ atext); 194 } 195 iteratorCherk(e); 196 } 197 198 } 199 200 /** 201 * 5.获取配置文件的配置信息 202 * @return 203 */ 204 public static String getPropertiesInfo(String string) 205 { 206 InputStream inputStream = XmlUtils.class.getClassLoader().getResourceAsStream("config.properties"); 207 Properties p = new Properties(); 208 try 209 { 210 p.load(inputStream); 211 } 212 catch (IOException e) 213 { 214 e.printStackTrace(); 215 } 216 return p.getProperty(string); 217 } 218 }
使用JUnit测试,代码清单【2】XmlTest.java
1 package demo; 2 3 import org.junit.Test; 4 5 import com.lxf.xmlUtils.XmlUtils; 6 7 /** 8 * xml工具类测试 9 * @author Administrator 10 * 11 */ 12 public class XmlTest 13 { 14 /** 15 * 创建xml文件测试 16 */ 17 @Test 18 public void createXmlTest() 19 { 20 XmlUtils.getInstance().createXml(); 21 } 22 23 /** 24 * 解析xml文件测试 25 */ 26 @Test 27 public void analyzeXmlTest() 28 { 29 XmlUtils.getInstance().analyzeXml(); 30 } 31 32 }
4.拓展和后期补充
可以看到,我在项目中配置了一个.properties文件,大家可以在为xml文件增加节点和给节点赋值的时候,
读取配置文件的内容(.properties文件的内容结构是key=value).关于读取配置文件可以参照我的上一篇总结(java读取properties配置文件总结).
未来两天,我还会进行javaBean与Xml文件相互转换的总结,目前的想法是:
(1)使用目前掌握的dom4j知识;
(2)使用JAXBContext类,是应用的入口,用于管理XML/Java绑定信息。
使用Marshaller接口,将Java对象序列化为XML数据;
使用Unmarshaller接口,将XML数据反序列化为Java对象。