天使之爱你

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

java项目概览:

 

XmlManage.java

  1. package com.jialin;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileWriter;  
  5. import java.io.IOException;  
  6. import java.util.HashMap;  
  7. import java.util.Iterator;  
  8. import java.util.List;  
  9. import java.util.Map;  
  10.   
  11. import org.dom4j.Attribute;  
  12. import org.dom4j.Document;  
  13. import org.dom4j.DocumentException;  
  14. import org.dom4j.DocumentHelper;  
  15. import org.dom4j.Element;  
  16. import org.dom4j.io.OutputFormat;  
  17. import org.dom4j.io.SAXReader;  
  18. import org.dom4j.io.XMLWriter;  
  19.   
  20. /** 
  21.  * 测试DOM4J创建,修改,遍历XML 
  22.  *  
  23.  * @author jialin 
  24.  *  
  25.  */  
  26. public class XmlManager {  
  27.     public static void main(String[] args) {  
  28.         XmlManager xmlManager = new XmlManager();  
  29.         // 初始化xml文档  
  30.         Document doc = null;  
  31.         // 通过dom4j方法创建xml  
  32.         // doc = xmlManager.createXml();  
  33.   
  34.         // XML字符串  
  35.         // String strXMl = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"  
  36.         // + "<?xml-stylesheet type=\"text/xsl\" href=\"students.xsl\"?>"  
  37.         // + "<students><!--Students Table-->   <student stu=\"001\">"  
  38.         // + "<name>张三</name><age>18</age></student><student stu=\"002\">"  
  39.         // + "<name>李四</name><age>19</age></student></students>";  
  40.         // 通过字符串创建xml  
  41.         // doc = xmlManager.createDocumentByString(strXMl);  
  42.         // XMl输出路径  
  43.         // String outputPath = "xml/Students.xml";  
  44.         // 输出xml  
  45.         // xmlManager.saveDocument(doc, outputPath);  
  46.   
  47.         // xml输入路径  
  48.         String inputPath = "xml/Students.xml";  
  49.   
  50.         // 根据xml路径更改XML  
  51.         //xmlManager.ModifyXml(inputPath);  
  52.   
  53.         // 根据xml路径获取doc  
  54.         doc = xmlManager.getDocument(inputPath);  
  55.         // 遍历XML  
  56.          xmlManager.traversalDocumentByElementIterator(doc);  
  57.         // xmlManager.traversalDocumentByVisitor(doc);  
  58.         //xmlManager.traversalDocumentByElements(doc);  
  59.         //xmlManager.traversalDocumentByselectNodes(doc, "/Students/student/name");  
  60.     }  
  61.   
  62.     /** 
  63.      * 获取XML文件 
  64.      * @param inputPath 
  65.      * @return 
  66.      */  
  67.     public Document getDocument(String inputPath) {  
  68.         // 输入文件  
  69.         File inputXml = new File(inputPath);  
  70.         SAXReader saxReader = new SAXReader();  
  71.         Document document = null;  
  72.         try {  
  73.             document = saxReader.read(inputXml);  
  74.         } catch (DocumentException e) {  
  75.             e.printStackTrace();  
  76.         }  
  77.         return document;  
  78.     }  
  79.       
  80.     /** 
  81.      * 通过Dom4j方法创建xml文档 
  82.      *  
  83.      * @return 
  84.      */  
  85.     public Document createXml() {  
  86.         Document doc = DocumentHelper.createDocument();  
  87.         // 创建ProcessingInstruction  
  88.         Map<String, String> inMap = new HashMap<String, String>();  
  89.         inMap.put("type", "text/xsl");  
  90.         inMap.put("href", "students.xsl");  
  91.         doc.addProcessingInstruction("xml-stylesheet", inMap);  
  92.         // 增加根节点  
  93.         Element studentsElement = doc.addElement("Students");  
  94.         // 增加注释  
  95.         studentsElement.addComment("Students Table");  
  96.         // 增加子节点  
  97.         Element stuElement = studentsElement.addElement("student");  
  98.         // 增加属性  
  99.         stuElement.addAttribute("stu", "001");  
  100.         // 增加名称节点  
  101.         Element nameElement = stuElement.addElement("name");  
  102.         // 设置名称节点的值  
  103.         nameElement.setText("张三");  
  104.         // 增加年龄节点  
  105.         Element ageElement = stuElement.addElement("age");  
  106.         // 设置年龄节点的值  
  107.         ageElement.setText("18");  
  108.   
  109.         // 同上  
  110.         Element anotherStuElement = studentsElement.addElement("student");  
  111.         anotherStuElement.addAttribute("stu", "002");  
  112.         Element anotherNameElement = anotherStuElement.addElement("name");  
  113.         anotherNameElement.setText("李四");  
  114.         Element anotherAgeElement = anotherStuElement.addElement("age");  
  115.         anotherAgeElement.setText("19");  
  116.   
  117.         return doc;  
  118.     }  
  119.   
  120.     /** 
  121.      * 通过字符串创建xml文档 
  122.      * @param xmlStr 
  123.      * @return 
  124.      */  
  125.     public Document createDocumentByString(String xmlStr) {  
  126.   
  127.         Document doc = null;  
  128.         try {  
  129.             // 通过字符串转换直接构建xml文档  
  130.             doc = DocumentHelper.parseText(xmlStr);  
  131.         } catch (DocumentException e) {  
  132.             e.printStackTrace();  
  133.         }  
  134.         return doc;  
  135.     }  
  136.   
  137.     /** 
  138.      * 修改xml 
  139.      *  
  140.      * @param inputXmlPath 
  141.      */  
  142.     public void ModifyXml(String inputXmlPath) {  
  143.         // 获取文件  
  144.         File inputXml = new File(inputXmlPath);  
  145.   
  146.         try {  
  147.             SAXReader saxReader = new SAXReader();  
  148.             // 创建document  
  149.             Document doc = saxReader.read(inputXml);  
  150.             // 读取Students/student下所有具有属性stu的元素  
  151.             List list = doc.selectNodes("/Students/student/@stu");  
  152.             Iterator iter = list.iterator();  
  153.             while (iter.hasNext()) {  
  154.                 Attribute attribute = (Attribute) iter.next();  
  155.                 if (attribute.getValue().equals("001"))  
  156.                     attribute.setValue("0001");  
  157.             }  
  158.   
  159.             list = doc.selectNodes("/Students/student");  
  160.             iter = list.iterator();  
  161.             while (iter.hasNext()) {  
  162.                 Element element = (Element) iter.next();  
  163.                 Iterator iterator = element.elementIterator("name");  
  164.                 while (iterator.hasNext()) {  
  165.                     Element nameElement = (Element) iterator.next();  
  166.                     if (nameElement.getText().equals("张三"))  
  167.                         nameElement.setText("王五");  
  168.                 }  
  169.             }  
  170.             String outputPath = "xml/Students-Modified.xml";  
  171.             saveDocument(doc, outputPath);  
  172.   
  173.         }  
  174.   
  175.         catch (DocumentException e) {  
  176.             System.out.println(e.getMessage());  
  177.         }  
  178.   
  179.     }  
  180.   
  181.     /** 
  182.      * 将文档输出到文件保存,可指定格式化输出,可指定字符编码。 
  183.      *  
  184.      * @param document 
  185.      * @param outputFile 
  186.      */  
  187.     public void saveDocument(Document doc, String outputPath) {  
  188.         // 输出文件  
  189.         File outputFile = new File(outputPath);  
  190.         try {  
  191.             // 美化格式  
  192.             OutputFormat format = OutputFormat.createPrettyPrint();  
  193.             // 指定XML编码,不指定的话,默认为UTF-8  
  194.             format.setEncoding("UTF-8");  
  195.             XMLWriter output = new XMLWriter(new FileWriter(outputFile), format);  
  196.             output.write(doc);  
  197.             output.close();  
  198.         } catch (IOException e) {  
  199.             System.out.println(e.getMessage());  
  200.         }  
  201.     }  
  202.   
  203.     /** 
  204.      * 普通方法遍历xml 
  205.      *  
  206.      * @param doc 
  207.      */  
  208.     public void traversalDocumentByElementIterator(Document doc) {  
  209.         // 获取根节点  
  210.         Element root = doc.getRootElement();  
  211.         // 枚举根节点下所有子节点  
  212.         for (Iterator ie = root.elementIterator(); ie.hasNext();) {  
  213.             System.out.println("======");  
  214.             Element element = (Element) ie.next();  
  215.             System.out.println(element.getName());  
  216.   
  217.             // 枚举属性  
  218.             for (Iterator ia = element.attributeIterator(); ia.hasNext();) {  
  219.                 Attribute attribute = (Attribute) ia.next();  
  220.                 System.out.println(attribute.getName() + ":"  
  221.                         + attribute.getData());  
  222.             }  
  223.             // 枚举当前节点下所有子节点  
  224.             for (Iterator ieson = element.elementIterator(); ieson.hasNext();) {  
  225.                 Element elementSon = (Element) ieson.next();  
  226.                 System.out.println(elementSon.getName() + ":"  
  227.                         + elementSon.getText());  
  228.             }  
  229.         }  
  230.     }  
  231.   
  232.     /** 
  233.      * 使用elements方法进行xml的读取,相当于条件查询,可以根据不同的节点,利用for循环查询该节点下所有的数据。 
  234.      *  
  235.      * @throws DocumentException 
  236.      */  
  237.     public static void traversalDocumentByElements(Document doc) {  
  238.         // 获取根节点  
  239.         Element root = doc.getRootElement();  
  240.         // 根据根节点,将根节点下 student中的所有数据放到list容器中。  
  241.         List list = root.elements("student");  
  242.         // 这种遍历方式,是jdk1.5以上的版本支持的遍历方式,嘿嘿试试  
  243.         for (Object obj : list) {  
  244.             Element el = (Element) obj;  
  245.             System.out.println("----------"+el.getName()+"-----------");  
  246.             // 获取name节点下所有的内容,存入listName容器中  
  247.             List listName = el.elements("name");  
  248.             // 获取age节点下所有的内容,存入age容器中  
  249.             List listAge = el.elements("age");  
  250.             for (int i=0;i<listName.size();i++) {  
  251.                 Element elname = (Element) listName.get(i);  
  252.                 // 获取name节点下的数据。  
  253.                 System.out.println(elname.getName() + ": " + elname.getText());  
  254.                 Element elage = (Element) listAge.get(i);  
  255.                 // 获取age节点下的数据。  
  256.                 System.out.println(elage.getName() + ": " + elage.getText());  
  257.                   
  258.             }  
  259.   
  260.         }  
  261.     }  
  262.   
  263.     /** 
  264.      * 使用selectNodes读取xml文件 
  265.      *  
  266.      * @param args 
  267.      * @throws DocumentException 
  268.      */  
  269.     public static void traversalDocumentByselectNodes(Document doc,  
  270.             String elementpath) {  
  271.         // 使用selectNodes获取所要查询xml的节点。  
  272.         List list = doc.selectNodes(elementpath);  
  273.   
  274.         // 遍历节点,获取节点内数据。  
  275.         for (Iterator ie = list.iterator(); ie.hasNext();) {  
  276.             Element el = (Element) ie.next();  
  277.             System.out.println(el.getName() + ": " + el.getText());  
  278.   
  279.         }  
  280.   
  281.     }  
  282.   
  283.     /** 
  284.      * 基于访问者模式遍历 
  285.      *  
  286.      * @param doc 
  287.      */  
  288.     public void traversalDocumentByVisitor(Document doc) {  
  289.         doc.accept(new MyVisitor());  
  290.     }  
  291.   
  292. }  


