au585是什么金值钱吗:java操作xml增删改查

来源:百度文库 编辑:偶看新闻 时间:2024/04/26 17:11:34
1:DOM4J性能最好,连Sun的JAXM也在用DOM4J.目前许多开源项目中大量采用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文件。如果不考虑可移植性,那就采用DOM4J.

2:JDOM 和DOM在性能测试时表现不佳,在测试10M文档时内存溢出。在小文档情况下还值得考虑使用DOM和JDOM.虽然JDOM的开发者已经说明他们期望在正式发行版前专注性能问题,但是从性能观点来看,它确实没有值得推荐之处。另外,DOM仍是一个非常好的选择。DOM实现广泛应用于多种编程语言。它还是许多其它与XML相关的标准的基础,因为它正式获得W3C推荐(与基于非标准的Java模型相对),所以在某些类型的项目中可能也需要它(如在 JavaScript中使用DOM)。

3:SAX表现较好,这要依赖于它特定的解析方式-事件驱动。一个SAX检测即将到来的XML 流,但并没有载入到内存(当然当XML流被读入时,会有部分文档暂时隐藏在内存中)。

接下来我来展示以下用这四种方式处理xml的一个简单的例子,希望能给大家一些帮助。

1:要操作的xml文件:student.xml
Java代码
  1. "1.0" encoding="UTF-8" ?>
  2. TigerLee
  3. 26
  4. 北京海淀
  5. Snow
  6. 24
  7. 山东


2:处理xml的java类HandleXML.java

