XML的編程

 

 

XML的編程 (CRUD)

CRUD代表的是--------增刪改查

Xml編程的作用之一:在web中寫配置文件,對文件進行解析

       1、XML解析技術

        (1)XML解析方式分爲兩種:      Sax 和dom

                 (1)這兩種標準並不是針對java,在各種語言環境下都可以實現

(2)dom:(Document Object Model, 即文檔對象模型) 是 W3C 組織推薦的處理 XML 的一種方式。

實現原理:把整個xml文檔一次性讀取出來,放到一個樹形結構裏,在需要的時候,查找特定節點,然後對節點進行讀取和寫。它的主要優勢是實現簡單,讀寫平衡,缺點是比較佔內存,因爲他要把整個xml文檔都讀入內存,文件越大,這種缺點就越明顯。

(3)(Simple API for XML) 不是官方標準,但它是 XML 社區事實上的標準,幾乎所有的 XML 解析器都支持它。

         實現方法:在xml文檔中查找特定條件的內容,只提取需要的內容       

                                   缺點:只能寫      

                (4)Xml解析器:  用開發工具包來創建解析器

                             Crimson、Xerces 、Aelfred2

                (5)Xml開發工具包

                (6)Jaxp開發包

                             Jaxp、Jdom、dom4j

 

(2)JAXP 開發包是J2SE的一部分,它由javax.xml、org.w3c.dom 、org.xml.sax 包及其子包組成

            在 javax.xml.parsers 包中,定義了幾個工廠類,程序員調用這些工廠類,可以得到對xml文檔進行解析的 DOM 或 SAX 的解析器對象

 

使用JAXP進行DOM解析

                  方法爲:javax.xml.parsers 包中的DocumentBuilderFactory用於創建DOM模式的解析器對象 , DocumentBuilderFactory是一個抽象工廠類,它不能直接實例化,但該類提供了一個newInstance方法 ,這個方法會根據本地平臺默認安裝的解析器,自動創建一個工廠的對象並返回。

獲得JAXP中的DOM解析器

        (1)調用 DocumentBuilderFactory.newInstance() 方法得到創建 DOM 解析器的工廠。

(2)調用工廠對象的 newDocumentBuilder方法得到 DOM 解析器對象。

(3)調用 DOM 解析器對象的 parse() 方法解析 XML 文檔,得到代表整個文檔的 Document 對象,進行可以利用DOM特性對整個XML文檔進行操作了。

 

DOM編程

l            DOM模型(document object model)

DOM解析器在解析XML文檔時,會把文檔中的所有元素,按照其出現的層次關係,解析成一個個Node對象(節點)。

在dom中,節點之間關係如下:

位於一個節點之上的節點是該節點的父節點(parent)

一個節點之下的節點是該節點的子節點(children)

同一層次,具有相同父節點的節點是兄弟節點(sibling)

一個節點的下一個層次的節點集合是節點後代(descendant)

父、祖父節點及所有位於節點上面的,都是節點的祖先(ancestor)

l    Node對象

Node對象提供了一系列常量來代表結點的類型,當開發人員獲得某個Node類型後,就可以把Node節點轉換成相應的節點對象(Node的子類對象),以便於調用其特有的方法。(查看API文檔)

Node對象提供了相應的方法去獲得它的父結點或子結點。編程人員通過這些方法就可以讀取整個XML文檔的內容、或添加、修改、刪除XML文檔的內容了。

 

2、編寫java程序dom方法完成xml文檔的解析

通過javax.xml.parsers 包下的類來完成解析器的創建

                   DocumentBuilder的對象dom解析器,通過對於的工程類來創建

DocumentBuilderFactory是抽象的類

在工廠中用newinstance()方法來得到dom解析器的工廠類  

              SAXParser的對象是sax解析器 ,通過對於的工程類來創建

 

在xml文檔中的所有內容都可以被當成節點處理

       在Node節點類型定義了所有的節點的共性,在Node中的屬性是nodeName,nodeType,noValues,在用下面的這三個方法去調用之後,就把他們封裝成Node對象,根據Node中的屬性一一對應,如果節點是一個元素,則nodeValue則爲null

 