MyVisitor.java

    1. package com.jialin;  
    2.   
    3. import org.dom4j.Attribute;  
    4. import org.dom4j.Element;  
    5. import org.dom4j.ProcessingInstruction;  
    6. import org.dom4j.VisitorSupport;  
    7.   
    8. /** 
    9.  * 定义自己的访问者类 
    10.  */  
    11. public class MyVisitor extends VisitorSupport {  
    12.    /** 
    13.     * 对于属性节点,打印属性的名字和值 
    14.     */  
    15.    public void visit(Attribute node) {  
    16.        System.out.println("attribute : " + node.getName() + " = "  
    17.               + node.getValue());  
    18.    }  
    19.   
    20.    /** 
    21.     * 对于处理指令节点,打印处理指令目标和数据 
    22.     */  
    23.    public void visit(ProcessingInstruction node) {  
    24.        System.out.println("PI : " + node.getTarget() + " "  
    25.               + node.getText());  
    26.    }  
    27.   
    28.    /** 
    29.     * 对于元素节点 
    30.     * 如果包含文本内容,则打印元素的名字和元素的内容。如果不是,则只打印元素的名字 
    31.     */  
    32.    public void visit(Element node) {  
    33.        if (node.isTextOnly())  
    34.           System.out.println("element : " + node.getName() + " = "  
    35.                  + node.getText());  
    36.        else  
    37.           System.out.println("《《《《《《" + node.getName() + "》》》》》》");  
    38.    }  
    39. }  
posted on 2015-05-21 17:05  FelixNiu001  阅读(704)  评论(0编辑  收藏  举报