zoukankan      html  css  js  c++  java
  • DOM解析xml

    DOM的全称是Document Object Model,即文档对象模型。在应用程序中,基于DOM的XML解析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序正是通过对这个对象模型的操作,来实现对XML文档数据的操作。通过DOM接口,应用程序可以在任何时候访问XML文档中的任何一部分数据,因此,这种利用DOM接口的机制也被称作随机访问机制。

    DOM树所提供的随机访问方式给应用程序的开发带来了很大的灵活性,它可以任意地控制整个XML文档中的内容。然而,由于DOM分析器把整个XML文档转化成DOM树放在了内存中,因此,当文档比较大或者结构比较复杂时,对内存的需求就比较高。而且,对于结构复杂的树的遍历也是一项耗时的操作。所以,DOM分析器对机器性能的要求比较高,实现效率不十分理想。不过,由于DOM分析器所采用的树结构的思想与XML文档的结构相吻合,同时鉴于随机访问所带来的方便,因此,DOM分析器还是有很广泛的使用价值的。

    xml

    <?xml version="1.0" encoding="UTF-8"?>
    <exam>
    	<student examid="222">
    		<name>张三</name>
    		<location>沈阳</location>
    		<grade>89</grade>
    	</student>
    
    	<student idcard="333">
    		<name>李四</name>
    
    		<location>大连</location>
    		<grade>110</grade>
    	</student>
    
    </exam>
    

      

    实例:

      1 package com.bcrj.dom;
      2 
      3 import javax.xml.parsers.DocumentBuilder;
      4 import javax.xml.parsers.DocumentBuilderFactory;
      5 import javax.xml.parsers.ParserConfigurationException;
      6 import javax.xml.transform.Transformer;
      7 import javax.xml.transform.TransformerConfigurationException;
      8 import javax.xml.transform.TransformerException;
      9 import javax.xml.transform.TransformerFactory;
     10 import javax.xml.transform.dom.DOMSource;
     11 import javax.xml.transform.stream.StreamResult;
     12 
     13 import org.w3c.dom.Document;
     14 import org.w3c.dom.Element;
     15 import org.w3c.dom.Node;
     16 import org.w3c.dom.NodeList;
     17 
     18 public class Test1 {
     19     DocumentBuilderFactory dbf = null;
     20     DocumentBuilder db = null;
     21     private Document document = null;
     22 
     23     public Document getDocument() {
     24         return document;
     25     }
     26 
     27     public void setDocument(Document document) {
     28         this.document = document;
     29     }
     30 
     31     // 1、得到某个具体的节点内容,第一个student的location
     32     public String test1() {
     33         NodeList nl = document.getElementsByTagName("location");
     34         int index = 0;
     35         for (int i = 0; i < nl.getLength(); i++) {
     36             Node node = nl.item(i);
     37             String nodeName = node.getNodeName();
     38             if ("location".equals(nodeName)) {
     39                 index++;
     40             }
     41             if (index == 1) {
     42                 return node.getTextContent();
     43             }
     44         }
     45         return null;
     46     }
     47 
     48     // 2、遍历所有元素节点
     49     public void test2(Node node) {
     50         if (node instanceof Element) {
     51             System.out.println(node.getNodeName());
     52         }
     53         NodeList nl = node.getChildNodes();
     54         int len = nl.getLength();
     55         for (int i = 0; i < len; i++) {
     56             Node n = nl.item(i);
     57             test2(n);
     58         }
     59     }
     60 
     61     // 3、修改某个元素节点的主体内容,把第二个studnent的grade改为100
     62     public void test3() throws TransformerException {
     63         // 根元素
     64         int index = 0;
     65         Node n = document.getFirstChild();
     66         NodeList nl = n.getChildNodes();
     67         int len = nl.getLength();
     68 
     69         for (int i = 0; i < nl.getLength(); i++) {
     70             if (nl.item(i) instanceof Element) {
     71                 index++;
     72                 if (index == 2) {
     73                     NodeList nodelist = nl.item(i).getChildNodes();
     74                     for (int j = 0; j < nodelist.getLength(); j++) {
     75                         Node node = nodelist.item(j);
     76                         if (node instanceof Element) {
     77                             if (node.getNodeName().equals("grade")) {
     78                                 node.setTextContent("110");
     79                             }
     80                         }
     81                     }
     82                 }
     83             }
     84         }
     85         TransformerFactory facotry = TransformerFactory.newInstance();
     86         Transformer ts = facotry.newTransformer();
     87         ts.transform(new DOMSource(document), new StreamResult(
     88                 "src/students.xml"));
     89     }
     90 
     91     // 4、向指定元素节点中增加子元素节点,第一student中增加子元素<age>23</age>
     92     public void test4() throws TransformerException {
     93         NodeList nl = document.getElementsByTagName("student");
     94         Element element = document.createElement("age");
     95         element.setTextContent("23");
     96         nl.item(0).appendChild(element);
     97         // 写入xml
     98         TransformerFactory facotry = TransformerFactory.newInstance();
     99         Transformer ts = facotry.newTransformer();
    100         ts.transform(new DOMSource(document), new StreamResult(
    101                 "src/students.xml"));
    102     }
    103 
    104     // 5、向指定元素节点上增加同级元素节点,在第二个student的location后添加<age>23</age>
    105     public void test5() throws Exception {
    106         NodeList nl = document.getElementsByTagName("student");
    107         Element element = document.createElement("age");
    108         element.setTextContent("23");
    109 
    110         NodeList nll = nl.item(1).getChildNodes();
    111         for (int i = 0; i < nll.getLength(); i++) {
    112 
    113             if ((nll.item(i) instanceof Element)
    114                     && "location".equals(nll.item(i).getNodeName())) {
    115                 nll.item(i).getParentNode().insertBefore(element, nll.item(i));
    116             }
    117         }
    118         TransformerFactory facotry = TransformerFactory.newInstance();
    119         Transformer ts = facotry.newTransformer();
    120         ts.transform(new DOMSource(document), new StreamResult(
    121                 "src/students.xml"));
    122     }
    123 
    124     // 6、删除指定元素节点,删除第二个student元素的age子元素
    125     public void test6() throws Exception {
    126         NodeList nl = document.getElementsByTagName("student");
    127         NodeList nll = nl.item(1).getChildNodes();
    128         for (int i = 0; i < nll.getLength(); i++) {
    129             if ((nll.item(i) instanceof Element)
    130                     && "age".equals(nll.item(i).getNodeName())) {
    131                 //由父元素调用删除
    132                 nll.item(i).getParentNode().removeChild(nll.item(i));
    133             }
    134         }
    135 
    136         TransformerFactory facotry = TransformerFactory.newInstance();
    137         Transformer ts = facotry.newTransformer();
    138         ts.transform(new DOMSource(document), new StreamResult(
    139                 "src/students.xml"));
    140     }
    141 
    142     // 7、操作XML文件属性,打印第一学生的examid
    143     public void test7(){
    144         NodeList nl = document.getElementsByTagName("student");
    145         Element nll = (Element)nl.item(0);
    146         String examid = nll.getAttribute("examid");
    147         System.out.println(examid);
    148         
    149     }
    150     
    151     // 8、添加一个idcard属性给第二student
    152     public void test8() throws Exception{
    153         NodeList nl = document.getElementsByTagName("student");
    154         Element nll = (Element)nl.item(1);
    155         nll.setAttribute("idcard", "333");
    156 
    157         TransformerFactory facotry = TransformerFactory.newInstance();
    158         Transformer ts = facotry.newTransformer();
    159         ts.transform(new DOMSource(document), new StreamResult(
    160                 "src/students.xml"));
    161     }
    162     
    163     //9.删除第一个student的idcard
    164     public void test9() throws Exception{
    165         NodeList nl = document.getElementsByTagName("student");
    166         Element nll = (Element)nl.item(0);
    167         nll.removeAttribute("idcard");
    168         
    169         TransformerFactory facotry = TransformerFactory.newInstance();
    170         Transformer ts = facotry.newTransformer();
    171         ts.transform(new DOMSource(document), new StreamResult(
    172                 "src/students.xml"));
    173     }
    174     
    175     // Document 对象的一个新实例来生成一个 DOM 树
    176     public Document getDomParser() throws Exception {
    177         // DOM解析工厂
    178         dbf = DocumentBuilderFactory.newInstance();
    179         // DOM对象数解析器
    180         db = dbf.newDocumentBuilder();
    181         // 获取 DOM Document 对象的一个新实例来生成一个 DOM 树
    182         document = db.parse("src/students.xml");
    183         return document;
    184     }
    185 
    186 }

    单元测试

     1 package com.bcrj.test;
     2 
     3 import static org.junit.Assert.*;
     4 
     5 import javax.xml.transform.TransformerException;
     6 
     7 import org.junit.Assert;
     8 import org.junit.Before;
     9 import org.junit.BeforeClass;
    10 import org.junit.Test;
    11 import org.w3c.dom.Document;
    12 
    13 import com.bcrj.dom.Test1;
    14 
    15 public class Domtest {
    16     
    17     static Test1 test = null;
    18     
    19     @BeforeClass
    20     public static  void a(){
    21         test= new Test1();
    22     }
    23     
    24     @Before
    25     public void  setUp() throws Exception {
    26         test.getDomParser();
    27         
    28     }
    29 
    30 //    @Test
    31 //    public void testTest1() {
    32 //        String str = test.test1();
    33 //        Assert.assertEquals("沈阳", str);
    34 //    }
    35     
    36 //    @Test
    37 //    public void testTest2(){
    38 //        Document document = test.getDocument();
    39 //        test.test2(document);
    40 //    }
    41 //    
    42 //    @Test
    43 //    public void testTest3() throws TransformerException {
    44 //         test.test3();
    45 //        //Assert.assertEquals("沈阳", str);
    46 //    }
    47 //    
    48 //    @Test
    49 //    public void testTest4() throws TransformerException {
    50 //         test.test4();
    51 //        //Assert.assertEquals("沈阳", str);
    52 //    }
    53     
    54 //    @Test
    55 //    public void testTest4() throws Exception {
    56 //         test.test5();
    57 //        //Assert.assertEquals("沈阳", str);
    58 //    }
    59     
    60     @Test
    61     public void testTest4() throws Exception {
    62          test.test9();
    63         //Assert.assertEquals("沈阳", str);
    64     }
    65 
    66 }
  • 相关阅读:
    02 re模块
    24 内置模块re 正则表达式
    pickle 模块
    json模块
    命名元组
    os模块
    24 内置函数 命名元组(namedtuple) ,os ,sys,序列化,pickle,json
    functools
    ccc 音乐播放
    ccc prefab
  • 原文地址:https://www.cnblogs.com/dapeng520/p/3658794.html
Copyright © 2011-2022 走看看