XML生成和解析

一.動態生成XML

1.使用Document動態生產XML

創建Document

    1.實例化Document工廠:DocumentBuilderFactory

    2.實例化Document構造器:DocumentBuilder

    3.實例化Document:Document

    4.創建標籤:document.createElement();

    5.創建屬性:document.createAttribute();

    6.建立關係:appendChild();

將Document保存到本地XML中

    1.實例化轉換器工廠:TransFormerFactory

    2.實例化轉化器:Transformer

    3.設置來源:Source:DOMSource

    4.設置目的地:Result:StreamResult

    5.轉換:transform();


代碼實現

/**
 * 創建XML 使用Document
 * @author Cookie
 *
 */
public class TestCreateXMlByDocument {
    public static void main(String[] args) {
        try {
            //1.實例化DocumentBuilderFactory
            DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
            //2.通過dbf獲取DocumentBuilder
            DocumentBuilder db=dbf.newDocumentBuilder();
            //3.創建Document
            Document document=db.newDocument();
            
            //4.創建標籤<persons>
            Element elementPersons=document.createElement("persons");
            //創建<person>
            Element elementPerson=document.createElement("person");
            //創建<page>
            Element elementPage=document.createElement("page");
            //給標籤設值
            elementPage.setTextContent("22");
            //創建<psex>
            Element elementPsex=document.createElement("psex");
            elementPsex.setTextContent("男");
            
            //5.創建屬性
            Attr attrPid=document.createAttribute("pid");
            //給屬性設值
            attrPid.setValue("1");
            Attr attrPname=document.createAttribute("pname");
            attrPname.setValue("hug");
            
            //6.建立關係
            document.appendChild(elementPersons);
            elementPersons.appendChild(elementPerson);
            elementPerson.appendChild(elementPage);
            elementPerson.appendChild(elementPsex);
            elementPerson.setAttributeNode(attrPid);
            elementPerson.setAttributeNode(attrPname);
            
            System.out.println("創建OK");
            
            
            //將生成的Document保存到XML文件中
            //1.實例化轉換器工廠
            TransformerFactory tff=TransformerFactory.newInstance();
            //2.通過tff獲取轉換器
            Transformer transformer=tff.newTransformer();
            
            //來源
            DOMSource source=new DOMSource(document);
            //結果
            StreamResult streamResult=new StreamResult(new File("my.xml"));
            
            //3.開始轉換
            transformer.transform(source, streamResult);
            
            System.out.println("保存成功");
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (TransformerConfigurationException e) {
            e.printStackTrace();
        } catch (TransformerException e) {
            e.printStackTrace();
        }
    }
}




2.dom4j

創建Document

    1.使用DocumentHelper創建Document

    2.添加標籤:addElement(“標籤名”);

    3.添加屬性:addAttribute(“屬性名”,“屬性值”);

將Document保存到本地XML中

    1.實例化輸出格式:OutputFormat.createPrettyPrint()

    2.指定輸出文件路徑:XMLWriter


3.直接將對象集合,使用c標籤展示到XML文件中

    1.將對象集合保存到請求域中

    2.在jsp頁面,使用C標籤編譯對象集合


二.XML解析

1.DOM(Document Object Model 文檔對象模型)解析

   1.實例化Document工廠:DocumentBuilderFactory

   2.實例化Document構造器:DocumentBuilder

   3.通過構造器讀取數據(解析數據):parse()

   4.得到根節點:getDocumentElement()

   5.得到根節點下面的所有子節點(NodeList):getChildNodes()

   6.遍歷所有的子節點,得到某一個子節點item()

   7.得到屬性的值:getAttribute(“屬性名”)

   8.判斷是否是標籤:node.getNodeType==Node.ELEMNT_NODE

   9.得到標籤內容:getTextContent()


2.Dom4j解析(Jaxp,JDOM)

   1.實例化SAX讀取器:SAXReader

   2.讀取:read()

   3.得到根節點:getRootElement()


3.SAX解析(XML:Simple API for XML)

   1.實例化SAX解析器工廠:SAXParserFactory

   2.實例化SAX解析器:SAXParser

   3.開始解析:parse()方法


4.DOM 和 SAX 解析區別:

   1.DOM解析佔用內存比較大,但是方便對XML進行CRUD(增刪查改)

   2.SAX優點是佔用內存小,解析速度快,缺點只適合做文檔讀取,不適合做CRUD


代碼實現XML解析

package com.zking.test;

import Java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/**
 * 使用DOM解析XML
 * @author Administrator
 *
 */
public class TestParseXMLByDOM {
    
    public static void main(String[] args) {
        try {
            //1.實實例化DocumentBuilderFactory
            DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
            //2.通過dbf獲取DocumentBuilder
            DocumentBuilder db=dbf.newDocumentBuilder();
            //3.解析
            Document document=db.parse(new File("students.xml"));
            //4.獲取跟節點<students>
            Element students=document.getDocumentElement();
            //5.獲取所有的<student>節點
           //第一種方法
             NodeList nodeList=students.getElementsByTagName("student");
            for (int i = 0; i < nodeList.getLength(); i++) {
                //node element
                Element student=(Element) nodeList.item(i);
                //獲取屬性
                String sid=student.getAttribute("sid");
                String sname=student.getAttribute("sname");
                
                //獲取<student>下面的<sage><ssex>
                Element elementSage=(Element) student.getElementsByTagName("sage").item(0);
                Element elementSsex=(Element) student.getElementsByTagName("ssex").item(0);
                
                String sage=elementSage.getTextContent();
                String ssex=elementSsex.getTextContent();
                
                System.out.println(sid+" "+sname+" "+sage+" "+ssex);
               //第二種方法
                //獲取<student>下面的<sage><ssex>
                /*NodeList nodeListChild=student.getChildNodes();
                for (int j = 0; j < nodeListChild.getLength(); j++) {
                    Node node=nodeListChild.item(j);
                    if(node.getNodeType()==Node.ELEMENT_NODE){
                        Element element=(Element) nodeListChild.item(j);
                        //獲取標籤的名字
                        String elementName=element.getNodeName();
                        if("sage".equals(elementName)){
                            //獲取<sage>的值
                            String sage=element.getTextContent();
                            System.out.println("  "+sage);
                        }else if("ssex".equals(elementName)){
                            String ssex=element.getTextContent();
                            System.out.println("  "+ssex);
                        }
                    }
                }*/

            }
            
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}


三.XML的CRUD

1.使用DOM增刪查改

   添加(在某個節點之前插入):insertBefore()

   刪除:removeChild()

2.XPath(在XML文檔中查找信息的語言)

  得到Document:1.實例化SAX讀取器:SAXReader

                         2.讀取:read()

                         3.得到根節點:getRootElement()

  標籤:

          獲取所有:persons.selectNodes(“/persons/person”);

          取n個位置之後的:persons.selectNodes("/persons/person[position()>n]/pname");

          取a--b之間的:persons.selectNodes("/persons/person[position()>a and position()<b]/pname");

          取奇數位數據:persons.selectNodes("/persons/person[position() mod 2!=0]/pname");

          獲取第一個:persons.selectSingleNode("/persons/person[1]/pname");

          獲取最後一個:persons.selectSingleNode("/persons/person[last()]/pname");

          獲取第N個:persons.selectSingleNode("/persons/person[n]/pname");

   

  屬性:

         取所有的屬性值:persons.selectNodes("/persons/person/@屬性名");

         取某個屬性X的值爲Y的數據:persons.selectNodes("/persons/person[@x='y']/pname");

發佈了41 篇原創文章 · 獲贊 1 · 訪問量 6768
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章