Java的XML创建、解析文档(转载自http://blog.csdn.net/psyuhen/article/details/7539228)

3 篇文章 0 订阅

1、使用DOM

优点:可以在内存直接操作节点。

缺点:当文档较大时,消耗内存大。

[java]  view plain copy
  1. /** 
  2.  *  
  3.  */  
  4. package com.ee.xml;  
  5.   
  6. import java.io.File;  
  7. import java.io.IOException;  
  8.   
  9. import javax.xml.parsers.DocumentBuilder;  
  10. import javax.xml.parsers.DocumentBuilderFactory;  
  11. import javax.xml.parsers.ParserConfigurationException;  
  12. import javax.xml.transform.OutputKeys;  
  13. import javax.xml.transform.Transformer;  
  14. import javax.xml.transform.TransformerConfigurationException;  
  15. import javax.xml.transform.TransformerException;  
  16. import javax.xml.transform.TransformerFactory;  
  17. import javax.xml.transform.dom.DOMSource;  
  18. import javax.xml.transform.stream.StreamResult;  
  19.   
  20. import org.w3c.dom.Document;  
  21. import org.w3c.dom.Element;  
  22. import org.w3c.dom.Node;  
  23. import org.w3c.dom.NodeList;  
  24. import org.xml.sax.SAXException;  
  25.   
  26. /** 
  27.  * <pre> 
  28.  * 使用DOM来创建文档,读取文档等。 
  29.  * </pre> 
  30.  * @author ps 
  31.  * 
  32.  */  
  33. public class XmlDocument {  
  34.     private Document document;  
  35.     /** 
  36.      * 创建文档 
  37.      */  
  38.     public void createXmlDocument(){  
  39.         try {  
  40.             //使用工厂类创建  
  41.             DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();  
  42.             DocumentBuilder builder = builderFactory.newDocumentBuilder();  
  43.             document = builder.newDocument();  
  44.         } catch (ParserConfigurationException e) {  
  45.             e.printStackTrace();;  
  46.         }  
  47.     }  
  48.       
  49.     /** 
  50.      * <pre> 
  51.      * 创建XML文档 
  52.      * 生成的内容如下: 
  53.      * <?xml version="1.0" encoding="utf-8" standalone="no"?> 
  54.      * <employees> 
  55.      * <employee> 
  56.      * <name>pansen</name> 
  57.      * <sex>男</sex> 
  58.      * <age>26</age> 
  59.      * </employee> 
  60.      * </employees> 
  61.      * </pre> 
  62.      */  
  63.     public void createXml(){  
  64.         Element element = document.createElement("employee");  
  65.         Element name = document.createElement("name");  
  66.         Node node = document.createTextNode("pansen");  
  67.         name.appendChild(node);  
  68.         element.appendChild(name);  
  69.           
  70.         Element sex = document.createElement("sex");  
  71.         Node sexText = document.createTextNode("男");  
  72.         sex.appendChild(sexText);  
  73.         element.appendChild(sex);  
  74.           
  75.           
  76.         Element age = document.createElement("age");  
  77.         Node ageText = document.createTextNode("26");  
  78.         age.appendChild(ageText);  
  79.         element.appendChild(age);  
  80.           
  81.         Element root = document.createElement("employees");  
  82.         root.appendChild(element);  
  83.         document.appendChild(root);  
  84.           
  85.         try {  
  86.             TransformerFactory transformerFactory = TransformerFactory.newInstance();  
  87.             Transformer transformer = transformerFactory.newTransformer();  
  88.               
  89.             DOMSource domSource = new DOMSource(document);  
  90.               
  91.             //设置文档的编码  
  92.             transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8");  
  93.             transformer.setOutputProperty(OutputKeys.INDENT, "yes");  
  94.               
  95.             File file = new File("d:\\my.xml");//文件名  
  96.               
  97.             StreamResult result = new StreamResult(file);  
  98.             transformer.transform(domSource, result);//生成XML文件  
  99.         } catch (TransformerConfigurationException e) {  
  100.             e.printStackTrace();  
  101.         } catch (TransformerException e) {  
  102.             e.printStackTrace();  
  103.         }  
  104.     }  
  105.       
  106.     /** 
  107.      * 解析XML文档 
  108.      */  
  109.     public void parseXML(){  
  110.         try {  
  111.             DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();  
  112.             DocumentBuilder builder = builderFactory.newDocumentBuilder();  
  113.             File file = new File("d:\\my.xml");  
  114.             Document document = builder.parse(file);//把XML文档转换为Document  
  115.             NodeList employees = document.getChildNodes();  
  116.               
  117.             //遍历输出  
  118.             for (int i = 0; i < employees.getLength(); i++) {  
  119.                 Node employe = employees.item(i);  
  120.                 NodeList nodeList = employe.getChildNodes();  
  121.                 for (int j = 0; j < nodeList.getLength(); j++) {  
  122.                     Node node = nodeList.item(j);  
  123.                       
  124.                     NodeList employeeMeta = node.getChildNodes();  
  125.                     for (int k = 0; k < employeeMeta.getLength(); k++) {   
  126.                         System.out.println(employeeMeta.item(k).getNodeName()   
  127.                         + ":" + employeeMeta.item(k).getTextContent());   
  128.                     }   
  129.                 }  
  130.             }  
  131.         } catch (ParserConfigurationException e) {  
  132.             e.printStackTrace();  
  133.         } catch (SAXException e) {  
  134.             e.printStackTrace();  
  135.         } catch (IOException e) {  
  136.             e.printStackTrace();  
  137.         }  
  138.     }  
  139. }  

2、使用SAX

优点:不必解析整个文档,消耗内存较小。

缺点不是持久的;事件过后,若没保存数据,那么数据就丢了;无状态性;从事件中只能得到文本,但不知该文本属于哪个元素

例子:

[java]  view plain copy
  1. /** 
  2.  *  
  3.  */  
  4. package com.ee.xml;  
  5.   
  6. import java.io.File;  
  7. import java.io.IOException;  
  8.   
  9. import javax.xml.parsers.ParserConfigurationException;  
  10. import javax.xml.parsers.SAXParser;  
  11. import javax.xml.parsers.SAXParserFactory;  
  12.   
  13. import org.xml.sax.SAXException;  
  14.   
  15. import com.ee.xml.handle.EmployeeHandler;  
  16.   
  17.   
  18. /** 
  19.  * <pre> 
  20.  * 使用SAX来创建文档,读取文档等。 
  21.  * </pre> 
  22.  * @author ps 
  23.  * 
  24.  */  
  25. public class SaxXmlDocument extends XmlDocument{  
  26.     /** 
  27.      * 解析XML文档 
  28.      */  
  29.     public void parseXML(){  
  30.         try {  
  31.             SAXParserFactory parserFactory = SAXParserFactory.newInstance();  
  32.             SAXParser saxParser = parserFactory.newSAXParser();  
  33.             File file = new File("d:\\my.xml");  
  34.               
  35.             EmployeeHandler handler = new EmployeeHandler();  
  36.             saxParser.parse(file, handler);  
  37.         } catch (ParserConfigurationException e) {  
  38.             e.printStackTrace();  
  39.         } catch (SAXException e) {  
  40.             e.printStackTrace();  
  41.         } catch (IOException e) {  
  42.             e.printStackTrace();  
  43.         }  
  44.     }  
  45. }  

[java]  view plain copy
  1. package com.ee.xml.handle;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import org.xml.sax.Attributes;  
  7. import org.xml.sax.SAXException;  
  8. import org.xml.sax.helpers.DefaultHandler;  
  9.   
  10. import com.ee.xml.entity.Employee;  
  11. /** 
  12.  *  
  13.  * @author ps 
  14.  * 
  15.  */  
  16. public class EmployeeHandler extends DefaultHandler{  
  17.     private Employee employee;  
  18.     private List<Employee> employeeLists;  
  19.     private String tagName;  
  20.   
  21.     public Employee getEmployee() {  
  22.         return employee;  
  23.     }  
  24.   
  25.     public void setEmployee(Employee employee) {  
  26.         this.employee = employee;  
  27.     }  
  28.   
  29.     public List<Employee> getEmployeeLists() {  
  30.         return employeeLists;  
  31.     }  
  32.   
  33.     public void setEmployeeLists(List<Employee> employeeLists) {  
  34.         this.employeeLists = employeeLists;  
  35.     }  
  36.       
  37.     @Override  
  38.     public void startDocument() throws SAXException {  
  39.         //文档开始,可以做一些初始化的内容  
  40.         System.err.println("文档开始,可以做一些初始化的内容");  
  41.         employeeLists = new ArrayList<Employee>();  
  42.     }  
  43.       
  44.     @Override  
  45.     public void startElement(String uri, String localName, String qName,  
  46.             Attributes attributes) throws SAXException {  
  47.         //开始节点调用  
  48.         System.err.println("开始节点调用");  
  49.         if("employee".equals(qName)){  
  50.             employee = new Employee();  
  51.             //在此可以用来判断获取tagName上的属性值  
  52.         }  
  53.         tagName = qName;  
  54.         System.err.println(qName);  
  55.     }  
  56.       
  57.     @Override  
  58.     public void endElement(String uri, String localName, String qName)  
  59.             throws SAXException {  
  60.         //结束节点调用  
  61.         System.err.println("结束节点调用");  
  62.         employeeLists.add(employee);  
  63.         tagName = null;  
  64.     }  
  65.       
  66.     @Override  
  67.     public void endDocument() throws SAXException {  
  68.         //文档结束  
  69.         System.err.println("文档结束");  
  70.     }  
  71.       
  72.     @Override  
  73.     public void characters(char[] ch, int start, int length)  
  74.             throws SAXException {  
  75.           
  76.         String val = new String(ch, start, length);  
  77.         System.err.println(val);  
  78.         if("name".equals(tagName)){  
  79.             employee.setName(val);  
  80.         }else if("sex".equals(tagName)){  
  81.             employee.setSex(val);  
  82.         }else if("age".equals(tagName)){  
  83.             employee.setAge(Integer.parseInt(val));  
  84.         }  
  85.           
  86.     }  
  87. }  

[java]  view plain copy
  1. /** 
  2.  *  
  3.  */  
  4. package com.ee.xml.entity;  
  5.   
  6. /** 
  7.  * @author ps 
  8.  * 
  9.  */  
  10. public class Employee {  
  11.     private String name;  
  12.     private String sex;  
  13.     private int age;  
  14.       
  15.     public String getName() {  
  16.         return name;  
  17.     }  
  18.     public void setName(String name) {  
  19.         this.name = name;  
  20.     }  
  21.     public String getSex() {  
  22.         return sex;  
  23.     }  
  24.     public void setSex(String sex) {  
  25.         this.sex = sex;  
  26.     }  
  27.     public int getAge() {  
  28.         return age;  
  29.     }  
  30.     public void setAge(int age) {  
  31.         this.age = age;  
  32.     }  
  33. }  

3、使用DOM4J,需要导入dom4j-1.6.1.jar

DOM4J 是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的 Java 软件都在使用 DOM4J 来读写 XML,特别值得一提的是连 Sun 的 JAXM 也在用 DOM4J

[java]  view plain copy
  1. /** 
  2.  *  
  3.  */  
  4. package com.ee.xml;  
  5.   
  6. import java.io.File;  
  7. import java.io.FileOutputStream;  
  8. import java.io.FileWriter;  
  9. import java.io.IOException;  
  10. import java.io.OutputStream;  
  11. import java.io.OutputStreamWriter;  
  12. import java.io.Writer;  
  13. import java.util.Iterator;  
  14.   
  15. import org.dom4j.Document;  
  16. import org.dom4j.DocumentException;  
  17. import org.dom4j.DocumentHelper;  
  18. import org.dom4j.Element;  
  19. import org.dom4j.io.SAXReader;  
  20. import org.dom4j.io.XMLWriter;  
  21.   
  22. /** 
  23.  * @author ps 
  24.  * 
  25.  */  
  26. public class Dom4jXmlDocument {  
  27.       
  28.     public void createXml(){  
  29.         Document document = DocumentHelper.createDocument();  
  30.         Element employees = document.addElement("employees");  
  31.         Element employee = employees.addElement("employee");  
  32.         Element name = employee.addElement("name");  
  33.         name.setText("pansen");  
  34.         Element sex = employee.addElement("sex");  
  35.         sex.setText("男");  
  36.         Element age = employee.addElement("age");  
  37.         age.setText("26");  
  38.           
  39.         try {  
  40.             File file = new File("d:\\dom4j.xml");  
  41.             OutputStream out = new FileOutputStream(file);  
  42.             Writer writer = new OutputStreamWriter(out, "utf-8");  
  43.             //Writer writer = new FileWriter(file);//2 字节的 UTF-8 序列的字节 2 无效。  
  44.             XMLWriter xmlWriter = new XMLWriter(writer);  
  45.               
  46.             xmlWriter.write(document);  
  47.             xmlWriter.close();  
  48.         } catch (IOException e) {  
  49.             e.printStackTrace();  
  50.         }  
  51.           
  52.     }  
  53.       
  54.     public void parseXml(){  
  55.         File file = new File("d:\\dom4j.xml");  
  56.         SAXReader saxReader = new SAXReader();  
  57.           
  58.         try {  
  59.             Document document = saxReader.read(file);  
  60.               
  61.             Element employees = document.getRootElement();  
  62.               
  63.             Iterator<Element> iterator = employees.elementIterator();  
  64.               
  65.             while(iterator.hasNext()){  
  66.                 Element employee = iterator.next();  
  67.                   
  68.                 Iterator<Element> iter = employee.elementIterator();  
  69.                 while(iter.hasNext()){  
  70.                     Element node = iter.next();  
  71.                       
  72.                     System.err.println(node.getName() + "||" + node.getText());  
  73.                 }  
  74.             }  
  75.         } catch (DocumentException e) {  
  76.             e.printStackTrace();  
  77.         }  
  78.     }  
  79. }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值