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 }
  • 相关阅读:
    Delphi XE4 FireMonkey 开发 IOS APP 发布到 AppStore 最后一步.
    Native iOS Control Delphi XE4
    Delphi XE4 iAD Framework 支持.
    using IOS API with Delphi XE4
    GoF23种设计模式之行为型模式之命令模式
    Android青翼蝠王之ContentProvider
    Android白眉鹰王之BroadcastReceiver
    Android倚天剑之Notification之亮剑IOS
    Android紫衫龙王之Activity
    GoF23种设计模式之行为型模式之访问者模式
  • 原文地址:https://www.cnblogs.com/dapeng520/p/3658794.html
Copyright © 2011-2022 走看看