天天看點

XML - JAXP技術 - DOM解析

DOM解析的基本思路:

    1、将整個XML檔案一次性讀入記憶體

    2、将整個XML看做一棵樹

    3、XML中的每一個标簽,屬性,文本都看做是樹上的一個結點

    4、然後可以對結點進行增删改查的操作

  話不多說,上代碼下載下傳。

  

  1、首先我在D:\ABC中建立了一個文本檔案,重命名為stus.xml,以下是檔案中的内容

    <?xml version = "1.0" encoding = "GBK" ?>

    <stus class = "S160401A">

    <stu num = "001" >

    <name>張三</name>

    <age>20</age>

    <sex>男</sex>

    </stu>

    <stu num = "002">

    <name>李四</name>

    <age>21</age>

    <sex>女</sex>

    <stu num = "003">

    <name>王五</name>

    <age>22</age>

    </stus>

    在第一行是XML聲明<?xml version="1.0" encoding="GBK"  ?>,version表示版本号,encoding表示編碼方式,微軟的記事本用的是國标的編碼方式,如果要用UTF-8,則要在另存為視窗中修改編碼方式為UTF-8。下載下傳

    

XML - JAXP技術 - DOM解析

     必須且隻能有一對根标簽,我寫的根标簽是<stus></stus>。其他的就不多說了。

  2、這是一個學生類,定義了一些屬性和get、set方法

Java代碼  下載下傳

  1. <span style="font-size: 16px;">public class Student {  
  2.     public static String Class;  
  3.     private String name;  
  4.     private int num;  
  5.     private int age;  
  6.     private char sex;  
  7.     public String getName() {  
  8.         return name;  
  9.     }  
  10.     public void setName(String name) {  
  11.         this.name = name;  
  12.     public int getNum() {  
  13.         return num;  
  14.     public void setNum(int num) {  
  15.         this.num = num;  
  16.     public int getAge() {  
  17.         return age;  
  18.     public void setAge(int age) {  
  19.         this.age = age;  
  20.     public char getSex() {  
  21.         return sex;  
  22.     public void setSex(char sex) {  
  23.         this.sex = sex;  
  24. }</span>  

  3、這是用DOM解析的類,看這個類之前還要了解一下。下載下傳

    DocumentBuilderFactory DOM解析器工廠

    DocumentBuilder DOM解析器

    Document 文檔對象

    Node 結點【接口】

    Element 元素結點【标簽結點】

    Attr 屬性結點

    Text 文本結點

    Node 是Document,Element,Attr,Text的父接口

    NodeList  結點清單

    NamedNodeMap 一個結點的所有屬性

  1. <span style="font-size: 16px;">import javax.xml.parsers.DocumentBuilder;  
  2. import javax.xml.parsers.DocumentBuilderFactory;  
  3. import org.w3c.dom.Attr;  
  4. import org.w3c.dom.Document;  
  5. import org.w3c.dom.Element;  
  6. import org.w3c.dom.NamedNodeMap;  
  7. import org.w3c.dom.Node;  
  8. import org.w3c.dom.NodeList;  
  9. import bean.Student;  
  10. public class DOMParser {  
  11.     public static void main(String[] args) throws Exception {  
  12.         // 得到解析器工廠對象  
  13.         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
  14.         // 生産一個解析器對象  
  15.         DocumentBuilder builder = factory.newDocumentBuilder();  
  16.         // 開始解析XML檔案,得到解析的結果,是一個Document對象  
  17.         // Document對象叫做文檔樹對象  
  18.         Document dom = builder.parse("D:\\ABC\\stus.xml");  
  19.         // 通過Document對象提取資料  
  20.         // Document對象的第一個子節點是根節點[根标簽]  
  21.         Node root = dom.getFirstChild();  
  22.         // 獲得标簽的名字  
  23.         String str = root.getNodeName();  
  24.         // 獲得根節點的屬性  
  25.         NamedNodeMap attrs = root.getAttributes();  
  26.         // 強轉成Attr類型 屬性類  
  27.         Attr attr = (Attr) attrs.getNamedItem("class");  
  28.         // 獲得屬性裡的值  
  29.         String v = attr.getValue();  
  30.         System.out.println(v);  
  31.         // 獲得所有的學生-------------------------------------  
  32.         NodeList list = root.getChildNodes();  
  33.         for (int i = 0; i < list.getLength(); i++) {  
  34.             Node node = list.item(i);  
  35.             // 判斷是否是标簽結點  
  36.             if (node instanceof Element) {  
  37.                 Element e = (Element) node;  
  38.                 // 獲得标簽結點裡屬性的值  
  39.                 String num = e.getAttribute("num");  
  40.                 System.out.println(num);  
  41.                 // 輸出标簽中的文本  
  42.                 // System.out.println(e.getTextContent());  
  43.                 // 繼續獲得stu的子節點  
  44.                 NodeList nodeList = e.getChildNodes();  
  45.                 for (int j = 0; j < nodeList.getLength(); j++) {  
  46.                     Node n = nodeList.item(j);  
  47.                     if (n instanceof Element) {  
  48.                         Element ele = (Element) n;  
  49.                         // 獲得元素結點的标簽名字  
  50.                         String nodeName = ele.getNodeName();  
  51.                         // 獲得元素結點标簽中的文本  
  52.                         String value = ele.getTextContent();  
  53.                         if (nodeName.equals("name")) {  
  54.                             System.out.println("姓名:" + value);  
  55.                         } else if (nodeName.equals("age")) {  
  56.                             System.out.println("年齡:" + value);  
  57.                         } else if (nodeName.equals("sex")) {  
  58.                             System.out.println("性别:" + value);  
  59.                         }  
  60.                     }  
  61.                 }  
  62.             }  
  63.         }  

  自己在其中總結了一些方法:下載下傳

  DocumentBuilderFactory類:

    public static DocumentBuilderFactory newInstance(); //得到解析器工廠對象

    public abstract DocumentBuilder newDocumentBuilder(); //生産一個解析器對象

  DocumentBuilder類:

    public Document parse(String uri); //解析路徑為uri的XML檔案,得到解析的結果是一個Document對象

  Node類:下載下傳

    public Node getFirstChild(); //得到Document對象的第一個子結點,也就是根結點、或者叫根标簽,在上面的代碼中得到的是stus,看上面的第1點中的XML檔案的内容。

    public NamedNodeMap getAttributes();//獲得結點的屬性

    public NodeList getChildNodes();//獲得所有子結點

    public String getNodeName();//獲得标簽的名字 

    public String getTextContent() throws DOMException;//獲得标簽結點中的文本

  NamedNodeMap類:    

    public Node getNamedItem(String name);//傳回所有名字為name的結點

  Attr類:

    public String getValue();//獲得屬性裡的值

  NodeList類:

    public Node item(int index);//傳回第index個結點

繼續閱讀