Java代码
  1. package com.tigerlee.xml;
  2. import java.io.File;
  3. import java.io.FileWriter;
  4. import java.io.Writer;
  5. import java.util.Iterator;
  6. import java.util.LinkedHashMap;
  7. import java.util.List;
  8. import java.util.Map;
  9. import java.util.Set;
  10. import java.util.Stack;
  11. import javax.xml.parsers.DocumentBuilder;
  12. import javax.xml.parsers.DocumentBuilderFactory;
  13. import javax.xml.transform.Transformer;
  14. import javax.xml.transform.TransformerFactory;
  15. import javax.xml.transform.dom.DOMSource;
  16. import javax.xml.transform.stream.StreamResult;
  17. import org.dom4j.Element;
  18. import org.dom4j.io.OutputFormat;
  19. import org.dom4j.io.SAXReader;
  20. import org.dom4j.io.XMLWriter;
  21. import org.w3c.dom.Document;
  22. import org.w3c.dom.Node;
  23. import org.w3c.dom.NodeList;
  24. import org.xml.sax.Attributes;
  25. import org.xml.sax.SAXException;
  26. import org.xml.sax.helpers.DefaultHandler;
  27. /**
  28. *
  29. * 在XML文档中实现增、删、改、查
  30. * @author TigerLee
  31. *
  32. */
  33. public class HandleXML {
  34. /**
  35. * 采用DOM方式
  36. * @author TigerLee
  37. *
  38. */
  39. public class DOMForXml{
  40. /**
  41. * 获得doc对象
  42. * @param fileName
  43. * @return
  44. */
  45. public Document getDocument(String fileName){
  46. Document document = null;
  47. try{
  48. DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  49. DocumentBuilder builder = factory.newDocumentBuilder();
  50. document = builder.parse(new File(fileName));
  51. }catch(Exception e){
  52. e.printStackTrace();
  53. }
  54. return document;
  55. }
  56. /**
  57. * 将改动持久到文件
  58. * @param doc
  59. * @param distFileName
  60. */
  61. public void modifyFile(Document doc,String distFileName){
  62. try{
  63. TransformerFactory tf = TransformerFactory.newInstance();
  64. Transformer tfer = tf.newTransformer();
  65. DOMSource dsource = new DOMSource(doc);
  66. StreamResult sr = new StreamResult(new File("student.xml"));
  67. tfer.transform(dsource, sr);
  68. }catch(Exception e){
  69. e.printStackTrace();
  70. }
  71. }
  72. /**
  73. * 解析
  74. * @param fileName
  75. */
  76. public void paseXml(String fileName){
  77. Document document = getDocument(fileName);
  78. NodeList nodeList = document.getElementsByTagName("student");
  79. for(int i=0;i
  80. StringBuilder sb = new StringBuilder();
  81. sb.append("姓名:"+document.getElementsByTagName("name").item(i).getFirstChild().getNodeValue());
  82. sb.append(" , ");
  83. sb.append("年龄:"+document.getElementsByTagName("age").item(i).getFirstChild().getNodeValue());
  84. sb.append(" , ");
  85. sb.append("性别:"+document.getElementsByTagName("sex").item(i).getFirstChild().getNodeValue());
  86. sb.append(" , ");
  87. sb.append("地址:"+document.getElementsByTagName("address").item(i).getFirstChild().getNodeValue());
  88. System.out.println(sb.toString());
  89. }
  90. }
  91. /**
  92. * 创建一个新的学生
  93. * @param name
  94. * @param age
  95. * @param sex
  96. * @param address
  97. */
  98. public void addNewNode(String name,String age,String sex,String address){
  99. try{
  100. Document document = getDocument("student.xml");
  101. NodeList nodeList = document.getElementsByTagName("students");
  102. //创建新的节点
  103. Node studentNode = document.createElement("student");
  104. Node nameNode = document.createElement("name");
  105. nameNode.appendChild(document.createTextNode(name));
  106. Node ageNode = document.createElement("age");
  107. ageNode.appendChild(document.createTextNode(age));
  108. Node sexNode = document.createElement("sex");
  109. sexNode.appendChild(document.createTextNode(sex));
  110. Node addressNode = document.createElement("address");
  111. addressNode.appendChild(document.createTextNode(address));
  112. // 添加节点
  113. studentNode.appendChild(nameNode);
  114. studentNode.appendChild(ageNode);
  115. studentNode.appendChild(sexNode);
  116. studentNode.appendChild(addressNode);
  117. nodeList.item(0).appendChild(studentNode);
  118. // 此时真正的处理将新数据添加到文件中(磁盘)
  119. TransformerFactory tf = TransformerFactory.newInstance();
  120. Transformer tfer = tf.newTransformer();
  121. DOMSource dsource = new DOMSource(document);
  122. StreamResult sr = new StreamResult(new File("student.xml"));
  123. tfer.transform(dsource, sr);
  124. }catch(Exception e){
  125. e.printStackTrace();
  126. }
  127. paseXml("student.xml");
  128. }
  129. /**
  130. * 删除一个节点
  131. * @param name
  132. */
  133. public void deleteNode(String name){
  134. Document document = getDocument("student.xml");
  135. NodeList nodeList = document.getElementsByTagName("name");
  136. for(int i=0;i
  137. String value = nodeList.item(i).getFirstChild().getTextContent();
  138. if(name!=null && name.equalsIgnoreCase(value)){
  139. Node parentNode = nodeList.item(i).getParentNode();
  140. document.getFirstChild().removeChild(parentNode);
  141. }
  142. }
  143. modifyFile(document,"student.xml");
  144. }
  145. /**
  146. * 根据name修改某个节点的内容
  147. * @param name
  148. */
  149. public void updateNode(String name){
  150. Document document = getDocument("student.xml");
  151. NodeList nodeList = document.getElementsByTagName("name");
  152. for(int i=0;i
  153. String value = nodeList.item(i).getFirstChild().getTextContent();
  154. if(name!=null && name.equalsIgnoreCase(value)){
  155. Node parentNode = nodeList.item(i).getParentNode();
  156. NodeList nl = parentNode.getChildNodes();
  157. for(int j=0;j
  158. String modifyNode= nl.item(j).getNodeName();
  159. if(modifyNode.equalsIgnoreCase("age")){
  160. nl.item(j).getFirstChild().setTextContent("25");
  161. }
  162. }
  163. }
  164. }
  165. modifyFile(document,"student.xml");
  166. }
  167. }
  168. /**
  169. * 采用SAX方式
  170. * @author TigerLee
  171. *
  172. */
  173. public class SAXForXml extends DefaultHandler{
  174. private Stack tags = new Stack();
  175. private Map contents = new LinkedHashMap();
  176. public int count = 0;
  177. @Override
  178. public void characters(char[] ch, int start, int length)
  179. throws SAXException {
  180. String tag = (String)tags.peek();
  181. if("name".equals(tag)){
  182. String name = new String(ch,start,length);
  183. contents.put("name"+count,name);
  184. }
  185. if("age".equals(tag)){
  186. contents.put("age"+count,new String(ch,start,length));
  187. }
  188. if("sex".equals(tag)){
  189. contents.put("sex"+count,new String(ch,start,length));
  190. }
  191. if("address".equals(tag)){
  192. contents.put("address"+count,new String(ch,start,length));
  193. }
  194. }
  195. @Override
  196. public void startElement(String uri, String localName, String qName,
  197. Attributes attributes) throws SAXException {
  198. if("student".equals(qName)){
  199. count++;
  200. }
  201. tags.push(qName);
  202. }
  203. @Override
  204. public void endElement(String uri, String localName, String qName)
  205. throws SAXException {
  206. tags.pop();
  207. }
  208. public Map getContents(){
  209. return contents;
  210. }
  211. }
  212. /**
  213. * 采用JDOM方式
  214. * @author TigerLee
  215. *
  216. */
  217. public class JDOMForXml{
  218. }
  219. /**
  220. * 采用DOM4J方式
  221. * @author TigerLee
  222. *
  223. */
  224. public class DOM4JForXml{
  225. /**
  226. * 获取doc对象(org.dom4j.Document)
  227. * @param fileName
  228. * @return
  229. */
  230. public org.dom4j.Document getDocument(String fileName){
  231. SAXReader sr = new SAXReader();
  232. org.dom4j.Document doc = null;
  233. try {
  234. doc = sr.read(new File(fileName));
  235. } catch (Exception e) {
  236. e.printStackTrace();
  237. }
  238. return doc;
  239. }
  240. /**
  241. * 将文件保存到硬盘
  242. * @param doc
  243. * @param fileName
  244. */
  245. public void writeToFile(org.dom4j.Document doc,String fileName){
  246. try {
  247. Writer writer = new FileWriter(fileName);
  248. OutputFormat format = OutputFormat.createPrettyPrint();
  249. format.setEncoding("UTF-8");
  250. XMLWriter xmlWriter = new XMLWriter(writer, format);
  251. xmlWriter.write(doc);
  252. xmlWriter.close();
  253. System.out.println(" 文件已经钝化!");
  254. } catch (Exception e) {
  255. e.printStackTrace();
  256. }
  257. }
  258. /**
  259. * 遍历xml文件输出节点值
  260. *
  261. * @param fileName
  262. */
  263. public void readXml(String fileName){
  264. org.dom4j.Document doc = getDocument(fileName);
  265. List nameList = doc.selectNodes("/students/student/name");
  266. List ageList = doc.selectNodes("/students/student/age");
  267. List sexList = doc.selectNodes("/students/student/sex");
  268. List addressList = doc.selectNodes("/students/student/address");
  269. for(int i=0;i
  270. StringBuilder sb = new StringBuilder();
  271. sb.append("name="+((Element)nameList.get(i)).getTextTrim());
  272. sb.append(",age="+((Element)ageList.get(i)).getTextTrim());
  273. sb.append(",sex="+((Element)sexList.get(i)).getTextTrim());
  274. sb.append(",address="+((Element)addressList.get(i)).getTextTrim());
  275. System.out.println(sb.toString());
  276. }
  277. }
  278. /**
  279. * 根据姓名修改一个学生的信息
  280. * @param name
  281. * @param newValue
  282. * @param fileName
  283. */
  284. public void updateXml(String name,Map newValue,String fileName){
  285. org.dom4j.Document doc = getDocument(fileName);
  286. List nameList = doc.selectNodes("/students/student/name");
  287. Iterator iterator = nameList.iterator();
  288. while(iterator.hasNext()){
  289. Element element = (Element)iterator.next();
  290. if(name!=null && name.equals(element.getText())){
  291. Element pe = element.getParent();
  292. List childList = pe.elements();
  293. for(int i=0;i
  294. Iterator valueSet = newValue.entrySet().iterator();
  295. while(valueSet.hasNext()){
  296. Map.Entry entry = (Map.Entry)valueSet.next();
  297. String nodeName = ((Element)childList.get(i)).getName();
  298. String key = entry.getKey().toString();
  299. if(key!=null && key.equals(nodeName)){
  300. ((Element)childList.get(i)).setText((String)entry.getValue());
  301. }
  302. }
  303. }
  304. }
  305. }
  306. writeToFile(doc, fileName);
  307. }
  308. }
  309. }