zoukankan      html  css  js  c++  java
  • 测试dom4j创建、修改、遍历XML

    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. }  
  • 相关阅读:
    3.1.3、控制结构
    3.1.2、变量
    3.1.1、渲染模板
    3.1、Jinja2模板引擎
    第3章 模板
    2.6、Flask扩展
    2.5.4、响应
    2.5.3、请求钩子
    2.5.2、请求调度
    2.5.1、程序和请求上下文
  • 原文地址:https://www.cnblogs.com/niuchunjian/p/4520205.html
Copyright © 2011-2022 走看看