GetNodeName()  節點的名稱

getNodeType()  節點的類型

getNodeVaule()  節點的值

 

    Element是元素節點  1代表元素節點

    Text 文本節點  在xml中空白處是文本節點  3代表文本節點

     Attr爲屬性節點  

    

     例子:解析dom文檔

              // (1)生成工廠類的對象

       DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

       // (2)生成解析器

       DocumentBuilder db = factory.newDocumentBuilder();

       // (3)對xml文檔進行解析,指定要讀取的文件並賦值給Document的對象

       Document doc = db.parse(new File("src/Book.xml"));

    // 解析出的doc對象裏面所有內容,在xml文檔中的所有內容都可以別當成節點處理

    // (4)讀取book.xml文檔中有幾個節點?節點的名稱?節點的類型及節點的值

       Node root = doc.getChildNodes().item(0);// 查找根節點

       System.out.println(root.getNodeName() + "---" +root.getNodeType()+ "---" + root.getNodeValue());

 

 

// 查找所有根節點的子節點

    public static void findChildren(Document doc) {

       // 先通過文檔對象node得到根節點對象,通過根節點

       // Node root = node.getChildNodes().item(0);//得到根節點

       // 通過標籤名字查找元素,得到的是節點列表

       Node root = doc.getElementsByTagName("書架").item(0);

 

       // 通過根節點root對象得到根節點所有的子節點,返回一個節點集合

       NodeList list = root.getChildNodes();

       System.out.println("根節點下的所有子節點個數" + list.getLength());

       // item()返回集合中的第 index 個項。

       for (int i = 0;i < list.getLength();i++) {

           Node n = list.item(i);

           System.out.println(n.getNodeName() + "-----" + n.getNodeType()

                  + "----" + n.getNodeValue());

       }

    }

 

// 查找所有根節點的元素節點

    public static void findElementChildren(Document doc) {

       // 先通過文檔對象doc得到根節點對象,通過根節點

       Node root = doc.getElementsByTagName("書架").item(0);

 

       // 通過根節點root對象得到根節點所有的子節點,返回一個節點集合

       NodeList list = root.getChildNodes();

       System.out.println("根節點下的所有子節點個數" + list.getLength());

       boolean flag = false;

       int count = 0;

       for (int i = 0; i < list.getLength(); i++) {

           Node n = list.item(i);

           // 判斷如果是元素節點      ELEMENT_NODE表示 該節點爲 Element。

           if (n.getNodeType() == Node.ELEMENT_NODE) {

              System.out.println(n.getNodeName() + "-----" + n.getNodeType()

                     + "----" + n.getNodeValue());

              count++;

              flag = true;

           }

       }

       System.out.println("元素的節點共" + count);

    }

 

    // 查找固定值的書的元素的第二個子節點

    public static void findFixedChildren(Node node) {

       NodeList list = node.getChildNodes();

       int count = 0;

       for (int i = 0; i < list.getLength(); i++) {

           boolean flag = false;

           Node n1 = list.item(i);

           if (n1.getNodeName().equals("圖書")) {

              flag = true;

              count++;

           }

           if (flag && count == 2) {

              // 得到n1節點的所有子節點,輸出

              NodeList list1 = n1.getChildNodes();

              for (int j = 0; j < list.getLength(); j++) {

                  Node n = list1.item(j);

                  System.out.println(n.getNodeName() + "-----"

                         + n.getNodeType() + "----" + n.getNodeValue());

              }

           }

       }

    }

 

// 屬性的遍歷

    public static void findAttiutes(Node node) {

       // 所有屬性的集合

       NamedNodeMap map = node.getAttributes();

       if (map != null) {

           for (int i = 0; i < map.getLength(); i++) {

              // 屬性節點

              Node d = map.item(i);

              System.out.println(d.getNodeName() + "---" + d.getNodeType()

                     + "----" + d.getNodeValue());

           }

       }

    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章