• 【Java】XML解析之DOM


    DOM介绍

      DOM(Document Object Model)解析是官方提供的XML解析方式之一,使用时无需引入第三方包,代码编写简单,方便修改树结构,但是由于DOM解析时是将整个XML文件加载到内存中进行解析,因此当XML文件较大时,使用DOM解析效率会降低,而且可能造成内存溢出。

    XML生成

      代码如下:

      

     1     public static void write() {  
     2         
     3         //文档构建工厂
     4         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
     5         try {
     6             //文档构建器
     7             DocumentBuilder builder = dbf.newDocumentBuilder();  
     8             //文档
     9             Document doc = builder.newDocument();
    10             //设置xml文件是否独立
    11             doc.setXmlStandalone(true);
    12             //设置xml文件版本,默认1.0
    13             doc.setXmlVersion("1.1");
    14             
    15             //创建根目录节点
    16             Element root = doc.createElement("conpany");
    17             //设置节点属性
    18             root.setAttribute("name", "hd");
    19             //添加根节点
    20             doc.appendChild(root);
    21             
    22             
    23             Element department = doc.createElement("department");
    24             department.setAttribute("name", "test");
    25             //设置节点文本
    26             department.setTextContent("123456");
    27             //添加到根节点
    28             root.appendChild(department);
    29             
    30             // 工厂类,用来获取转换对象
    31             TransformerFactory transFactory = TransformerFactory.newInstance();
    32             //转化对象
    33             Transformer transFormer = transFactory.newTransformer();
    34             // 设置文档自动换行
    35             transFormer.setOutputProperty(OutputKeys.INDENT, "yes"); 
    36             //设置编码方式,默认UTF-8
    37             //transFormer.setOutputProperty(OutputKeys.ENCODING, "GB2312");  
    38             //文件源
    39             DOMSource domSource = new DOMSource(doc);
    40             
    41             File file = new File("src/doc-write.xml");
    42             if (file.exists()) {
    43                 file.delete();
    44             }
    45             file.createNewFile();
    46             //输出文件流
    47             FileOutputStream out = new FileOutputStream(file);
    48             
    49             //结果流
    50             StreamResult xmlResult = new StreamResult(out);
    51             //转化
    52             transFormer.transform(domSource, xmlResult);
    53             
    54             System.out.println("创建生成文件位置===========" + file.getAbsolutePath());
    55         } catch (Exception e) {
    56             e.printStackTrace();
    57         } 
    58     }

      输出:创建生成文件位置===========D:workspace est-xmlsrcdoc-write.xml

      doc-write.xml的内容:

      

    XML解析

      需要在src目录中,先存放一个test.xml文件

      

     1 <?xml version="1.0" encoding="UTF-8"?>  
     2 <conpany name="hd">  
     3     <department name="department1">  
     4         <employee name="employee1" id="1">123</employee>  
     5     </department>  
     6     <department name="department2">  
     7         <employee name="employee2" id="2">321</employee>    
     8         <employee name="employee3" id="3"></employee>    
     9     </department>  
    10     <department name="department3">  
    11     </department>  
    12 </conpany> 

      新建一个TestDom的java类,里面写一个read方法,代码如下:

      

     1     public static void read() {
     2 
     3         DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
     4         try {
     5             DocumentBuilder builder = builderFactory.newDocumentBuilder();
     6             //输入流
     7             InputStream is = TestDom.class.getClassLoader().getResourceAsStream("test.xml");
     8             //文档构建器解析,得到文档
     9             Document doc = builder.parse(is);
    10             
    11             //获取根目录,元素
    12             Element root = doc.getDocumentElement();
    13             if (root == null)     return;
    14             
    15             //获取元素名字
    16             System.out.print(root.getNodeName());
    17             //获取元素属性name的值
    18             System.out.println("	" + root.getAttribute("name"));
    19 
    20             //获取根元素下的子节点,此方法获取节点(节点包括:标签间的文本,和空白部分)
    21             NodeList departmentNodes = root.getChildNodes();
    22             if (departmentNodes == null)     return;
    23             
    24             //遍历节点
    25             for (int i = 0; i < departmentNodes.getLength(); i++) {
    26 
    27                 Node department = departmentNodes.item(i);
    28                 if (department != null && department.getNodeType() == Node.ELEMENT_NODE) {//非空白文本标签
    29                     
    30                     //获取节点名字
    31                     System.out.print("	" + department.getNodeName());
    32                     //先获取节点属性集,再获取属性name的值
    33                     System.out.println("	" + department.getAttributes().getNamedItem("name").getNodeValue());
    34                     
    35                     //获取节点下面的所有子节点
    36                     NodeList employees = department.getChildNodes();
    37                     if (employees == null) continue;
    38                     
    39                     for (int j = 0; j < employees.getLength(); j++) {
    40 
    41                         Node employee = employees.item(j);
    42                         if (employee != null && employee.getNodeType() == Node.ELEMENT_NODE) {
    43 
    44                             System.out.print("	" + "	" + employee.getNodeName());
    45                             System.out.print("	" + employee.getAttributes().getNamedItem("id").getNodeValue());
    46                             System.out.print("	" + employee.getAttributes().getNamedItem("name").getNodeValue());
    47                             System.out.println("	" + employee.getTextContent().trim());
    48 
    49                         }
    50                     }
    51                 }
    52             }
    53 
    54         } catch (Exception e) {
    55 
    56             e.printStackTrace();
    57         }
    58 
    59     }

    XML修改

      新建一个TestDom的java类,里面写一个update方法,代码如下:

      

     1     public static void update() {
     2         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
     3         try {
     4             DocumentBuilder builder = dbf.newDocumentBuilder();
     5             InputStream is = TestDom.class.getClassLoader().getResourceAsStream("test.xml");
     6             Document doc = builder.parse(is);
     7             Element root = doc.getDocumentElement();
     8             if (root == null) return;
     9             
    10             // 修改属性
    11             root.setAttribute("name", "hd2");
    12             NodeList departmentNodes = root.getChildNodes();
    13             if (departmentNodes != null) {
    14                 for (int i = 0; i < departmentNodes.getLength() - 1; i++) {
    15                     
    16                     Node department = departmentNodes.item(i);
    17                     if (department.getNodeType() == Node.ELEMENT_NODE) {
    18                         String departmentName = department.getAttributes().getNamedItem("name").getNodeValue();
    19                         if ("department3".equals(departmentName)) {
    20                             
    21                             // 删除节点
    22                             root.removeChild(department);
    23                         } else if ("department2".equals(departmentName)) {
    24                             
    25                             //新增节点
    26                             Element newChild = doc.createElement("employee");
    27                             newChild.setAttribute("name", "employee4");
    28                             newChild.setTextContent("44444");
    29                             department.appendChild(newChild);
    30                         }
    31                     }
    32                 }
    33             }
    34 
    35             TransformerFactory transFactory = TransformerFactory.newInstance();
    36             Transformer transFormer = transFactory.newTransformer();
    37             transFormer.setOutputProperty(OutputKeys.INDENT, "yes"); 
    38             DOMSource domSource = new DOMSource(doc);
    39             
    40             File file = new File("src/dom-test.xml");
    41             if (file.exists()) {
    42                 file.delete();
    43             }
    44             file.createNewFile();
    45             
    46             FileOutputStream out = new FileOutputStream(file);
    47             StreamResult xmlResult = new StreamResult(out);
    48             transFormer.transform(domSource, xmlResult);
    49             
    50             System.out.println("修改生成文件位置===========" + file.getAbsolutePath());
    51         } catch (Exception e) {
    52             e.printStackTrace();
    53         }
    54     }
    55             
    56 }

       输出:修改生成文件位置===========D:workspace est-xmlsrcdom-test.xml

      doc-test.xml的内容:

      

  • 相关阅读:
    Linux/UNIX线程(1)
    jeecms 链接标签
    JEECMS 系统权限设计
    jeecms 前台拦截器的研究与改造
    jeecms系统_自定义对象流程
    jeecms技术预研
    jeecms获取绝对路径
    JEECMS自定义标签
    jeecms项目相关配置文件
    [jeecms]获取父栏目下的子栏目名称
  • 原文地址:https://www.cnblogs.com/h--d/p/5970317.html
Copyright © 2020-2023  润新知